diff options
Diffstat (limited to '')
-rw-r--r-- | toolkit/actors/KeyPressEventModelCheckerChild.sys.mjs | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/toolkit/actors/KeyPressEventModelCheckerChild.sys.mjs b/toolkit/actors/KeyPressEventModelCheckerChild.sys.mjs new file mode 100644 index 0000000000..8b4fe82f17 --- /dev/null +++ b/toolkit/actors/KeyPressEventModelCheckerChild.sys.mjs @@ -0,0 +1,107 @@ +/* -*- mode: js; indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ts=2 sw=2 sts=2 et tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; + +export class KeyPressEventModelCheckerChild extends JSWindowActorChild { + // Currently, the event is dispatched only when the document becomes editable + // because of contenteditable. If you need to add new editor which is in + // designMode, you need to change MaybeDispatchCheckKeyPressEventModelEvent() + // of Document. + handleEvent(aEvent) { + if (!AppConstants.DEBUG) { + // Stop propagation in opt build to save the propagation cost. + // However, the event is necessary for running test_bug1514940.html. + // Therefore, we need to keep propagating it at least on debug build. + aEvent.stopImmediatePropagation(); + } + + // Currently, even if we set Document.KEYPRESS_EVENT_MODEL_CONFLATED + // here, conflated model isn't used forcibly. If you need it, you need + // to change WidgetKeyboardEvent, dom::KeyboardEvent and PresShell. + let model = Document.KEYPRESS_EVENT_MODEL_DEFAULT; + if ( + this._isOldOfficeOnlineServer(aEvent.target) || + this._isOldConfluence(aEvent.target.ownerGlobal) + ) { + model = Document.KEYPRESS_EVENT_MODEL_SPLIT; + } + aEvent.target.setKeyPressEventModel(model); + } + + _isOldOfficeOnlineServer(aDocument) { + let editingElement = aDocument.getElementById( + "WACViewPanel_EditingElement" + ); + // If it's not Office Online Server, don't include it into the telemetry + // because we just need to collect percentage of old version in all loaded + // Office Online Server instances. + if (!editingElement) { + return false; + } + let isOldVersion = !editingElement.classList.contains( + "WACViewPanel_DisableLegacyKeyCodeAndCharCode" + ); + Services.telemetry.keyedScalarAdd( + "dom.event.office_online_load_count", + isOldVersion ? "old" : "new", + 1 + ); + return isOldVersion; + } + + _isOldConfluence(aWindow) { + if (!aWindow) { + return false; + } + // aWindow should be an editor window in <iframe>. However, we don't know + // whether it can be without <iframe>. Anyway, there should be tinyMCE + // object in the parent window or in the window. + let tinyMCEObject; + // First, try to retrieve tinyMCE object from parent window. + try { + tinyMCEObject = ChromeUtils.waiveXrays(aWindow.parent).tinyMCE; + } catch (e) { + // Ignore the exception for now. + } + // Next, if there is no tinyMCE object in the parent window, let's check + // the window. + if (!tinyMCEObject) { + try { + tinyMCEObject = ChromeUtils.waiveXrays(aWindow).tinyMCE; + } catch (e) { + // Fallthrough to return false below. + } + // If we couldn't find tinyMCE object, let's assume that it's not + // Confluence instance. + if (!tinyMCEObject) { + return false; + } + } + // If there is tinyMCE object, we can assume that we loaded Confluence + // instance. So, let's check the version whether it allows conflated + // keypress event model. + try { + let { author, version } = + new tinyMCEObject.plugins.CursorTargetPlugin().getInfo(); + // If it's not Confluence, don't include it into the telemetry because + // we just need to collect percentage of old version in all loaded + // Confluence instances. + if (author !== "Atlassian") { + return false; + } + let isOldVersion = version === "1.0"; + Services.telemetry.keyedScalarAdd( + "dom.event.confluence_load_count", + isOldVersion ? "old" : "new", + 1 + ); + return isOldVersion; + } catch (e) { + return false; + } + } +} |