author | Ryan VanderMeulen <ryanvm@gmail.com> |
Mon, 25 May 2015 13:15:06 -0400 | |
changeset 245495 | cb33de12c0b5ff1461a78dd372718c9522e26cdd |
parent 245494 | 4b6aa5c0a1bffff2d78fdf73b03699a4c91d3d43 |
child 245496 | 80585eecc103786578611e35f97ff4bafa13a9ee |
push id | 28806 |
push user | philringnalda@gmail.com |
push date | Tue, 26 May 2015 02:10:16 +0000 |
treeherder | mozilla-central@4362d9251296 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
bugs | 1155493 |
milestone | 41.0a1 |
backs out | 3bd7adb9f591c5eb7b234085537a7f82ecd361f2 0380b1684e6b9f0c0cc20c27e30c32e0bd62657d 58b7c1eaf3c82d3c546bef8f85ee36222421da57 896beb5088a7085564f48cceb70ba664ef82acf0 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -345,17 +345,16 @@ var shell = { window.addEventListener('MozApplicationManifest', this); window.addEventListener('MozAfterPaint', this); window.addEventListener('sizemodechange', this); window.addEventListener('unload', this); this.contentBrowser.addEventListener('mozbrowserloadstart', this, true); this.contentBrowser.addEventListener('mozbrowserselectionstatechanged', this, true); this.contentBrowser.addEventListener('mozbrowserscrollviewchange', this, true); - this.contentBrowser.addEventListener('mozbrowsercaretstatechanged', this); CustomEventManager.init(); WebappsHelper.init(); UserAgentOverrides.init(); CaptivePortalLoginHelper.init(); this.contentBrowser.src = homeURL; this.isHomeLoaded = false; @@ -376,17 +375,16 @@ var shell = { window.removeEventListener('unload', this); window.removeEventListener('keydown', this, true); window.removeEventListener('keyup', this, true); window.removeEventListener('MozApplicationManifest', this); window.removeEventListener('sizemodechange', this); this.contentBrowser.removeEventListener('mozbrowserloadstart', this, true); this.contentBrowser.removeEventListener('mozbrowserselectionstatechanged', this, true); this.contentBrowser.removeEventListener('mozbrowserscrollviewchange', this, true); - this.contentBrowser.removeEventListener('mozbrowsercaretstatechanged', this); ppmm.removeMessageListener("content-handler", this); UserAgentOverrides.uninit(); }, // If this key event represents a hardware button which needs to be send as // a message, broadcasts it with the message set to 'xxx-button-press' or // 'xxx-button-release'. @@ -487,38 +485,16 @@ var shell = { data.offsetY = offsetY; DoCommandHelper.setEvent(evt); shell.sendChromeEvent({ type: 'selectionstatechanged', detail: data, }); break; - case 'mozbrowsercaretstatechanged': - { - let elt = evt.target; - let win = elt.ownerDocument.defaultView; - let offsetX = win.mozInnerScreenX - window.mozInnerScreenX; - let offsetY = win.mozInnerScreenY - window.mozInnerScreenY; - - let rect = elt.getBoundingClientRect(); - offsetX += rect.left; - offsetY += rect.top; - - let data = evt.detail; - data.offsetX = offsetX; - data.offsetY = offsetY; - data.sendDoCommandMsg = null; - - shell.sendChromeEvent({ - type: 'caretstatechanged', - detail: data, - }); - } - break; case 'MozApplicationManifest': try { if (!Services.prefs.getBoolPref('browser.cache.offline.enable')) return; let contentWindow = evt.originalTarget.defaultView; let documentElement = contentWindow.document.documentElement; @@ -737,20 +713,16 @@ var CustomEventManager = { case 'inputmethod-update-layouts': case 'inputregistry-add': case 'inputregistry-remove': KeyboardHelper.handleEvent(detail); break; case 'do-command': DoCommandHelper.handleEvent(detail.cmd); break; - case 'copypaste-do-command': - Services.obs.notifyObservers({ wrappedJSObject: shell.contentBrowser }, - 'ask-children-to-execute-copypaste-command', detail.cmd); - break; } } } let DoCommandHelper = { _event: null, setEvent: function docommand_setEvent(evt) { this._event = evt;
--- a/dom/browser-element/BrowserElementChild.js +++ b/dom/browser-element/BrowserElementChild.js @@ -29,25 +29,22 @@ function isTopBrowserElement(docShell) { if (docShell && docShell.isBrowserOrApp) { return false; } } return true; } if (!('BrowserElementIsPreloaded' in this)) { - if (isTopBrowserElement(docShell)) { - if (Services.prefs.getBoolPref("dom.mozInputMethod.enabled")) { - try { - Services.scriptloader.loadSubScript("chrome://global/content/forms.js"); - } catch (e) { - } + if (isTopBrowserElement(docShell) && + Services.prefs.getBoolPref("dom.mozInputMethod.enabled")) { + try { + Services.scriptloader.loadSubScript("chrome://global/content/forms.js"); + } catch (e) { } - - Services.scriptloader.loadSubScript("chrome://global/content/BrowserElementCopyPaste.js"); } if (Services.prefs.getIntPref("dom.w3c_touch_events.enabled") == 1) { if (docShell.asyncPanZoomEnabled === false) { Services.scriptloader.loadSubScript("chrome://global/content/BrowserElementPanningAPZDisabled.js"); ContentPanningAPZDisabled.init(); }
deleted file mode 100644 --- a/dom/browser-element/BrowserElementCopyPaste.js +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- / -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ -/* 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/. */ - -"use strict"; - -dump("###################################### BrowserElementCopyPaste.js loaded\n"); - -let CopyPasteAssistent = { - COMMAND_MAP: { - 'cut': 'cmd_cut', - 'copy': 'cmd_copyAndCollapseToEnd', - 'paste': 'cmd_paste', - 'selectall': 'cmd_selectAll' - }, - - init: function() { - addEventListener('mozcaretstatechanged', - this._caretStateChangedHandler.bind(this), - /* useCapture = */ true, - /* wantsUntrusted = */ false); - addMessageListener('browser-element-api:call', this._browserAPIHandler.bind(this)); - }, - - _browserAPIHandler: function(e) { - switch (e.data.msg_name) { - case 'copypaste-do-command': - if (this._isCommandEnabled(e.data.command)) { - docShell.doCommand(COMMAND_MAP[e.data.command]); - } - break; - } - }, - - _isCommandEnabled: function(cmd) { - let command = this.COMMAND_MAP[cmd]; - if (!command) { - return false; - } - - return docShell.isCommandEnabled(command); - }, - - _caretStateChangedHandler: function(e) { - e.stopPropagation(); - - let boundingClientRect = e.boundingClientRect; - let canPaste = this._isCommandEnabled("paste"); - let zoomFactor = content.innerWidth == 0 ? 1 : content.screen.width / content.innerWidth; - - let detail = { - rect: { - width: boundingClientRect ? boundingClientRect.width : 0, - height: boundingClientRect ? boundingClientRect.height : 0, - top: boundingClientRect ? boundingClientRect.top : 0, - bottom: boundingClientRect ? boundingClientRect.bottom : 0, - left: boundingClientRect ? boundingClientRect.left : 0, - right: boundingClientRect ? boundingClientRect.right : 0, - }, - commands: { - canSelectAll: this._isCommandEnabled("selectall"), - canCut: this._isCommandEnabled("cut"), - canCopy: this._isCommandEnabled("copy"), - canPaste: this._isCommandEnabled("paste"), - }, - zoomFactor: zoomFactor, - reason: e.reason, - collapsed: e.collapsed, - caretVisible: e.caretVisible, - selectionVisible: e.selectionVisible - }; - - // Get correct geometry information if we have nested iframe. - let currentWindow = e.target.defaultView; - while (currentWindow.realFrameElement) { - let currentRect = currentWindow.realFrameElement.getBoundingClientRect(); - detail.rect.top += currentRect.top; - detail.rect.bottom += currentRect.top; - detail.rect.left += currentRect.left; - detail.rect.right += currentRect.left; - currentWindow = currentWindow.realFrameElement.ownerDocument.defaultView; - } - - sendAsyncMsg('caretstatechanged', detail); - }, -}; - -CopyPasteAssistent.init();
--- a/dom/browser-element/BrowserElementParent.js +++ b/dom/browser-element/BrowserElementParent.js @@ -82,17 +82,16 @@ function BrowserElementParent() { this._domRequestReady = false; this._pendingAPICalls = []; this._pendingDOMRequests = {}; this._pendingSetInputMethodActive = []; this._nextPaintListeners = []; Services.obs.addObserver(this, 'oop-frameloader-crashed', /* ownsWeak = */ true); Services.obs.addObserver(this, 'copypaste-docommand', /* ownsWeak = */ true); - Services.obs.addObserver(this, 'ask-children-to-execute-copypaste-command', /* ownsWeak = */ true); } BrowserElementParent.prototype = { classDescription: "BrowserElementAPI implementation", classID: Components.ID("{9f171ac4-0939-4ef8-b360-3408aedc3060}"), contractID: "@mozilla.org/dom/browser-element-api;1", QueryInterface: XPCOMUtils.generateQI([Ci.nsIBrowserElementAPI, @@ -199,17 +198,16 @@ BrowserElementParent.prototype = { "entered-dom-fullscreen": this._enteredDomFullscreen, "fullscreen-origin-change": this._fullscreenOriginChange, "exited-dom-fullscreen": this._exitedDomFullscreen, "got-visible": this._gotDOMRequestResult, "visibilitychange": this._childVisibilityChange, "got-set-input-method-active": this._gotDOMRequestResult, "selectionstatechanged": this._handleSelectionStateChanged, "scrollviewchange": this._handleScrollViewChange, - "caretstatechanged": this._handleCaretStateChanged, }; let mmSecuritySensitiveCalls = { "showmodalprompt": this._handleShowModalPrompt, "contextmenu": this._fireCtxMenuEvent, "securitychange": this._fireEventFromMsg, "locationchange": this._fireEventFromMsg, "iconchange": this._fireEventFromMsg, @@ -435,44 +433,16 @@ BrowserElementParent.prototype = { }, _handleSelectionStateChanged: function(data) { let evt = this._createEvent('selectionstatechanged', data.json, /* cancelable = */ false); this._frameElement.dispatchEvent(evt); }, - // Called when state of accessible caret in child has changed. - // The fields of data is as following: - // - rect: Contains bounding rectangle of selection, Include width, height, - // top, bottom, left and right. - // - commands: Describe what commands can be executed in child. Include canSelectAll, - // canCut, canCopy and canPaste. For example: if we want to check if cut - // command is available, using following code, if (data.commands.canCut) {}. - // - zoomFactor: Current zoom factor in child frame. - // - reason: The reason causes the state changed. Include "visibilitychange", - // "updateposition", "longpressonemptycontent", "taponcaret", "presscaret", - // "releasecaret". - // - collapsed: Indicate current selection is collapsed or not. - // - caretVisible: Indicate the caret visiibility. - // - selectionVisible: Indicate current selection is visible or not. - _handleCaretStateChanged: function(data) { - let evt = this._createEvent('caretstatechanged', data.json, - /* cancelable = */ false); - - let self = this; - function sendDoCommandMsg(cmd) { - let data = { command: cmd }; - self._sendAsyncMsg('copypaste-do-command', data); - } - Cu.exportFunction(sendDoCommandMsg, evt.detail, { defineAs: 'sendDoCommandMsg' }); - - this._frameElement.dispatchEvent(evt); - }, - _handleScrollViewChange: function(data) { let evt = this._createEvent("scrollviewchange", data.json, /* cancelable = */ false); this._frameElement.dispatchEvent(evt); }, _createEvent: function(evtName, detail, cancelable) { // This will have to change if we ever want to send a CustomEvent with null @@ -1004,21 +974,16 @@ BrowserElementParent.prototype = { this._fireFatalError(); } break; case 'copypaste-docommand': if (this._isAlive() && this._frameElement.isEqualNode(subject.wrappedJSObject)) { this._sendAsyncMsg('do-command', { command: data }); } break; - case 'ask-children-to-execute-copypaste-command': - if (this._isAlive() && this._frameElement == subject.wrappedJSObject) { - this._sendAsyncMsg('copypaste-do-command', { command: data }); - } - break; default: debug('Unknown topic: ' + topic); break; }; }, }; this.NSGetFactory = XPCOMUtils.generateNSGetFactory([BrowserElementParent]);
--- a/dom/browser-element/mochitest/browserElementTestHelpers.js +++ b/dom/browser-element/mochitest/browserElementTestHelpers.js @@ -60,20 +60,16 @@ const browserElementTestHelpers = { setEnabledPref: function(value) { this._setPref('dom.mozBrowserFramesEnabled', value); }, setSelectionChangeEnabledPref: function(value) { this._setPref('selectioncaret.enabled', value); }, - setAccessibleCaretEnabledPref: function(value) { - this._setPref('layout.accessiblecaret.enabled', value); - }, - getOOPByDefaultPref: function() { return this._getBoolPref("dom.ipc.browser_frames.oop_by_default"); }, addPermission: function() { this.lockTestReady(); SpecialPowers.pushPermissions( [{'type': "browser", 'allow': 1, 'context': document}],
--- a/dom/browser-element/mochitest/browserElement_CopyPaste.js +++ b/dom/browser-element/mochitest/browserElement_CopyPaste.js @@ -16,17 +16,16 @@ var mm; var iframeOuter; var iframeInner; var state = 0; var stateMeaning; var defaultData; var pasteData; var focusScript; var createEmbededFrame = false; -var testAccessibleCaret = false; function copyToClipboard(str) { gTextarea.value = str; SpecialPowers.wrap(gTextarea).editor.selectAll(); SpecialPowers.wrap(gTextarea).editor.copy(); } function getScriptForGetContent() { @@ -156,58 +155,47 @@ function dispatchTest(e) { "</body>" + "<script>document.designMode='on';</script>" + "</html>"; stateMeaning = " (test: normal div with designMode:on)"; focusScript = "var elt=content.document.getElementById('text');elt.focus();"; break; default: if (createEmbededFrame || browserElementTestHelpers.getOOPByDefaultPref()) { - if (testAccessibleCaret) { - SimpleTest.finish(); - return; - } else { - testAccessibleCaret = true; - createEmbededFrame = false; - browserElementTestHelpers.setSelectionChangeEnabledPref(false); - browserElementTestHelpers.setAccessibleCaretEnabledPref(true); - } + SimpleTest.finish(); } else { createEmbededFrame = true; + + // clean up and run test again. + document.body.removeChild(iframeOuter); + document.body.removeChild(gTextarea); + state = 0; + runTest(); } - - // clean up and run test again. - document.body.removeChild(iframeOuter); - document.body.removeChild(gTextarea); - state = 0; - runTest(); break; } } function isChildProcess() { return SpecialPowers.Cc["@mozilla.org/xre/app-info;1"] .getService(SpecialPowers.Ci.nsIXULRuntime) .processType != SpecialPowers.Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT; } function testSelectAll(e) { // Skip mozbrowser test if we're at child process. if (!isChildProcess()) { - let eventName = testAccessibleCaret ? "mozbrowsercaretstatechanged" : "mozbrowserselectionstatechanged"; - iframeOuter.addEventListener(eventName, function selectchangeforselectall(e) { - if (!e.detail.states || e.detail.states.indexOf('selectall') == 0) { - iframeOuter.removeEventListener(eventName, selectchangeforselectall, true); + iframeOuter.addEventListener("mozbrowserselectionstatechanged", function selectchangeforselectall(e) { + if (e.detail.states.indexOf('selectall') == 0) { + iframeOuter.removeEventListener("mozbrowserselectionstatechanged", selectchangeforselectall, true); ok(true, "got mozbrowserselectionstatechanged event." + stateMeaning); ok(e.detail, "event.detail is not null." + stateMeaning); ok(e.detail.width != 0, "event.detail.width is not zero" + stateMeaning); ok(e.detail.height != 0, "event.detail.height is not zero" + stateMeaning); - if (!testAccessibleCaret) { - ok(e.detail.states, "event.detail.state " + e.detail.states); - } + ok(e.detail.states, "event.detail.state " + e.detail.states); SimpleTest.executeSoon(function() { testCopy1(e); }); } }, true); } mm.addMessageListener('content-focus', function messageforfocus(msg) { mm.removeMessageListener('content-focus', messageforfocus); // test selectall command, after calling this the selectionstatechanged event should be fired.
--- a/dom/ipc/jar.mn +++ b/dom/ipc/jar.mn @@ -2,14 +2,13 @@ # 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/. toolkit.jar: content/global/test-ipc.xul (test.xul) content/global/remote-test-ipc.js (remote-test.js) content/global/BrowserElementChild.js (../browser-element/BrowserElementChild.js) content/global/BrowserElementChildPreload.js (../browser-element/BrowserElementChildPreload.js) - content/global/BrowserElementCopyPaste.js (../browser-element/BrowserElementCopyPaste.js) content/global/BrowserElementPanning.js (../browser-element/BrowserElementPanning.js) * content/global/BrowserElementPanningAPZDisabled.js (../browser-element/BrowserElementPanningAPZDisabled.js) content/global/manifestMessages.js (manifestMessages.js) content/global/PushServiceChildPreload.js (../push/PushServiceChildPreload.js) content/global/preload.js (preload.js)
--- a/dom/ipc/preload.js +++ b/dom/ipc/preload.js @@ -98,17 +98,16 @@ const BrowserElementIsPreloaded = true; Services.scriptloader.loadSubScript("chrome://global/content/BrowserElementPanningAPZDisabled.js", global); } } catch (e) { } Services.scriptloader.loadSubScript("chrome://global/content/BrowserElementPanning.js", global); } - Services.scriptloader.loadSubScript("chrome://global/content/BrowserElementCopyPaste.js", global); Services.scriptloader.loadSubScript("chrome://global/content/BrowserElementChildPreload.js", global); Services.io.getProtocolHandler("app"); Services.io.getProtocolHandler("default"); docShell.isActive = false; docShell.createAboutBlankContentViewer(null);
deleted file mode 100644 --- a/dom/webidl/CaretStateChangedEvent.webidl +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* 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/. - */ - -enum CaretChangedReason { - "visibilitychange", - "updateposition", - "longpressonemptycontent", - "taponcaret", - "presscaret", - "releasecaret" -}; - -dictionary CaretStateChangedEventInit : EventInit { - boolean collapsed = true; - DOMRectReadOnly? boundingClientRect = null; - CaretChangedReason reason = "visibilitychange"; - boolean caretVisible = false; - boolean selectionVisible = false; -}; - -[Constructor(DOMString type, optional CaretStateChangedEventInit eventInit), - ChromeOnly] -interface CaretStateChangedEvent : Event { - readonly attribute boolean collapsed; - readonly attribute DOMRectReadOnly? boundingClientRect; - readonly attribute CaretChangedReason reason; - readonly attribute boolean caretVisible; - readonly attribute boolean selectionVisible; -};
--- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -720,17 +720,16 @@ GENERATED_EVENTS_WEBIDL_FILES = [ 'AutocompleteErrorEvent.webidl', 'BlobEvent.webidl', 'CallEvent.webidl', 'CallGroupErrorEvent.webidl', 'CameraClosedEvent.webidl', 'CameraConfigurationEvent.webidl', 'CameraFacesDetectedEvent.webidl', 'CameraStateChangeEvent.webidl', - 'CaretStateChangedEvent.webidl', 'CFStateChangeEvent.webidl', 'CloseEvent.webidl', 'CSSFontFaceLoadEvent.webidl', 'DataErrorEvent.webidl', 'DataStoreChangeEvent.webidl', 'DeviceLightEvent.webidl', 'DeviceOrientationEvent.webidl', 'DeviceProximityEvent.webidl',
--- a/layout/base/AccessibleCaretManager.cpp +++ b/layout/base/AccessibleCaretManager.cpp @@ -85,17 +85,16 @@ AccessibleCaretManager::OnSelectionChang void AccessibleCaretManager::HideCarets() { if (mFirstCaret->IsLogicallyVisible() || mSecondCaret->IsLogicallyVisible()) { AC_LOG("%s", __FUNCTION__); mFirstCaret->SetAppearance(Appearance::None); mSecondCaret->SetAppearance(Appearance::None); - DispatchCaretStateChangedEvent(CaretChangedReason::Visibilitychange); CancelCaretTimeoutTimer(); } } void AccessibleCaretManager::UpdateCarets() { mCaretMode = GetCaretMode(); @@ -150,32 +149,26 @@ AccessibleCaretManager::UpdateCaretsForC if (!editingHost) { HideCarets(); return; } // No need to consider whether the caret's position is out of scrollport. // According to the spec, we need to explicitly hide it after the scrolling is // ended. - bool oldSecondCaretVisible = mSecondCaret->IsLogicallyVisible(); - PositionChangedResult caretResult = mFirstCaret->SetPosition(frame, offset); + mFirstCaret->SetPosition(frame, offset); mFirstCaret->SetSelectionBarEnabled(false); if (nsContentUtils::HasNonEmptyTextContent( editingHost, nsContentUtils::eRecurseIntoChildren)) { mFirstCaret->SetAppearance(Appearance::Normal); LaunchCaretTimeoutTimer(); } else { mFirstCaret->SetAppearance(Appearance::NormalNotShown); } mSecondCaret->SetAppearance(Appearance::None); - - if ((caretResult == PositionChangedResult::Changed || - oldSecondCaretVisible) && !mActiveCaret) { - DispatchCaretStateChangedEvent(CaretChangedReason::Updateposition); - } } void AccessibleCaretManager::UpdateCaretsForSelectionMode() { AC_LOG("%s, selection: %p", __FUNCTION__, GetSelection()); int32_t startOffset = 0; @@ -216,24 +209,16 @@ AccessibleCaretManager::UpdateCaretsForS if (firstCaretResult == PositionChangedResult::Changed || secondCaretResult == PositionChangedResult::Changed) { // Flush layout to make the carets intersection correct. mPresShell->FlushPendingNotifications(Flush_Layout); } UpdateCaretsForTilt(); - - if ((firstCaretResult == PositionChangedResult::Changed || - secondCaretResult == PositionChangedResult::Changed || - firstCaretResult == PositionChangedResult::Invisible || - secondCaretResult == PositionChangedResult::Invisible) && - !mActiveCaret) { - DispatchCaretStateChangedEvent(CaretChangedReason::Updateposition); - } } void AccessibleCaretManager::UpdateCaretsForTilt() { if (mFirstCaret->IsVisuallyVisible() && mSecondCaret->IsVisuallyVisible()) { if (mFirstCaret->Intersects(*mSecondCaret)) { if (mFirstCaret->LogicalPosition().x <= @@ -263,17 +248,16 @@ AccessibleCaretManager::PressCaret(const mActiveCaret = mSecondCaret.get(); SetSelectionDirection(eDirNext); } if (mActiveCaret) { mOffsetYToCaretLogicalPosition = mActiveCaret->LogicalPosition().y - aPoint.y; SetSelectionDragState(true); - DispatchCaretStateChangedEvent(CaretChangedReason::Presscaret); CancelCaretTimeoutTimer(); rv = NS_OK; } return rv; } nsresult @@ -290,30 +274,28 @@ AccessibleCaretManager::DragCaret(const nsresult AccessibleCaretManager::ReleaseCaret() { MOZ_ASSERT(mActiveCaret); mActiveCaret = nullptr; SetSelectionDragState(false); - DispatchCaretStateChangedEvent(CaretChangedReason::Releasecaret); LaunchCaretTimeoutTimer(); return NS_OK; } nsresult AccessibleCaretManager::TapCaret(const nsPoint& aPoint) { MOZ_ASSERT(GetCaretMode() != CaretMode::None); nsresult rv = NS_ERROR_FAILURE; if (GetCaretMode() == CaretMode::Cursor) { - DispatchCaretStateChangedEvent(CaretChangedReason::Taponcaret); rv = NS_OK; } return rv; } nsresult AccessibleCaretManager::SelectWordOrShortcut(const nsPoint& aPoint) @@ -344,17 +326,16 @@ AccessibleCaretManager::SelectWordOrShor nsLayoutUtils::TransformPoint(rootFrame, ptFrame, ptInFrame); nsIContent* editingHost = ptFrame->GetContent()->GetEditingHost(); if (ChangeFocus(ptFrame) && (editingHost && !nsContentUtils::HasNonEmptyTextContent( editingHost, nsContentUtils::eRecurseIntoChildren))) { // Content is empty. No need to select word. AC_LOG("%s, Cannot select word bacause content is empty", __FUNCTION__); - DispatchCaretStateChangedEvent(CaretChangedReason::Longpressonemptycontent); return NS_OK; } nsresult rv = SelectWord(ptFrame, ptInFrame); UpdateCarets(); return rv; } @@ -880,80 +861,9 @@ AccessibleCaretManager::LaunchCaretTimeo void AccessibleCaretManager::CancelCaretTimeoutTimer() { if (mCaretTimeoutTimer) { mCaretTimeoutTimer->Cancel(); } } -void -AccessibleCaretManager::DispatchCaretStateChangedEvent(CaretChangedReason aReason) const -{ - MOZ_ASSERT(nsContentUtils::IsSafeToRunScript()); - // Holding PresShell to prevent AccessibleCaretManager to be destroyed. - nsCOMPtr<nsIPresShell> presShell = mPresShell; - // XXX: Do we need to flush layout? - presShell->FlushPendingNotifications(Flush_Layout); - if (presShell->IsDestroying()) { - return; - } - - Selection* sel = GetSelection(); - if (!sel) { - return; - } - - nsIDocument* doc = mPresShell->GetDocument(); - MOZ_ASSERT(doc); - - CaretStateChangedEventInit init; - init.mBubbles = true; - - const nsRange* range = sel->GetAnchorFocusRange(); - nsINode* commonAncestorNode = nullptr; - if (range) { - commonAncestorNode = range->GetCommonAncestor(); - } - - if (!commonAncestorNode) { - commonAncestorNode = sel->GetFrameSelection()->GetAncestorLimiter(); - } - - nsRefPtr<DOMRect> domRect = new DOMRect(ToSupports(doc)); - nsRect rect = nsContentUtils::GetSelectionBoundingRect(sel); - - nsIFrame* commonAncestorFrame = nullptr; - nsIFrame* rootFrame = mPresShell->GetRootFrame(); - - if (commonAncestorNode && commonAncestorNode->IsContent()) { - commonAncestorFrame = commonAncestorNode->AsContent()->GetPrimaryFrame(); - } - - if (commonAncestorFrame && rootFrame) { - nsLayoutUtils::TransformRect(rootFrame, commonAncestorFrame, rect); - nsRect clampedRect = nsLayoutUtils::ClampRectToScrollFrames(commonAncestorFrame, - rect); - nsLayoutUtils::TransformRect(commonAncestorFrame, rootFrame, clampedRect); - domRect->SetLayoutRect(clampedRect); - init.mSelectionVisible = !clampedRect.IsEmpty(); - init.mBoundingClientRect = domRect; - } else { - domRect->SetLayoutRect(rect); - init.mSelectionVisible = true; - } - - init.mBoundingClientRect = domRect; - init.mReason = aReason; - init.mCollapsed = sel->IsCollapsed(); - init.mCaretVisible = mFirstCaret->IsLogicallyVisible() || - mSecondCaret->IsLogicallyVisible(); - - nsRefPtr<CaretStateChangedEvent> event = - CaretStateChangedEvent::Constructor(doc, NS_LITERAL_STRING("mozcaretstatechanged"), init); - - event->SetTrusted(true); - event->GetInternalNSEvent()->mFlags.mOnlyChromeDispatch = true; - bool ret; - doc->DispatchEvent(event, &ret); -} - } // namespace mozilla
--- a/layout/base/AccessibleCaretManager.h +++ b/layout/base/AccessibleCaretManager.h @@ -8,17 +8,16 @@ #define AccessibleCaretManager_h #include "nsCOMPtr.h" #include "nsCoord.h" #include "nsIFrame.h" #include "nsISelectionListener.h" #include "nsRefPtr.h" #include "nsWeakReference.h" -#include "mozilla/dom/CaretStateChangedEvent.h" #include "mozilla/EventForwards.h" #include "mozilla/UniquePtr.h" #include "mozilla/WeakPtr.h" class nsFrameSelection; class nsIContent; class nsIPresShell; struct nsPoint; @@ -128,20 +127,16 @@ protected: nsresult DragCaretInternal(const nsPoint& aPoint); nsPoint AdjustDragBoundary(const nsPoint& aPoint) const; void ClearMaintainedSelection() const; dom::Selection* GetSelection() const; already_AddRefed<nsFrameSelection> GetFrameSelection() const; nsIContent* GetFocusedContent() const; - // This function will call FlushPendingNotifications. So caller must ensure - // everything exists after calling this method. - void DispatchCaretStateChangedEvent(dom::CaretChangedReason aReason) const; - // If we're dragging the first caret, we do not want to drag it over the // previous character of the second caret. Same as the second caret. So we // check if content offset exceeds the previous/next character of second/first // caret base the active caret. bool CompareRangeWithContentOffset(nsIFrame::ContentOffsets& aOffsets); // Timeout in milliseconds to hide the AccessibleCaret under cursor mode while // no one touches it.