diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js index 6eaecca25272..c1011fc93fbc 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -609,7 +609,8 @@ HistoryMenu.prototype = { }, toggleHiddenTabs() { - if (gBrowser.visibleTabs.length < gBrowser.tabs.length) { + if (window.gBrowser && + gBrowser.visibleTabs.length < gBrowser.tabs.length) { this.hiddenTabsMenu.removeAttribute("hidden"); } else { this.hiddenTabsMenu.setAttribute("hidden", "true"); diff --git a/browser/base/content/tabbrowser.js b/browser/base/content/tabbrowser.js index 15157ad70e9d..009723375450 100644 --- a/browser/base/content/tabbrowser.js +++ b/browser/base/content/tabbrowser.js @@ -2589,23 +2589,24 @@ window._gBrowser = { removeTabs(tabs) { let tabsWithBeforeUnload = []; let lastToClose; - let aParams = { animate: true }; + let params = { animate: true }; for (let tab of tabs) { - if (tab.selected) + if (tab.selected) { lastToClose = tab; - else if (this._hasBeforeUnload(tab)) + } else if (this._hasBeforeUnload(tab)) { tabsWithBeforeUnload.push(tab); - else - this.removeTab(tab, aParams); + } else { + this.removeTab(tab, params); + } } for (let tab of tabsWithBeforeUnload) { - this.removeTab(tab, aParams); + this.removeTab(tab, params); } // Avoid changing the selected browser several times by removing it, // if appropriate, lastly. if (lastToClose) { - this.removeTab(lastToClose, aParams); + this.removeTab(lastToClose, params); } }, diff --git a/browser/components/customizableui/CustomizeMode.jsm b/browser/components/customizableui/CustomizeMode.jsm index fe29caccb045..3df29160b688 100644 --- a/browser/components/customizableui/CustomizeMode.jsm +++ b/browser/components/customizableui/CustomizeMode.jsm @@ -1919,10 +1919,7 @@ CustomizeMode.prototype = { // The items in the palette are wrapped, so we need the target node's parent here: this.visiblePalette.insertBefore(draggedItem, aTargetNode.parentNode); } - if (aOriginArea.id !== kPaletteId) { - // The dragend event already fires when the item moves within the palette. - this._onDragEnd(aEvent); - } + this._onDragEnd(aEvent); return; } @@ -2025,6 +2022,8 @@ CustomizeMode.prototype = { /** * To workaround bug 460801 we manually forward the drop event here when dragend wouldn't be fired. + * + * Note that that means that this function may be called multiple times by a single drag operation. */ _onDragEnd(aEvent) { if (this._isUnwantedDragDrop(aEvent)) { diff --git a/browser/components/extensions/child/ext-menus.js b/browser/components/extensions/child/ext-menus.js index ef8afcbaf3da..ee204036e9a9 100644 --- a/browser/components/extensions/child/ext-menus.js +++ b/browser/components/extensions/child/ext-menus.js @@ -32,7 +32,7 @@ class ContextMenusClickPropHandler { // No need for runSafe or anything because we are already being run inside // an event handler -- the event is just being forwarded to the actual // handler. - onclick(info, tab); + withHandlingUserInput(this.context.contentWindow, () => onclick(info, tab)); } } diff --git a/browser/components/extensions/test/browser/browser-common.ini b/browser/components/extensions/test/browser/browser-common.ini index 4e6952b4a412..fad6f5761ffb 100644 --- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -210,7 +210,6 @@ skip-if = os == 'mac' # Save as PDF not supported on Mac OS X [browser_ext_themes_validation.js] [browser_ext_url_overrides_newtab.js] [browser_ext_user_events.js] -skip-if = debug || os == "linux" #Bug 1381305 [browser_ext_webRequest.js] [browser_ext_webNavigation_frameId0.js] [browser_ext_webNavigation_getFrames.js] diff --git a/browser/components/extensions/test/browser/browser_ext_user_events.js b/browser/components/extensions/test/browser/browser_ext_user_events.js index 0c95b6a41694..9709ed80fc00 100644 --- a/browser/components/extensions/test/browser/browser_ext_user_events.js +++ b/browser/components/extensions/test/browser/browser_ext_user_events.js @@ -48,20 +48,29 @@ add_task(async function testSources() { browser.pageAction.onClicked.addListener(() => request("bookmarks")); browser.browserAction.onClicked.addListener(() => request("tabs")); - browser.contextMenus.create({ - id: "menu", - title: "test user events", - contexts: ["page"], - }); - browser.contextMenus.onClicked.addListener(() => request("webNavigation")); - browser.test.onMessage.addListener(msg => { + if (msg === "contextMenus.update") { + browser.contextMenus.onClicked.addListener(() => request("webNavigation")); + browser.contextMenus.update("menu", { + title: "test user events in onClicked", + onclick: null, + }, () => browser.test.sendMessage("contextMenus.update-done")); + } if (msg === "openOptionsPage") { browser.runtime.openOptionsPage(); } }); - browser.test.sendMessage("actions-ready"); + browser.contextMenus.create({ + id: "menu", + title: "test user events in onclick", + contexts: ["page"], + onclick() { + request("cookies"); + }, + }, () => { + browser.test.sendMessage("actions-ready"); + }); }, files: { @@ -111,7 +120,7 @@ add_task(async function testSources() { browser_action: {default_title: "test"}, page_action: {default_title: "test"}, permissions: ["contextMenus"], - optional_permissions: ["bookmarks", "tabs", "webNavigation", "webRequest"], + optional_permissions: ["bookmarks", "tabs", "webNavigation", "webRequest", "cookies"], options_ui: {page: "options.html"}, content_security_policy: "script-src 'self' https://example.com; object-src 'none';", }, @@ -153,15 +162,23 @@ add_task(async function testSources() { gBrowser.selectedTab = tab; let menu = await openContextMenu("body"); - let items = menu.getElementsByAttribute("label", "test user events"); + let items = menu.getElementsByAttribute("label", "test user events in onclick"); is(items.length, 1, "Found context menu item"); EventUtils.synthesizeMouseAtCenter(items[0], {}); - await check("context menu click"); + await check("context menu in onclick"); + + extension.sendMessage("contextMenus.update"); + await extension.awaitMessage("contextMenus.update-done"); + menu = await openContextMenu("body"); + items = menu.getElementsByAttribute("label", "test user events in onClicked"); + is(items.length, 1, "Found context menu item again"); + EventUtils.synthesizeMouseAtCenter(items[0], {}); + await check("context menu in onClicked"); - extension.sendMessage("openOptionsPage"); promisePopupNotificationShown("addon-webext-permissions").then(panel => { panel.button.click(); }); + extension.sendMessage("openOptionsPage"); await check("options page link click"); await BrowserTestUtils.removeTab(gBrowser.selectedTab); diff --git a/browser/components/feeds/WebContentConverter.js b/browser/components/feeds/WebContentConverter.js index 462b6d2d3517..04c96dc2b454 100644 --- a/browser/components/feeds/WebContentConverter.js +++ b/browser/components/feeds/WebContentConverter.js @@ -308,28 +308,12 @@ WebContentConverterRegistrar.prototype = { browser.contentWindow == aContentWindow); }, - /** - * See nsIFactory - */ - createInstance(outer, iid) { - if (outer != null) - throw Cr.NS_ERROR_NO_AGGREGATION; - return this.QueryInterface(iid); - }, - classID: WCCR_CLASSID, /** * See nsISupports */ - QueryInterface: ChromeUtils.generateQI( - [Ci.nsIWebContentHandlerRegistrar, - Ci.nsIFactory]), - - _xpcom_categories: [{ - category: "app-startup", - service: true - }] + QueryInterface: ChromeUtils.generateQI([Ci.nsIWebContentHandlerRegistrar]), }; function WebContentConverterRegistrarContent() { @@ -355,23 +339,12 @@ WebContentConverterRegistrarContent.prototype = { title: aTitle }); }, - /** - * See nsIFactory - */ - createInstance(outer, iid) { - if (outer != null) - throw Cr.NS_ERROR_NO_AGGREGATION; - return this.QueryInterface(iid); - }, - classID: WCCR_CLASSID, /** * See nsISupports */ - QueryInterface: ChromeUtils.generateQI( - [Ci.nsIWebContentHandlerRegistrar, - Ci.nsIFactory]) + QueryInterface: ChromeUtils.generateQI([Ci.nsIWebContentHandlerRegistrar]) }; this.NSGetFactory = diff --git a/browser/components/newtab/aboutNewTabService.js b/browser/components/newtab/aboutNewTabService.js index 5a64a6d65a0b..1f0616194637 100644 --- a/browser/components/newtab/aboutNewTabService.js +++ b/browser/components/newtab/aboutNewTabService.js @@ -102,7 +102,6 @@ AboutNewTabService.prototype = { Ci.nsIAboutNewTabService, Ci.nsIObserver ]), - _xpcom_categories: [{service: true}], observe(subject, topic, data) { switch (topic) { diff --git a/devtools/client/themes/webconsole.css b/devtools/client/themes/webconsole.css index 4c1bee6c4dd6..b253d162d600 100644 --- a/devtools/client/themes/webconsole.css +++ b/devtools/client/themes/webconsole.css @@ -670,7 +670,7 @@ a.learn-more-link.webconsole-learn-more-link { } .webconsole-output-wrapper .message-flex-body > .message-body { - overflow-x: auto; + overflow: hidden; } .webconsole-output-wrapper .message-body > * { diff --git a/devtools/client/webconsole/test/mochitest/browser_console_clear_cache.js b/devtools/client/webconsole/test/mochitest/browser_console_clear_cache.js index aeef199db4e0..8d25c97edf29 100644 --- a/devtools/client/webconsole/test/mochitest/browser_console_clear_cache.js +++ b/devtools/client/webconsole/test/mochitest/browser_console_clear_cache.js @@ -21,6 +21,12 @@ add_task(async function() { hud.ui.window.document.querySelector(".devtools-clear-icon").click(); await onBrowserConsoleOutputCleared; + // Check that there are no other messages logged (see Bug 1457478). + // Log a message to make sure the console handled any prior log. + await logTextToConsole(hud, "after clear"); + const messages = hud.ui.outputNode.querySelectorAll(".message"); + is(messages.length, 1, "There is only the new message in the output"); + info("Close and re-open the browser console"); await HUDService.toggleBrowserConsole(); hud = await HUDService.toggleBrowserConsole(); diff --git a/devtools/server/actors/webconsole.js b/devtools/server/actors/webconsole.js index 309026900374..21c86a06116e 100644 --- a/devtools/server/actors/webconsole.js +++ b/devtools/server/actors/webconsole.js @@ -1167,7 +1167,6 @@ WebConsoleActor.prototype = }); if (this.parentActor.isRootActor) { - Services.console.logStringMessage(null); // for the Error Console Services.console.reset(); } return {}; diff --git a/dom/xhr/XMLHttpRequestWorker.cpp b/dom/xhr/XMLHttpRequestWorker.cpp index 42f63e6fa8f8..d21138058964 100644 --- a/dom/xhr/XMLHttpRequestWorker.cpp +++ b/dom/xhr/XMLHttpRequestWorker.cpp @@ -1013,17 +1013,21 @@ Proxy::HandleEvent(Event* aEvent) RefPtr runnable; if (progressEvent) { - runnable = new EventRunnable(this, isUploadTarget, type, - progressEvent->LengthComputable(), - progressEvent->Loaded(), - progressEvent->Total(), - scope); + if (!mIsSyncXHR || !type.EqualsASCII(sEventStrings[STRING_progress])) { + runnable = new EventRunnable(this, isUploadTarget, type, + progressEvent->LengthComputable(), + progressEvent->Loaded(), + progressEvent->Total(), + scope); + } } else { runnable = new EventRunnable(this, isUploadTarget, type, scope); } - runnable->Dispatch(); + if (runnable) { + runnable->Dispatch(); + } } if (!isUploadTarget) { @@ -1741,6 +1745,11 @@ XMLHttpRequestWorker::DispatchPrematureAbortEvent(EventTarget* aTarget, event->InitEvent(aEventType, false, false); } else { + if (mProxy->mIsSyncXHR && + aEventType.EqualsASCII(sEventStrings[STRING_progress])) { + return; + } + ProgressEventInit init; init.mBubbles = false; init.mCancelable = false; diff --git a/gfx/tests/crashtests/1478035.html b/gfx/tests/crashtests/1478035.html new file mode 100644 index 000000000000..39255e5d28cd --- /dev/null +++ b/gfx/tests/crashtests/1478035.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/gfx/tests/crashtests/crashtests.list b/gfx/tests/crashtests/crashtests.list index 442702de110c..dfb58254820d 100644 --- a/gfx/tests/crashtests/crashtests.list +++ b/gfx/tests/crashtests/crashtests.list @@ -167,3 +167,4 @@ load 1408078-1.html load 1464243.html load 1467847-1.html load 1468020.html +load 1478035.html diff --git a/js/xpconnect/loader/XPCOMUtils.jsm b/js/xpconnect/loader/XPCOMUtils.jsm index 0a254c8e4602..38e512ea6a2d 100644 --- a/js/xpconnect/loader/XPCOMUtils.jsm +++ b/js/xpconnect/loader/XPCOMUtils.jsm @@ -54,28 +54,6 @@ * classDescription: "unique text description", * contractID: "@example.com/xxx;1", * - * // [optional] an array of categories to register this component in. - * _xpcom_categories: [{ - * // Each object in the array specifies the parameters to pass to - * // nsICategoryManager.addCategoryEntry(). 'true' is passed for - * // both aPersist and aReplace params. - * category: "some-category", - * // optional, defaults to the object's classDescription - * entry: "entry name", - * // optional, defaults to the object's contractID (unless - * // 'service' is specified) - * value: "...", - * // optional, defaults to false. When set to true, and only if 'value' - * // is not specified, the concatenation of the string "service," and the - * // object's contractID is passed as aValue parameter of addCategoryEntry. - * service: true, - * // optional, it can be an array of applications' IDs in the form: - * // [ "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}", ... ] - * // If defined the component will be registered in this category only for - * // the provided applications. - * apps: [...] - * }], - * * // ...component implementation... * }; * diff --git a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp index 69edb8cf0826..1ddfe49a95db 100644 --- a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp +++ b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.cpp @@ -1493,6 +1493,11 @@ MediaPipelineTransmit::UpdateSinkIdentity_m(const MediaStreamTrack* aTrack, return; } + if (!mDomTrack) { + // Nothing to do here + return; + } + bool enableTrack = aPrincipal->Subsumes(mDomTrack->GetPrincipal()); if (!enableTrack) { // first try didn't work, but there's a chance that this is still available diff --git a/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp b/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp index c828c7e071d3..c67609dc4bb7 100644 --- a/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp +++ b/media/webrtc/signaling/src/peerconnection/TransceiverImpl.cpp @@ -125,7 +125,7 @@ TransceiverImpl::UpdateSinkIdentity(const dom::MediaStreamTrack* aTrack, nsIPrincipal* aPrincipal, const PeerIdentity* aSinkIdentity) { - if (!(mJsepTransceiver->mJsDirection & sdp::kSend)) { + if (mJsepTransceiver->IsStopped()) { return NS_OK; } diff --git a/mobile/android/modules/geckoview/GeckoViewContent.jsm b/mobile/android/modules/geckoview/GeckoViewContent.jsm index f1462665aa7b..d1e259e5ecc6 100644 --- a/mobile/android/modules/geckoview/GeckoViewContent.jsm +++ b/mobile/android/modules/geckoview/GeckoViewContent.jsm @@ -268,10 +268,7 @@ class GeckoViewContent extends GeckoViewModule { finder.caseSensitive = !!aData.matchCase; finder.entireWord = !!aData.wholeWord; - - if (aCallback) { - finder.addResultListener(this._finderListener); - } + finder.addResultListener(this._finderListener); const drawOutline = this._matchDisplayOptions && !!this._matchDisplayOptions.drawOutline; @@ -290,9 +287,21 @@ class GeckoViewContent extends GeckoViewModule { } _clearMatches() { + debug `clearMatches`; + + let finder; try { - this.browser.finder.removeSelection(); + finder = this.browser.finder; } catch (e) { + return; + } + + finder.removeSelection(); + finder.highlight(false); + + if (this._finderListener) { + finder.removeResultListener(this._finderListener); + this._finderListener = null; } } @@ -310,15 +319,15 @@ class GeckoViewContent extends GeckoViewModule { finder.onModalHighlightChange(!!aData.dimPage); finder.onHighlightAllChange(!!aData.highlightAll); - if (!finder.searchString) { - return; - } if (!aData.highlightAll && !aData.dimPage) { finder.highlight(false); return; } - const linksOnly = this._finderListener && - this._finderListener.response.linksOnly; + + if (!this._finderListener || !finder.searchString) { + return; + } + const linksOnly = this._finderListener.response.linksOnly; finder.highlight(true, finder.searchString, linksOnly, !!aData.drawOutline); } } diff --git a/testing/marionette/components/marionette.js b/testing/marionette/components/marionette.js index d9d37972e6a1..860ec9e7937b 100644 --- a/testing/marionette/components/marionette.js +++ b/testing/marionette/components/marionette.js @@ -532,15 +532,9 @@ Marionette.prototype = { classID: Components.ID("{786a1369-dca5-4adc-8486-33d23c88010a}"), contractID: "@mozilla.org/remote/marionette;1", - /* eslint-disable camelcase */ + /* eslint-disable-next-line camelcase */ _xpcom_factory: MarionetteFactory, - _xpcom_categories: [ - {category: "command-line-handler", entry: "b-marionette"}, - {category: "profile-after-change", service: true}, - ], - /* eslint-enable camelcase */ - helpInfo: " --marionette Enable remote control server.\n", }; diff --git a/testing/web-platform/meta/xhr/sync-no-progress.any.js.ini b/testing/web-platform/meta/xhr/sync-no-progress.any.js.ini deleted file mode 100644 index 267e0e7c9c72..000000000000 --- a/testing/web-platform/meta/xhr/sync-no-progress.any.js.ini +++ /dev/null @@ -1,4 +0,0 @@ -[sync-no-progress.any.worker.html] - [progress event should not be fired by sync XHR] - expected: FAIL - diff --git a/testing/web-platform/tests/webdriver/tests/element_send_keys/__init__.py b/testing/web-platform/tests/webdriver/tests/element_send_keys/__init__.py index e69de29bb2d1..a7facf6fcf70 100644 --- a/testing/web-platform/tests/webdriver/tests/element_send_keys/__init__.py +++ b/testing/web-platform/tests/webdriver/tests/element_send_keys/__init__.py @@ -0,0 +1,2 @@ +def map_files_to_multiline_text(files): + return "\n".join(map(lambda f: str(f), files)) diff --git a/testing/web-platform/tests/webdriver/tests/element_send_keys/conftest.py b/testing/web-platform/tests/webdriver/tests/element_send_keys/conftest.py index 54fd9d9dc017..17bdd162a772 100644 --- a/testing/web-platform/tests/webdriver/tests/element_send_keys/conftest.py +++ b/testing/web-platform/tests/webdriver/tests/element_send_keys/conftest.py @@ -1,18 +1,6 @@ import pytest -@pytest.fixture -def create_file(tmpdir_factory): - def inner(filename): - fh = tmpdir_factory.mktemp("tmp").join(filename) - fh.write(filename) - - return fh - - inner.__name__ = "create_file" - return inner - - @pytest.fixture def create_files(tmpdir_factory): def inner(filenames): diff --git a/testing/web-platform/tests/webdriver/tests/element_send_keys/events.py b/testing/web-platform/tests/webdriver/tests/element_send_keys/events.py index 01c6e0924a45..41b00ef37fa2 100644 --- a/testing/web-platform/tests/webdriver/tests/element_send_keys/events.py +++ b/testing/web-platform/tests/webdriver/tests/element_send_keys/events.py @@ -5,9 +5,10 @@ from tests.support.asserts import ( assert_events_equal, assert_success, ) - from tests.support.inline import inline +from . import map_files_to_multiline_text + @pytest.fixture def tracked_events(): @@ -30,19 +31,19 @@ def element_send_keys(session, element, text): {"text": text}) -def test_file_upload(session, create_file, add_event_listeners, tracked_events): +def test_file_upload(session, create_files, add_event_listeners, tracked_events): expected_events = [ "input", "change", ] - single_file = create_file("foo") + files = create_files(["foo", "bar"]) session.url = inline("") element = session.find.css("input", all=False) add_event_listeners(element, tracked_events) - response = element_send_keys(session, element, str(single_file)) + response = element_send_keys(session, element, map_files_to_multiline_text(files)) assert_success(response) assert_events_equal(session, expected_events) diff --git a/testing/web-platform/tests/webdriver/tests/element_send_keys/file_upload.py b/testing/web-platform/tests/webdriver/tests/element_send_keys/file_upload.py index 0f2d85c3e3f2..d1a8b81da78e 100644 --- a/testing/web-platform/tests/webdriver/tests/element_send_keys/file_upload.py +++ b/testing/web-platform/tests/webdriver/tests/element_send_keys/file_upload.py @@ -1,9 +1,7 @@ from tests.support.asserts import assert_error, assert_files_uploaded, assert_success from tests.support.inline import inline - -def map_files_to_multiline_text(files): - return "\n".join(map(lambda f: str(f), files)) +from . import map_files_to_multiline_text def element_send_keys(session, element, text): @@ -35,19 +33,6 @@ def test_multiple_files(session, create_files): assert_files_uploaded(session, element, files) -def test_multiple_files_multiple_directories(session, create_file): - files = [create_file("foo"), create_file("bar")] - - session.url = inline("") - element = session.find.css("input", all=False) - - response = element_send_keys(session, element, - map_files_to_multiline_text(files)) - assert_success(response) - - assert_files_uploaded(session, element, files) - - def test_multiple_files_last_path_not_found(session, create_files): files = create_files(["foo", "bar"]) files.append("foo bar") @@ -115,32 +100,31 @@ def test_multiple_files_reset_with_element_clear(session, create_files): assert_files_uploaded(session, element, second_files) -def test_single_file(session, create_file): - single_file = create_file("foo") +def test_single_file(session, create_files): + files = create_files(["foo"]) session.url = inline("") element = session.find.css("input", all=False) - response = element_send_keys(session, element, str(single_file)) + response = element_send_keys(session, element, str(files[0])) assert_success(response) - assert_files_uploaded(session, element, [single_file]) + assert_files_uploaded(session, element, files) -def test_single_file_replaces_without_multiple_attribute(session, create_file): - first_file = create_file("foo") - second_file = create_file("bar") +def test_single_file_replaces_without_multiple_attribute(session, create_files): + files = create_files(["foo", "bar"]) session.url = inline("") element = session.find.css("input", all=False) - response = element_send_keys(session, element, str(first_file)) + response = element_send_keys(session, element, str(files[0])) assert_success(response) - response = element_send_keys(session, element, str(second_file)) + response = element_send_keys(session, element, str(files[1])) assert_success(response) - assert_files_uploaded(session, element, [second_file]) + assert_files_uploaded(session, element, [files[1]]) def test_single_file_appends_with_multiple_attribute(session, create_files): @@ -156,19 +140,3 @@ def test_single_file_appends_with_multiple_attribute(session, create_files): assert_success(response) assert_files_uploaded(session, element, files) - - -def test_single_file_multiple_directory_appends_with_multiple_attribute(session, create_file): - first_file = create_file("foo") - second_file = create_file("bar") - - session.url = inline("") - element = session.find.css("input", all=False) - - response = element_send_keys(session, element, str(first_file)) - assert_success(response) - - response = element_send_keys(session, element, str(second_file)) - assert_success(response) - - assert_files_uploaded(session, element, [first_file, second_file]) diff --git a/toolkit/components/thumbnails/PageThumbsStorageService.js b/toolkit/components/thumbnails/PageThumbsStorageService.js index bb62e825126b..01089a0bab90 100644 --- a/toolkit/components/thumbnails/PageThumbsStorageService.js +++ b/toolkit/components/thumbnails/PageThumbsStorageService.js @@ -18,9 +18,6 @@ function PageThumbsStorageService() {} PageThumbsStorageService.prototype = { classID: Components.ID("{97943eec-0e48-49ef-b7b7-cf4aa0109bb6}"), QueryInterface: ChromeUtils.generateQI([Ci.nsIPageThumbsStorageService]), - _xpcom_categories: [{ - service: true - }], // The path for the storage _path: null, get path() { diff --git a/toolkit/components/timermanager/nsIUpdateTimerManager.idl b/toolkit/components/timermanager/nsIUpdateTimerManager.idl index 12bdab512f7f..763898e81af7 100644 --- a/toolkit/components/timermanager/nsIUpdateTimerManager.idl +++ b/toolkit/components/timermanager/nsIUpdateTimerManager.idl @@ -30,15 +30,11 @@ interface nsIUpdateTimerManager : nsISupports * * Note: to avoid having to instantiate a component to call registerTimer * the component can intead register an update-timer category with comma - * separated values as a single string representing the timer as follows. + * separated values as a single string: * - * _xpcom_categories: [{ category: "update-timer", - * value: "contractID," + - * "method," + - * "id," + - * "preference," + - * "interval" }], - * the values are as follows + * contractID,method,id,preference,interval + * + * via a manifest entry. The values are as follows: * contractID : the contract ID for the component. * method : the method used to instantiate the interface. This should be * either getService or createInstance depending on your diff --git a/toolkit/content/process-content.js b/toolkit/content/process-content.js index 95885ecf5298..1a48d4edf9c7 100644 --- a/toolkit/content/process-content.js +++ b/toolkit/content/process-content.js @@ -52,7 +52,7 @@ let ProcessObserver = { let registeredURLs = Services.cpmm.sharedData.get("RemotePageManager:urls"); - if (!registeredURLs.has(url)) + if (!registeredURLs || !registeredURLs.has(url)) return; // Get the frame message manager for this window so we can associate this diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm index 50ec5654c4bb..cc4306930cf7 100644 --- a/widget/cocoa/nsChildView.mm +++ b/widget/cocoa/nsChildView.mm @@ -2095,6 +2095,10 @@ nsChildView::AddWindowOverlayWebRenderCommands(layers::WebRenderBridgeChild* aWr { PrepareWindowEffects(); + if (!mIsCoveringTitlebar || mIsFullscreen || mTitlebarRect.IsEmpty()) { + return; + } + bool needUpdate = mUpdatedTitlebarRegion.Intersects(mTitlebarRect); mUpdatedTitlebarRegion.SetEmpty();