From 5ea7ac2cf36d91951e1f3f6b6a8fb248408d3328 Mon Sep 17 00:00:00 2001 From: "microsoft-playwright-automation[bot]" <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 14:54:56 +0100 Subject: [PATCH] feat(firefox): roll to r1544 (#42631) Co-authored-by: microsoft-playwright-automation[bot] <203992400+microsoft-playwright-automation[bot]@users.noreply.github.com> --- browser_patches/firefox/UPSTREAM_CONFIG.sh | 2 +- .../firefox/juggler/NetworkObserver.js | 10 +- .../firefox/juggler/TargetRegistry.js | 2 +- .../firefox/juggler/components/Juggler.js | 2 +- .../firefox/juggler/content/Runtime.js | 50 +- .../firefox/juggler/content/WorkerMain.js | 4 + .../firefox/patches/bootstrap.diff | 579 ++++++++++-------- .../firefox/preferences/playwright.cfg | 7 +- packages/playwright-core/browsers.json | 2 +- 9 files changed, 376 insertions(+), 282 deletions(-) diff --git a/browser_patches/firefox/UPSTREAM_CONFIG.sh b/browser_patches/firefox/UPSTREAM_CONFIG.sh index ab997865af..98c9002b25 100644 --- a/browser_patches/firefox/UPSTREAM_CONFIG.sh +++ b/browser_patches/firefox/UPSTREAM_CONFIG.sh @@ -1,3 +1,3 @@ REMOTE_URL="https://github.com/mozilla-firefox/firefox" BASE_BRANCH="release" -BASE_REVISION="f1b6c0f86b96b7e0688c26f65803576f27cdaf88" +BASE_REVISION="d065a04bc5610f496762935dee56604a78b91b51" diff --git a/browser_patches/firefox/juggler/NetworkObserver.js b/browser_patches/firefox/juggler/NetworkObserver.js index 464bfdd8ee..2b4b3c5463 100644 --- a/browser_patches/firefox/juggler/NetworkObserver.js +++ b/browser_patches/firefox/juggler/NetworkObserver.js @@ -542,6 +542,9 @@ class NetworkRequest { try { remoteIPAddress = this.httpChannel.remoteAddress; remotePort = this.httpChannel.remotePort; + // Gecko reports bare IPv6 addresses, bracket them to match Chromium. + if (remoteIPAddress && remoteIPAddress.includes(':')) + remoteIPAddress = `[${remoteIPAddress}]`; } catch (e) { // remoteAddress is not defined for cached requests. } @@ -906,7 +909,12 @@ class ResponseStorage { // Note: fulfilled request comes with decoded body right away. if ((request.httpChannel instanceof Ci.nsIEncodedChannel) && request.httpChannel.contentEncodings && !request.httpChannel.applyConversion && !request._fulfilled) { const encodingHeader = request.httpChannel.getResponseHeader("Content-Encoding"); - encodings = encodingHeader.split(/\s*\t*,\s*\t*/); + // Firefox itself skips "identity" and empty encodings when applying content + // conversions, and there is no stream converter registered for them. + encodings = encodingHeader.split(/\s*\t*,\s*\t*/).filter(encoding => { + const normalized = encoding.trim().toLowerCase(); + return normalized && normalized !== 'identity' && normalized !== 'x-identity'; + }); } this._responses.set(request.requestId, { body, diff --git a/browser_patches/firefox/juggler/TargetRegistry.js b/browser_patches/firefox/juggler/TargetRegistry.js index 0511315cf2..582f4e62f1 100644 --- a/browser_patches/firefox/juggler/TargetRegistry.js +++ b/browser_patches/firefox/juggler/TargetRegistry.js @@ -4,7 +4,7 @@ const {Helper} = ChromeUtils.importESModule('chrome://juggler/content/Helper.js'); const {Preferences} = ChromeUtils.importESModule("resource://gre/modules/Preferences.sys.mjs"); -const {ContextualIdentityService} = ChromeUtils.importESModule("resource://gre/modules/ContextualIdentityService.sys.mjs"); +const {ContextualIdentityService} = ChromeUtils.importESModule("moz-src:///toolkit/components/contextualidentity/ContextualIdentityService.sys.mjs"); const {NetUtil} = ChromeUtils.importESModule('resource://gre/modules/NetUtil.sys.mjs'); const {AppConstants} = ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs"); diff --git a/browser_patches/firefox/juggler/components/Juggler.js b/browser_patches/firefox/juggler/components/Juggler.js index 7595958619..ac9e6c26b7 100644 --- a/browser_patches/firefox/juggler/components/Juggler.js +++ b/browser_patches/firefox/juggler/components/Juggler.js @@ -40,6 +40,7 @@ ActorManagerParent.addJSWindowActors({ }, }, allFrames: true, + safeForUntrustedWebProcess: true, }, }); @@ -158,4 +159,3 @@ const jugglerInstance = new Juggler(); export var JugglerFactory = function() { return jugglerInstance; }; - diff --git a/browser_patches/firefox/juggler/content/Runtime.js b/browser_patches/firefox/juggler/content/Runtime.js index a29af41b20..78c05de7ac 100644 --- a/browser_patches/firefox/juggler/content/Runtime.js +++ b/browser_patches/firefox/juggler/content/Runtime.js @@ -56,6 +56,10 @@ const disallowedMessageCategories = new Set([ class Runtime { constructor(isWorker = false) { this._debugger = new Debugger(); + // A debuggee global with these flags unset is pinned to the debuggable wasm/asm.js + // baseline tier, with the optimizing compiler disabled entirely. + this._debugger.allowUnobservedWasm = true; + this._debugger.allowUnobservedAsmJS = true; this._pendingPromises = new Map(); this._executionContexts = new Map(); this._windowToExecutionContext = new Map(); @@ -257,29 +261,37 @@ class Runtime { resolve = a; reject = b; }); - this._pendingPromises.set(obj.promiseID, {resolve, reject, executionContext, exceptionDetails}); + this._pendingPromises.set(obj.promiseID, {resolve, reject, executionContext, exceptionDetails, promiseObj: obj}); + // Debugger.onPromiseSettled hook was removed in Bug 2044167. Instead, attach + // reactions inside the debuggee that run a `debugger;` statement upon settling, + // and sweep pending promises from the onDebuggerStatement hook. Unlike + // dereferencing the promise and adding reactions from the privileged + // compartment, this also works in workers where there are no Xrays. if (this._pendingPromises.size === 1) - this._debugger.onPromiseSettled = this._onPromiseSettled.bind(this); + this._debugger.onDebuggerStatement = this._onDebuggerStatement.bind(this); + executionContext._debuggee.executeInGlobalWithBindings( + 'p.then(() => { debugger; }, () => { debugger; })', {p: obj}, {useInnerBindings: true}); return await promise; } - _onPromiseSettled(obj) { - const pendingPromise = this._pendingPromises.get(obj.promiseID); - if (!pendingPromise) - return; - this._pendingPromises.delete(obj.promiseID); + _onDebuggerStatement() { + for (const [promiseID, pendingPromise] of this._pendingPromises) { + const obj = pendingPromise.promiseObj; + if (obj.promiseState === 'pending') + continue; + this._pendingPromises.delete(promiseID); + if (obj.promiseState === 'fulfilled') { + pendingPromise.resolve({success: true, obj: obj.promiseValue}); + continue; + } + const debuggee = pendingPromise.executionContext._debuggee; + const errorInfo = debuggee.executeInGlobalWithBindings('({m: e?.message, s: e?.stack})', {e: obj.promiseReason}, {useInnerBindings: true}).return; + pendingPromise.exceptionDetails.text = errorInfo.getOwnPropertyDescriptor('m').value; + pendingPromise.exceptionDetails.stack = errorInfo.getOwnPropertyDescriptor('s').value; + pendingPromise.resolve({success: false, obj: null}); + } if (!this._pendingPromises.size) - this._debugger.onPromiseSettled = undefined; - - if (obj.promiseState === 'fulfilled') { - pendingPromise.resolve({success: true, obj: obj.promiseValue}); - return; - }; - const debuggee = pendingPromise.executionContext._debuggee; - const errorInfo = debuggee.executeInGlobalWithBindings('({m: e?.message, s: e?.stack})', {e: obj.promiseReason}, {useInnerBindings: true}).return; - pendingPromise.exceptionDetails.text = errorInfo.getOwnPropertyDescriptor('m').value; - pendingPromise.exceptionDetails.stack = errorInfo.getOwnPropertyDescriptor('s').value; - pendingPromise.resolve({success: false, obj: null}); + this._debugger.onDebuggerStatement = undefined; } createExecutionContext(domWindow, contextGlobal, auxData) { @@ -307,7 +319,7 @@ class Runtime { } } if (!this._pendingPromises.size) - this._debugger.onPromiseSettled = undefined; + this._debugger.onDebuggerStatement = undefined; this._debugger.removeDebuggee(destroyedContext._contextGlobal); this._executionContexts.delete(destroyedContext._id); if (destroyedContext._domWindow) diff --git a/browser_patches/firefox/juggler/content/WorkerMain.js b/browser_patches/firefox/juggler/content/WorkerMain.js index 99a6623e76..555a97a874 100644 --- a/browser_patches/firefox/juggler/content/WorkerMain.js +++ b/browser_patches/firefox/juggler/content/WorkerMain.js @@ -22,6 +22,10 @@ const runtime = new Runtime(true /* isWorker */); // Create execution context in the runtime only when the script // source was actually evaluated in it. const dbg = new Debugger(global); + // A debuggee global with these flags unset is pinned to the debuggable wasm/asm.js + // baseline tier, with the optimizing compiler disabled entirely. + dbg.allowUnobservedWasm = true; + dbg.allowUnobservedAsmJS = true; if (dbg.findScripts({global}).length) { runtime.createExecutionContext(null /* domWindow */, global, {}); } else { diff --git a/browser_patches/firefox/patches/bootstrap.diff b/browser_patches/firefox/patches/bootstrap.diff index bf56dc51a6..be41cd9731 100644 --- a/browser_patches/firefox/patches/bootstrap.diff +++ b/browser_patches/firefox/patches/bootstrap.diff @@ -31,7 +31,7 @@ index 8337336dc894b44ea696bb780e448dfbdd8b6357..9eb83f33bb0415f28d1bcf66507d33d0 DWORD creationFlags = CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT; diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn -index 96706c155f4dd317d93d7e5bf18f67598cce66a4..8f61011841cf06689a59210fb021d23f81db4fa1 100644 +index 3bc36691ce4b754fb80fa7d81d47dba786669dac..dbd3d465f66801e167e6e26d6eb6c474b4b1532c 100644 --- a/browser/installer/allowed-dupes.mn +++ b/browser/installer/allowed-dupes.mn @@ -66,6 +66,12 @@ browser/chrome/browser/builtin-addons/webcompat/shims/empty-shim.txt @@ -48,10 +48,10 @@ index 96706c155f4dd317d93d7e5bf18f67598cce66a4..8f61011841cf06689a59210fb021d23f browser/chrome/browser/content/activity-stream/data/content/tippytop/favicons/allegro-pl.ico browser/defaults/settings/main/search-config-icons/96327a73-c433-5eb4-a16d-b090cadfb80b diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in -index 203811a0fb980b47f113729cb1a16f56f376bfe5..83ac2cc8cdae99006fbc34319ed854c8ef88fcc4 100644 +index 9944fbec40229fe327cd311eb74be04f1d0f8b92..b3b60437eeb7ee729a3be040b8af7f0f738fa6c8 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in -@@ -204,6 +204,9 @@ +@@ -195,6 +195,9 @@ @RESPATH@/chrome/remote.manifest #endif @@ -109,10 +109,10 @@ index 257e87fe0c618684eb4216c8028ac886ef2d5562..8c13f020100dad9bc4e093d50bd3a1f9 const transportProvider = { setListener(upgradeListener) { diff --git a/docshell/base/BrowsingContext.cpp b/docshell/base/BrowsingContext.cpp -index d7155e79364de64fbf90c7fa37ac1713ed00bfa3..b38aece7733011cad0eac055c560e42b85ad467b 100644 +index 6662d0e720008838d4130ce6201ddac5f8390c98..40d41d987b6d59fddaac238cff86affe720bc9ed 100644 --- a/docshell/base/BrowsingContext.cpp +++ b/docshell/base/BrowsingContext.cpp -@@ -118,8 +118,11 @@ struct ParamTraits +@@ -119,8 +119,11 @@ struct ParamTraits template <> struct ParamTraits @@ -126,7 +126,7 @@ index d7155e79364de64fbf90c7fa37ac1713ed00bfa3..b38aece7733011cad0eac055c560e42b template <> struct ParamTraits -@@ -489,7 +492,11 @@ already_AddRefed BrowsingContext::CreateDetached( +@@ -484,7 +487,11 @@ already_AddRefed BrowsingContext::CreateDetached( fields.Get() = true; @@ -139,7 +139,7 @@ index d7155e79364de64fbf90c7fa37ac1713ed00bfa3..b38aece7733011cad0eac055c560e42b fields.Get() = inherit ? inherit->GetAllowJavascript() : true; -@@ -3544,6 +3551,15 @@ void BrowsingContext::DidSet(FieldIndex, +@@ -3558,6 +3565,15 @@ void BrowsingContext::DidSet(FieldIndex, }); } @@ -155,17 +155,17 @@ index d7155e79364de64fbf90c7fa37ac1713ed00bfa3..b38aece7733011cad0eac055c560e42b void BrowsingContext::DidSet(FieldIndex, nsString&& aOldValue) { MOZ_ASSERT(IsTop()); -@@ -3824,7 +3840,7 @@ void BrowsingContext::SetGeolocationServiceOverride( +@@ -3838,7 +3854,7 @@ void BrowsingContext::SetGeolocationServiceOverride( if (aGeolocationOverride.WasPassed()) { if (!mGeolocationServiceOverride) { - mGeolocationServiceOverride = MakeRefPtr(); + mGeolocationServiceOverride = MakeRefPtr(); - mGeolocationServiceOverride->Init(); + mGeolocationServiceOverride->Init(true /* isOverride */); } mGeolocationServiceOverride->Update(aGeolocationOverride.Value()); - } else if (RefPtr serviceOverride = + } else if (RefPtr serviceOverride = diff --git a/docshell/base/BrowsingContext.h b/docshell/base/BrowsingContext.h -index 6f7f58bba3be6f08b3b27e81f30864c61d683351..ac0d2dc75f3f9e99e97100958108f4504292283f 100644 +index aba8b50b04a5f8abe6670cddf16313a0f3156dbd..c9054e883de27f45796d644286f49e79210c2bf1 100644 --- a/docshell/base/BrowsingContext.h +++ b/docshell/base/BrowsingContext.h @@ -211,11 +211,11 @@ struct EmbedderColorSchemes { @@ -225,10 +225,10 @@ index 6f7f58bba3be6f08b3b27e81f30864c61d683351..ac0d2dc75f3f9e99e97100958108f450 void WalkPresContexts(Callback&&); void PresContextAffectingFieldChanged(); diff --git a/docshell/base/CanonicalBrowsingContext.cpp b/docshell/base/CanonicalBrowsingContext.cpp -index 00c69a2310f1056e8ef1199156cb593140af8a63..c6f5181e71b952fe36d83640eb776aa55c31eb2c 100644 +index 4a2127ed9b7e8b16a496b56e3382d910750b7a0e..c310686b8dc17da8def684df49fc0fbfa2a13afd 100644 --- a/docshell/base/CanonicalBrowsingContext.cpp +++ b/docshell/base/CanonicalBrowsingContext.cpp -@@ -303,6 +303,11 @@ void CanonicalBrowsingContext::ReplacedBy( +@@ -316,6 +316,11 @@ void CanonicalBrowsingContext::ReplacedBy( txn.SetInnerSizeSpoofedForRFP(GetInnerSizeSpoofedForRFP()); txn.SetIPAddressSpace(GetIPAddressSpace()); txn.SetParentalControlsEnabled(GetParentalControlsEnabled()); @@ -240,7 +240,7 @@ index 00c69a2310f1056e8ef1199156cb593140af8a63..c6f5181e71b952fe36d83640eb776aa5 if (!GetLanguageOverride().IsEmpty()) { // Reapply language override to update the corresponding realm. -@@ -1946,6 +1951,12 @@ void CanonicalBrowsingContext::LoadURI(nsIURI* aURI, +@@ -1976,6 +1981,12 @@ void CanonicalBrowsingContext::LoadURI(nsIURI* aURI, (void)SetIsCaptivePortalTab(true); } @@ -254,7 +254,7 @@ index 00c69a2310f1056e8ef1199156cb593140af8a63..c6f5181e71b952fe36d83640eb776aa5 } diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp -index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9a0519489 100644 +index 5a6d13023782c1b4f677b9a8cc88491d0ea5f533..312899d39bf4d9fe2515bc32b8fa8c8da9eee652 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -16,6 +16,12 @@ @@ -270,7 +270,15 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 #include "mozilla/Attributes.h" #include "mozilla/AutoRestore.h" #include "mozilla/BasePrincipal.h" -@@ -64,6 +70,7 @@ +@@ -51,6 +57,7 @@ + #include "mozilla/Telemetry.h" + + #include "mozilla/WidgetUtils.h" ++#include "mozilla/GeolocationService.h" + + #include "mozilla/dom/AutoEntryScript.h" + #include "mozilla/dom/ChildProcessChannelListener.h" +@@ -64,6 +71,7 @@ #include "mozilla/dom/DocGroup.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/FragmentDirective.h" @@ -278,7 +286,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 #include "mozilla/dom/HTMLAnchorElement.h" #include "mozilla/dom/HTMLIFrameElement.h" #include "mozilla/dom/Navigation.h" -@@ -96,6 +103,7 @@ +@@ -96,6 +104,7 @@ #include "mozilla/dom/DocumentBinding.h" #include "mozilla/glean/DocshellMetrics.h" #include "mozilla/ipc/ProtocolUtils.h" @@ -286,7 +294,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 #include "mozilla/net/DocumentChannel.h" #include "mozilla/net/DocumentChannelChild.h" #include "mozilla/net/ParentChannelWrapper.h" -@@ -120,6 +128,7 @@ +@@ -120,6 +129,7 @@ #include "nsIDocumentViewer.h" #include "mozilla/dom/Document.h" #include "nsHTMLDocument.h" @@ -294,7 +302,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 #include "nsIDocumentLoaderFactory.h" #include "nsIDOMWindow.h" #include "nsIEditingSession.h" -@@ -215,6 +224,7 @@ +@@ -216,6 +226,7 @@ #include "nsGlobalWindowInner.h" #include "nsGlobalWindowOuter.h" #include "nsJSEnvironment.h" @@ -302,7 +310,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 #include "nsNetCID.h" #include "nsNetUtil.h" #include "nsObjectLoadingContent.h" -@@ -355,6 +365,14 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext, +@@ -356,6 +367,14 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext, mAllowDNSPrefetch(true), mAllowWindowControl(true), mCSSErrorReportingEnabled(false), @@ -317,7 +325,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 mAllowAuth(mItemType == typeContent), mAllowKeywordFixup(false), mDisableMetaRefreshWhenInactive(false), -@@ -2976,6 +2994,174 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) { +@@ -2978,6 +2997,174 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) { return NS_OK; } @@ -415,7 +423,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 + ToSupports(element), "juggler-file-picker-shown", nullptr); +} + -+RefPtr nsDocShell::GetGeolocationServiceOverride() { ++RefPtr nsDocShell::GetGeolocationServiceOverride() { + return GetRootDocShell()->mGeolocationServiceOverride; +} + @@ -423,8 +431,8 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 +nsDocShell::SetGeolocationOverride(nsIDOMGeoPosition* aGeolocationOverride) { + if (aGeolocationOverride) { + if (!mGeolocationServiceOverride) { -+ mGeolocationServiceOverride = new nsGeolocationService(); -+ mGeolocationServiceOverride->Init(); ++ mGeolocationServiceOverride = new GeolocationService(); ++ mGeolocationServiceOverride->Init(true /* isOverride */); + } + mGeolocationServiceOverride->Update(aGeolocationOverride); + } else { @@ -492,7 +500,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 NS_IMETHODIMP nsDocShell::GetIsNavigating(bool* aOut) { *aOut = mIsNavigating; -@@ -4655,7 +4841,7 @@ nsDocShell::GetVisibility(bool* aVisibility) { +@@ -4671,7 +4858,7 @@ nsDocShell::GetVisibility(bool* aVisibility) { } void nsDocShell::ActivenessMaybeChanged() { @@ -501,7 +509,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 if (RefPtr presShell = GetPresShell()) { presShell->ActivenessMaybeChanged(); } -@@ -7651,6 +7837,12 @@ nsresult nsDocShell::PerformRetargeting(nsDocShellLoadState* aLoadState) { +@@ -7686,6 +7873,12 @@ nsresult nsDocShell::PerformRetargeting(nsDocShellLoadState* aLoadState) { true, // aForceNoOpener getter_AddRefs(newBC)); MOZ_ASSERT(!newBC); @@ -514,7 +522,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 return rv; } -@@ -8883,6 +9075,16 @@ nsresult nsDocShell::InternalLoad(nsDocShellLoadState* aLoadState, +@@ -8926,6 +9119,16 @@ nsresult nsDocShell::InternalLoad(nsDocShellLoadState* aLoadState, attrs.SetFirstPartyDomain(isTopLevelDoc, aLoadState->URI()); nsCOMPtr req; @@ -531,7 +539,7 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 rv = DoURILoad(aLoadState, aCacheKey, getter_AddRefs(req)); if (NS_SUCCEEDED(rv)) { -@@ -12019,6 +12221,9 @@ class OnLinkClickEvent : public Runnable { +@@ -12036,6 +12239,9 @@ class OnLinkClickEvent : public CancelableRunnable, public SupportsWeakPtr { mHandler->OnLinkClickSync(mContent, mLoadState, mNoOpenerImplied, mTriggeringPrincipal); } @@ -541,20 +549,32 @@ index 275d0ce1d33e7aa887eebeadac786aac44e0ba10..bff2b58d2169bbd40aa4ac48c656d7f9 return NS_OK; } -@@ -12136,6 +12341,8 @@ nsresult nsDocShell::OnLinkClick( +@@ -12107,6 +12313,11 @@ nsresult nsDocShell::OnFormSubmit(HTMLFormElement* aForm, + return OnLinkClickSync(aForm, aLoadState, false, aForm->NodePrincipal()); + } + ++ nsCOMPtr observerService = ++ mozilla::services::GetObserverService(); ++ observerService->NotifyObservers(ToSupports(aForm), "juggler-link-click", ++ nullptr); ++ + auto result = OnLinkClickWithLoadState(aForm, aLoadState, false, + aForm->NodePrincipal()); + if (result.isErr()) { +@@ -12245,6 +12456,8 @@ nsresult nsDocShell::OnLinkClick( + ownerDoc->GetScriptTrackingFlags()); + loadState->SetHistoryBehavior(NavigationHistoryBehavior::Auto); - RefPtr ev = MakeRefPtr( - this, aContent, loadState, noOpenerImplied, aTriggeringPrincipal); + nsCOMPtr observerService = mozilla::services::GetObserverService(); + observerService->NotifyObservers(ToSupports(aContent), "juggler-link-click", nullptr); - return Dispatch(ev.forget()); - } - + auto result = OnLinkClickWithLoadState(aContent, loadState, noOpenerImplied, + aTriggeringPrincipal); + return result.isErr() ? result.unwrapErr() : NS_OK; diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h -index aa834b35a1fb2ff6fe3cdd6de9582e48da510be5..ee2f86ddd28a9e18ee33cf509438b5f28cc8c952 100644 +index 5b17b1b5a7b61f6032ad05fbc65fb6672a64c09c..008d49bd6d6f1a8e7290ca1b59a8babe988dfd9f 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h -@@ -15,6 +15,7 @@ +@@ -16,6 +16,7 @@ #include "mozilla/dom/BrowsingContext.h" #include "mozilla/dom/NavigationBinding.h" #include "mozilla/dom/SessionHistoryEntry.h" @@ -562,15 +582,15 @@ index aa834b35a1fb2ff6fe3cdd6de9582e48da510be5..ee2f86ddd28a9e18ee33cf509438b5f2 #include "mozilla/dom/WindowProxyHolder.h" #include "nsCOMPtr.h" #include "nsCharsetSource.h" -@@ -84,6 +85,7 @@ class nsCommandManager; - class nsDocShellEditorData; - class nsDOMNavigationTiming; - class nsDSURIContentListener; -+class nsGeolocationService; - class nsGlobalWindowOuter; +@@ -42,6 +43,7 @@ - class FramingChecker; -@@ -397,6 +399,15 @@ class nsDocShell final : public nsDocLoader, + namespace mozilla { + class Encoding; ++class GeolocationService; + class HTMLEditor; + class ObservedDocShell; + class ScrollContainerFrame; +@@ -383,6 +385,15 @@ class nsDocShell final : public nsDocLoader, void SetWillChangeProcess() { mWillChangeProcess = true; } bool WillChangeProcess() { return mWillChangeProcess; } @@ -581,12 +601,12 @@ index aa834b35a1fb2ff6fe3cdd6de9582e48da510be5..ee2f86ddd28a9e18ee33cf509438b5f2 + + bool IsBypassCSPEnabled(); + -+ RefPtr GetGeolocationServiceOverride(); ++ RefPtr GetGeolocationServiceOverride(); + // Creates a real network channel (not a DocumentChannel) using the specified // parameters. // Used by nsDocShell when not using DocumentChannel, by DocumentLoadListener -@@ -988,6 +999,8 @@ class nsDocShell final : public nsDocLoader, +@@ -1000,6 +1011,8 @@ class nsDocShell final : public nsDocLoader, bool CSSErrorReportingEnabled() const { return mCSSErrorReportingEnabled; } @@ -595,7 +615,7 @@ index aa834b35a1fb2ff6fe3cdd6de9582e48da510be5..ee2f86ddd28a9e18ee33cf509438b5f2 // Handles retrieval of subframe session history for nsDocShell::LoadURI. If a // load is requested in a subframe of the current DocShell, the subframe // loadType may need to reflect the loadType of the parent document, or in -@@ -1299,6 +1312,16 @@ class nsDocShell final : public nsDocLoader, +@@ -1323,6 +1336,16 @@ class nsDocShell final : public nsDocLoader, bool mAllowDNSPrefetch : 1; bool mAllowWindowControl : 1; bool mCSSErrorReportingEnabled : 1; @@ -604,7 +624,7 @@ index aa834b35a1fb2ff6fe3cdd6de9582e48da510be5..ee2f86ddd28a9e18ee33cf509438b5f2 + bool mBypassCSPEnabled : 1; + bool mForceActiveState : 1; + bool mDisallowBFCache : 1; -+ RefPtr mGeolocationServiceOverride; ++ RefPtr mGeolocationServiceOverride; + ReducedMotionOverride mReducedMotionOverride; + ForcedColorsOverride mForcedColorsOverride; + ContrastOverride mContrastOverride; @@ -613,7 +633,7 @@ index aa834b35a1fb2ff6fe3cdd6de9582e48da510be5..ee2f86ddd28a9e18ee33cf509438b5f2 bool mAllowKeywordFixup : 1; bool mDisableMetaRefreshWhenInactive : 1; diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl -index 4aa56b4ce16915d334f32c18953604765699e05a..ef80a46511d870c909dda6182e332c155a8e250c 100644 +index db0721841de3732d297b1ca31ae009e9e6a5356b..2c95a3ebbc437d31d393b5243b923f4f6a1f3483 100644 --- a/docshell/base/nsIDocShell.idl +++ b/docshell/base/nsIDocShell.idl @@ -43,6 +43,7 @@ interface nsIURI; @@ -667,10 +687,10 @@ index 4aa56b4ce16915d334f32c18953604765699e05a..ef80a46511d870c909dda6182e332c15 * This attempts to save any applicable layout history state (like * scroll position) in the nsISHEntry. This is normally done diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp -index 1081a150609c6068cde605228da6e95f84f06d6b..f51d5f53ea1d8985e7f75e4aba2a6996ac594d21 100644 +index 9602541b0cb109fdfb0051ac0419f1a2b3d9527e..50e4b92b62e557880d6e75dfeda5a3f1e5528838 100644 --- a/dom/base/Document.cpp +++ b/dom/base/Document.cpp -@@ -3655,6 +3655,9 @@ void Document::SendToConsole(nsCOMArray& aMessages) { +@@ -3845,6 +3845,9 @@ void Document::SendToConsole(nsCOMArray& aMessages) { } void Document::ApplySettingsFromCSP(bool aSpeculative) { @@ -680,7 +700,7 @@ index 1081a150609c6068cde605228da6e95f84f06d6b..f51d5f53ea1d8985e7f75e4aba2a6996 nsresult rv = NS_OK; if (!aSpeculative) { nsIContentSecurityPolicy* csp = PolicyContainer::GetCSP(mPolicyContainer); -@@ -3752,6 +3755,11 @@ nsresult Document::InitCSP(nsIChannel* aChannel) { +@@ -3942,6 +3945,11 @@ nsresult Document::InitCSP(nsIChannel* aChannel) { MOZ_ASSERT(mPolicyContainer, "Policy container must be initialized before CSP!"); @@ -692,7 +712,7 @@ index 1081a150609c6068cde605228da6e95f84f06d6b..f51d5f53ea1d8985e7f75e4aba2a6996 // If this is a data document - no need to set CSP. if (mLoadedAsData) { return NS_OK; -@@ -4722,6 +4730,10 @@ bool Document::HasFocus(ErrorResult& rv) const { +@@ -4923,6 +4931,10 @@ bool Document::HasFocus(ErrorResult& rv) const { return false; } @@ -704,10 +724,10 @@ index 1081a150609c6068cde605228da6e95f84f06d6b..f51d5f53ea1d8985e7f75e4aba2a6996 return false; } diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp -index 079746f77996ca03464c8f30b00cd34817b8430d..770a58853159c5d4972aab6002ab68254ee22360 100644 +index 818005d2cf111f84d891d7f4f925fbaa193ad873..ccf2153d03a77e322d9d771cbce2ec4758718ac4 100644 --- a/dom/base/Navigator.cpp +++ b/dom/base/Navigator.cpp -@@ -2381,7 +2381,8 @@ bool Navigator::Webdriver() { +@@ -2371,7 +2371,8 @@ bool Navigator::Webdriver() { } #endif @@ -718,10 +738,10 @@ index 079746f77996ca03464c8f30b00cd34817b8430d..770a58853159c5d4972aab6002ab6825 AutoplayPolicy Navigator::GetAutoplayPolicy(AutoplayPolicyMediaType aType) { diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp -index 55a786dd5bb66d2bb51568407bc942c8ac2e5fe4..c73e34868b03a11b44d195f419fb3fb2e7869965 100644 +index d5c7b398dfb967c4cf283264857c3037fa47f16f..9e1a463705fe962c4266463df1aebb18b914fbfc 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp -@@ -9873,6 +9873,7 @@ Result nsContentUtils::SynthesizeMouseEvent( +@@ -10380,6 +10380,7 @@ Result nsContentUtils::SynthesizeMouseEvent( EventMessage msg; Maybe exitFrom; bool contextMenuKey = false; @@ -729,7 +749,7 @@ index 55a786dd5bb66d2bb51568407bc942c8ac2e5fe4..c73e34868b03a11b44d195f419fb3fb2 if (aType.EqualsLiteral("mousedown")) { msg = eMouseDown; } else if (aType.EqualsLiteral("mouseup")) { -@@ -9899,13 +9900,26 @@ Result nsContentUtils::SynthesizeMouseEvent( +@@ -10406,13 +10407,26 @@ Result nsContentUtils::SynthesizeMouseEvent( msg = eMouseHitTest; } else if (aType.EqualsLiteral("MozMouseExploreByTouch")) { msg = eMouseExploreByTouch; @@ -757,7 +777,7 @@ index 55a786dd5bb66d2bb51568407bc942c8ac2e5fe4..c73e34868b03a11b44d195f419fb3fb2 if (MOZ_UNLIKELY(aOptions.mIsWidgetEventSynthesized)) { MOZ_ASSERT_UNREACHABLE( "The event shouldn't be dispatched as a synthesized event"); -@@ -9933,6 +9947,7 @@ Result nsContentUtils::SynthesizeMouseEvent( +@@ -10440,6 +10454,7 @@ Result nsContentUtils::SynthesizeMouseEvent( mozilla::widget::AutoSynthesizedEventCallbackNotifier notifier(callback); WidgetMouseEvent& mouseOrPointerEvent = @@ -765,7 +785,7 @@ index 55a786dd5bb66d2bb51568407bc942c8ac2e5fe4..c73e34868b03a11b44d195f419fb3fb2 pointerEvent.isSome() ? pointerEvent.ref() : mouseEvent.ref(); mouseOrPointerEvent.pointerId = aMouseEventData.mIdentifier; mouseOrPointerEvent.mModifiers = -@@ -9958,6 +9973,7 @@ Result nsContentUtils::SynthesizeMouseEvent( +@@ -10465,6 +10480,7 @@ Result nsContentUtils::SynthesizeMouseEvent( aOptions.mIsDOMEventSynthesized; mouseOrPointerEvent.mExitFrom = std::move(exitFrom); mouseOrPointerEvent.mCallbackId = notifier.SaveCallback(); @@ -774,10 +794,10 @@ index 55a786dd5bb66d2bb51568407bc942c8ac2e5fe4..c73e34868b03a11b44d195f419fb3fb2 nsPresContext* presContext = aPresShell->GetPresContext(); if (!presContext) { diff --git a/dom/base/nsFocusManager.cpp b/dom/base/nsFocusManager.cpp -index ed255ae7f0f3c3465f4d38a8af2a7899e0dbf3b9..aa60b5bdc059121ac7a9163a40f0d9d23afa5195 100644 +index c9a6ee9c507129ab6fdd1deca98b368eb48170d5..a312a2d1bfdc1d6551d78242b1ddf03975249408 100644 --- a/dom/base/nsFocusManager.cpp +++ b/dom/base/nsFocusManager.cpp -@@ -1875,6 +1875,10 @@ Maybe nsFocusManager::SetFocusInner(Element* aNewContent, +@@ -1867,6 +1867,10 @@ Maybe nsFocusManager::SetFocusInner(Element* aNewContent, (GetActiveBrowsingContext() == newRootBrowsingContext); } @@ -788,7 +808,7 @@ index ed255ae7f0f3c3465f4d38a8af2a7899e0dbf3b9..aa60b5bdc059121ac7a9163a40f0d9d2 // Exit fullscreen if a website focuses another window if (StaticPrefs::full_screen_api_exit_on_windowRaise() && !isElementInActiveWindow && (aFlags & FLAG_RAISE)) { -@@ -2436,6 +2440,7 @@ bool nsFocusManager::BlurImpl(BrowsingContext* aBrowsingContextToClear, +@@ -2428,6 +2432,7 @@ bool nsFocusManager::BlurImpl(BrowsingContext* aBrowsingContextToClear, bool aIsLeavingDocument, bool aAdjustWidget, bool aRemainActive, Element* aElementToFocus, uint64_t aActionId) { @@ -796,7 +816,7 @@ index ed255ae7f0f3c3465f4d38a8af2a7899e0dbf3b9..aa60b5bdc059121ac7a9163a40f0d9d2 LOGFOCUS(("<>", aActionId)); // hold a reference to the focused content, which may be null -@@ -2479,6 +2484,11 @@ bool nsFocusManager::BlurImpl(BrowsingContext* aBrowsingContextToClear, +@@ -2471,6 +2476,11 @@ bool nsFocusManager::BlurImpl(BrowsingContext* aBrowsingContextToClear, return true; } @@ -808,7 +828,7 @@ index ed255ae7f0f3c3465f4d38a8af2a7899e0dbf3b9..aa60b5bdc059121ac7a9163a40f0d9d2 // Keep a ref to presShell since dispatching the DOM event may cause // the document to be destroyed. RefPtr presShell = docShell->GetPresShell(); -@@ -3181,7 +3191,9 @@ void nsFocusManager::RaiseWindow(nsPIDOMWindowOuter* aWindow, +@@ -3180,7 +3190,9 @@ void nsFocusManager::RaiseWindow(nsPIDOMWindowOuter* aWindow, } } @@ -820,10 +840,10 @@ index ed255ae7f0f3c3465f4d38a8af2a7899e0dbf3b9..aa60b5bdc059121ac7a9163a40f0d9d2 // care of lowering the present active window. This happens in // a separate runnable to avoid touching multiple windows in diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp -index 0fbb9d9e11c72f862d5777a0554a142336f8f17f..80ce0fc7a1b42722eb55a4a2e03af4022126a374 100644 +index b9caf10ddbecb6c3ac5d5483403a09243befcde1..7a3d9923405cee8eb4936d028c2df2c933d3293e 100644 --- a/dom/base/nsGlobalWindowOuter.cpp +++ b/dom/base/nsGlobalWindowOuter.cpp -@@ -2535,10 +2535,16 @@ nsresult nsGlobalWindowOuter::SetNewDocument(Document* aDocument, +@@ -2534,10 +2534,16 @@ nsresult nsGlobalWindowOuter::SetNewDocument(Document* aDocument, }(); if (!isAboutBlankInChromeDocshell) { @@ -844,7 +864,7 @@ index 0fbb9d9e11c72f862d5777a0554a142336f8f17f..80ce0fc7a1b42722eb55a4a2e03af402 } } -@@ -2658,6 +2664,19 @@ void nsGlobalWindowOuter::DispatchDOMWindowCreated() { +@@ -2657,6 +2663,19 @@ void nsGlobalWindowOuter::DispatchDOMWindowCreated() { } } @@ -877,10 +897,10 @@ index fa95821e51984beb7e4672bb82038adb0f8e97d2..08b765dfee64001bde59f99704046246 // Outer windows only. virtual void EnsureSizeAndPositionUpToDate() override; diff --git a/dom/base/nsINode.cpp b/dom/base/nsINode.cpp -index 5b21525de8dc0cc86bd14e2b36fcd9f0059a030a..65c6027e614bb8566a7a24bac6a7b75aa93d4032 100644 +index d1564d960952c0c2b4caf9c485309f7ddfb52257..eff181a2fd215bd3e9d3d5703012e9fa3fdf4a4d 100644 --- a/dom/base/nsINode.cpp +++ b/dom/base/nsINode.cpp -@@ -1803,6 +1803,61 @@ void nsINode::GetBoxQuadsFromWindowOrigin(const BoxQuadOptions& aOptions, +@@ -1980,6 +1980,61 @@ void nsINode::GetBoxQuadsFromWindowOrigin(const BoxQuadOptions& aOptions, mozilla::GetBoxQuadsFromWindowOrigin(this, aOptions, aResult, aRv); } @@ -943,10 +963,10 @@ index 5b21525de8dc0cc86bd14e2b36fcd9f0059a030a..65c6027e614bb8566a7a24bac6a7b75a DOMQuad& aQuad, const GeometryNode& aFrom, const ConvertCoordinateOptions& aOptions, CallerType aCallerType, diff --git a/dom/base/nsINode.h b/dom/base/nsINode.h -index 4c882db32fb458c4e88dc35cdf6ea4c2ce6675f0..0b5ad5cb09b36bde91ddf5390e2e520c76bf6f49 100644 +index 271c98870e2ed923dfde62635de9557eda90864c..16c69324c83735792894130bf1a8728e16d8d0b0 100644 --- a/dom/base/nsINode.h +++ b/dom/base/nsINode.h -@@ -2551,6 +2551,10 @@ class nsINode : public mozilla::dom::EventTarget { +@@ -3057,6 +3057,10 @@ class nsINode : public mozilla::dom::EventTarget { nsTArray>& aResult, ErrorResult& aRv); @@ -958,7 +978,7 @@ index 4c882db32fb458c4e88dc35cdf6ea4c2ce6675f0..0b5ad5cb09b36bde91ddf5390e2e520c DOMQuad& aQuad, const TextOrElementOrDocument& aFrom, const ConvertCoordinateOptions& aOptions, CallerType aCallerType, diff --git a/dom/chrome-webidl/BrowsingContext.webidl b/dom/chrome-webidl/BrowsingContext.webidl -index d0508a8c29e5bd008213f781beb8eb1fcb458fb8..518580aa7a2eb355f690d904d091e80c34a98912 100644 +index 91b2d3ccaad070d887b609ef5a92147cc16a4d12..35c581dd07c3f6defc4ad87f27456189d057b4ff 100644 --- a/dom/chrome-webidl/BrowsingContext.webidl +++ b/dom/chrome-webidl/BrowsingContext.webidl @@ -72,6 +72,17 @@ enum PrefersReducedMotionOverride { @@ -990,10 +1010,10 @@ index d0508a8c29e5bd008213f781beb8eb1fcb458fb8..518580aa7a2eb355f690d904d091e80c * A unique identifier for the browser element that is hosting this * BrowsingContext tree. Every BrowsingContext in the element's tree will diff --git a/dom/events/EventStateManager.cpp b/dom/events/EventStateManager.cpp -index f95ba91a36f5b4ac906a2d37a814d6eb42b31151..8e373d2e6eee50f60aa12c2651bf8c3fc7c35b8a 100644 +index c1f865f86435f58b29c582005f60eab739548de5..552e5358951786d6d446cc5b0b0b7d39445409cd 100644 --- a/dom/events/EventStateManager.cpp +++ b/dom/events/EventStateManager.cpp -@@ -2104,6 +2104,25 @@ static BrowserParent* GetBrowserParentAncestor(BrowserParent* aBrowserParent) { +@@ -2110,6 +2110,25 @@ static BrowserParent* GetBrowserParentAncestor(BrowserParent* aBrowserParent) { return bbp->Manager(); } @@ -1019,7 +1039,7 @@ index f95ba91a36f5b4ac906a2d37a814d6eb42b31151..8e373d2e6eee50f60aa12c2651bf8c3f static void DispatchCrossProcessMouseExitEvents(WidgetMouseEvent* aMouseEvent, BrowserParent* aRemoteTarget, BrowserParent* aStopAncestor, -@@ -2227,7 +2246,7 @@ void EventStateManager::DispatchCrossProcessEvent(WidgetEvent* aEvent, +@@ -2233,7 +2252,7 @@ void EventStateManager::DispatchCrossProcessEvent(WidgetEvent* aEvent, if (mouseEvent->mReason == WidgetMouseEvent::eReal && remote != oldRemote) { MOZ_ASSERT(mouseEvent->mMessage != eMouseExitFromWidget); @@ -1048,15 +1068,15 @@ index 180065668131acf3738117c84b6a11117fcb6979..a4a77ca8e006fb298769270bb3342ff4 auto& args = mArgs.as(); mFetchDriver->SetWorkerScript(args.mWorkerScript); diff --git a/dom/geolocation/Geolocation.cpp b/dom/geolocation/Geolocation.cpp -index 87b78f8d13a1a118eedb032d8feaf7d371e13844..f768f0549659263bc714b6339f9df859a1e33f9b 100644 +index 51efcf97c062e106575b88232a14f1702470fddf..1c68b997e4efd8896ec182e962c9e085ab24e7c7 100644 --- a/dom/geolocation/Geolocation.cpp +++ b/dom/geolocation/Geolocation.cpp -@@ -120,8 +120,12 @@ class nsGeolocationRequest final : public ContentPermissionRequestBase, +@@ -103,8 +103,12 @@ class nsGeolocationRequest final : public ContentPermissionRequestBase, NS_IMETHOD GetIgnoreAllowSitePermission( bool* aIgnoreAllowSitePermission) override { -+ RefPtr gs = -+ nsGeolocationService::GetGeolocationService( ++ RefPtr gs = ++ GeolocationService::GetGeolocationService( + mLocator->GetBrowsingContext()); *aIgnoreAllowSitePermission = - mBehavior != geolocation::SystemGeolocationPermissionBehavior::NoPrompt; @@ -1065,99 +1085,30 @@ index 87b78f8d13a1a118eedb032d8feaf7d371e13844..f768f0549659263bc714b6339f9df859 return NS_OK; } -@@ -410,7 +414,9 @@ nsGeolocationRequest::Allow(JS::Handle aChoices) { +@@ -393,7 +397,11 @@ nsGeolocationRequest::Allow(JS::Handle aChoices) { self->Cancel(); }; - if (mBehavior != SystemGeolocationPermissionBehavior::NoPrompt) { -+ RefPtr gs = nsGeolocationService::GetGeolocationService( -+ mLocator->GetBrowsingContext()); -+ if (mBehavior != SystemGeolocationPermissionBehavior::NoPrompt && !gs->IsOverride()) { ++ RefPtr gs = ++ GeolocationService::GetGeolocationService( ++ mLocator->GetBrowsingContext()); ++ if (mBehavior != SystemGeolocationPermissionBehavior::NoPrompt && ++ !gs->IsOverride()) { // Asynchronously present the system dialog or open system preferences // (RequestGeolocationPermissionFromUser will know which to do), and wait // for the permission to change or the request to be canceled. If the -@@ -434,8 +440,6 @@ nsGeolocationRequest::Allow(JS::Handle aChoices) { +@@ -417,8 +425,6 @@ nsGeolocationRequest::Allow(JS::Handle aChoices) { return NS_OK; } -- RefPtr gs = nsGeolocationService::GetGeolocationService( -- mLocator->GetBrowsingContext()); +- RefPtr gs = +- GeolocationService::GetGeolocationService(mLocator->GetBrowsingContext()); bool canUseCache = false; CachedPositionAndAccuracy lastPosition = gs->GetCachedPosition(); if (lastPosition.position) { -@@ -722,11 +726,16 @@ NS_INTERFACE_MAP_END - NS_IMPL_ADDREF(nsGeolocationService) - NS_IMPL_RELEASE(nsGeolocationService) - --nsresult nsGeolocationService::Init() { -+nsresult nsGeolocationService::Init(bool isOverride) { - if (!StaticPrefs::geo_enabled()) { - return NS_ERROR_FAILURE; - } - -+ if (isOverride) { -+ mIsOverride = true; -+ mHigherAccuracy = true; -+ } -+ - if (XRE_IsContentProcess()) { - return NS_OK; - } -@@ -805,6 +814,10 @@ nsresult nsGeolocationService::Init() { - return NS_OK; - } - -+bool nsGeolocationService::IsOverride() { -+ return mIsOverride; -+} -+ - nsGeolocationService::~nsGeolocationService() = default; - - NS_IMETHODIMP -@@ -948,6 +961,10 @@ bool nsGeolocationService::HighAccuracyRequested() { - } - - void nsGeolocationService::UpdateAccuracy(bool aForceHigh) { -+ if (mIsOverride) { -+ return; -+ } -+ - bool highRequired = aForceHigh || HighAccuracyRequested(); - - if (XRE_IsContentProcess()) { -diff --git a/dom/geolocation/Geolocation.h b/dom/geolocation/Geolocation.h -index 0e1d90608d55db6a3d39c730d40efa2e708a4c4a..5d49528d5925b4f9ab55531efd694f355bf5a42d 100644 ---- a/dom/geolocation/Geolocation.h -+++ b/dom/geolocation/Geolocation.h -@@ -63,7 +63,7 @@ class nsGeolocationService final : public nsIGeolocationUpdate, - - nsGeolocationService() = default; - -- nsresult Init(); -+ nsresult Init(bool isOverride = false); - - // Management of the Geolocation objects - void AddLocator(mozilla::dom::Geolocation* aLocator); -@@ -88,6 +88,8 @@ class nsGeolocationService final : public nsIGeolocationUpdate, - void UpdateAccuracy(bool aForceHigh = false); - bool HighAccuracyRequested(); - -+ bool IsOverride(); -+ - private: - ~nsGeolocationService(); - -@@ -114,6 +116,8 @@ class nsGeolocationService final : public nsIGeolocationUpdate, - // Nothing() if not being started, or a boolean reflecting the requested - // accuracy. - mozilla::Maybe mStarting; -+ -+ bool mIsOverride = false; - }; - - namespace mozilla::dom { diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp -index 45fa91a01ee24014c33396b4e057a797c72377b2..5e44eea99d06d2688e196ba1eb62eb1766b3cb70 100644 +index 1e697e9ced01c1ac64348fcf375821b405ad3e2a..a23d9ac19eabe70affbf79835d3612cdcfdb6727 100644 --- a/dom/html/HTMLInputElement.cpp +++ b/dom/html/HTMLInputElement.cpp @@ -60,6 +60,7 @@ @@ -1477,10 +1428,10 @@ index 584d39da5f04f6d8fc6a87547557b0eeeb35d168..65eb7014356a90aa01ab517c9937ed65 * returned quads are further translated relative to the window * origin -- which is not the layout origin. Further translation diff --git a/dom/webidl/Window.webidl b/dom/webidl/Window.webidl -index ae2d14e105bc70dc4a5c7f1fa3481c550a74dd4d..83f090b0512dbf2fde42e152838d4bd8315e6616 100644 +index 87efe769a8e2d2f8d3502957127de50aed1e9971..b8545e4c788bbee7b1d53efff081289831abd1cf 100644 --- a/dom/webidl/Window.webidl +++ b/dom/webidl/Window.webidl -@@ -442,6 +442,8 @@ dictionary SynthesizeMouseEventOptions : SynthesizeEventOptions { +@@ -444,6 +444,8 @@ dictionary SynthesizeMouseEventOptions : SynthesizeEventOptions { boolean ignoreRootScrollFrame = false; // Controls WidgetMouseEvent.mReason value. boolean isWidgetEventSynthesized = false; @@ -1489,11 +1440,56 @@ index ae2d14e105bc70dc4a5c7f1fa3481c550a74dd4d..83f090b0512dbf2fde42e152838d4bd8 }; // Mozilla-specific stuff +diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp +index 8c88d73aa9c65ea858e2e1a475f40a4e0dd7edd2..7058eb325322c4fe19704e9fe3aa30ad38e21340 100644 +--- a/dom/workers/ScriptLoader.cpp ++++ b/dom/workers/ScriptLoader.cpp +@@ -1169,6 +1169,14 @@ bool WorkerScriptLoader::EvaluateScript(JSContext* aCx, + mWorkerRef->Private()->AssertIsOnWorkerThread(); + MOZ_ASSERT(!IsDynamicImport(aRequest)); + ++ // ----- Playwright begin ----- ++ ++mEvaluatingScriptCount; ++ auto decrementEvaluatingCount = MakeScopeExit([&] { ++ MOZ_ASSERT(mEvaluatingScriptCount > 0); ++ --mEvaluatingScriptCount; ++ }); ++ // ----- Playwright end ------- ++ + WorkerLoadContext* loadContext = aRequest->GetWorkerLoadContext(); + + NS_ASSERTION(!loadContext->mChannel, "Should no longer have a channel!"); +diff --git a/dom/workers/ScriptLoader.h b/dom/workers/ScriptLoader.h +index 6ea3f0a9ed4f1e31a36e9657010b694177bd79d3..496b805f198f266751f0cc9fc64035ba81be11cc 100644 +--- a/dom/workers/ScriptLoader.h ++++ b/dom/workers/ScriptLoader.h +@@ -157,6 +157,10 @@ class WorkerScriptLoader : public JS::loader::ScriptLoaderInterface, + bool mExecutionAborted = false; + bool mMutedErrorFlag = false; + ++ // ----- Playwright begin ----- ++ uint32_t mEvaluatingScriptCount = 0; ++ // ----- Playwright end ------- ++ + // Count of loading module requests. mLoadingRequests doesn't keep track of + // child module requests. + // This member should be accessed on worker thread. +@@ -228,7 +232,9 @@ class WorkerScriptLoader : public JS::loader::ScriptLoaderInterface, + bool ProcessPendingRequests(JSContext* aCx); + + bool AllScriptsExecuted() { +- return mLoadingRequests.isEmpty() && mLoadedRequests.isEmpty(); ++ // https://github.com/microsoft/playwright/issues/42565 ++ return mEvaluatingScriptCount == 0 && mLoadingRequests.isEmpty() && ++ mLoadedRequests.isEmpty(); + } + + bool IsDebuggerScript() const { return mWorkerScriptType == DebuggerScript; } diff --git a/js/src/debugger/Object.cpp b/js/src/debugger/Object.cpp -index 57cd28a445025fb9f3a18ce7083ee683069015f0..398b82832bbf373d443b846b7b5cd4d10888d2a3 100644 +index 29e128ec723f557292f8ed0a2fc338503002f238..270ee326e169889ef5bb42dff4c3ac6eda6f0f01 100644 --- a/js/src/debugger/Object.cpp +++ b/js/src/debugger/Object.cpp -@@ -2510,7 +2510,11 @@ Maybe DebuggerObject::call(JSContext* cx, +@@ -2623,7 +2623,11 @@ Maybe DebuggerObject::call(JSContext* cx, invokeArgs[i].set(args2[i]); } @@ -1506,10 +1502,10 @@ index 57cd28a445025fb9f3a18ce7083ee683069015f0..398b82832bbf373d443b846b7b5cd4d1 } diff --git a/js/src/vm/DateTime.cpp b/js/src/vm/DateTime.cpp -index 50657afb4aaf2305b01b581ee09eb9ea712b2614..38384eea6216358b40e8440fa2a78a17fca83592 100644 +index 51d1d54ee7ed08739242913a607eac8d20655213..f5f9642ef3b4fe5c7c9b01ed88bb2666a1e20605 100644 --- a/js/src/vm/DateTime.cpp +++ b/js/src/vm/DateTime.cpp -@@ -810,7 +810,6 @@ void js::DateTimeInfo::internalResyncICUDefaultTimeZone() { +@@ -809,7 +809,6 @@ void js::DateTimeInfo::internalResyncICUDefaultTimeZone() { #if JS_HAS_INTL_API if (const char* tzenv = std::getenv("TZ")) { std::string_view tz(tzenv); @@ -1569,10 +1565,10 @@ index eaaf69687f669a4859a37f3f97b99e6ca519c420..6f965a110db3a1c86466d72f09ead23b // No boxes to return return; diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp -index 5b52c35994ce5167fc07b31ed9adb9b2ecc1df32..906f8c6e7a7736eed6ba149fd4a142b53522dbc9 100644 +index 0be20c4ea8b91424a98659d991038b1e5c7f1e4a..5f497118bf3c2e4e7405d82732b49acadce45a8a 100644 --- a/layout/base/PresShell.cpp +++ b/layout/base/PresShell.cpp -@@ -11835,7 +11835,9 @@ bool PresShell::ComputeActiveness() const { +@@ -11948,7 +11948,9 @@ bool PresShell::ComputeActiveness() const { if (!browserChild->IsVisible()) { MOZ_LOG(gLog, LogLevel::Debug, (" > BrowserChild %p is not visible", browserChild)); @@ -1584,10 +1580,10 @@ index 5b52c35994ce5167fc07b31ed9adb9b2ecc1df32..906f8c6e7a7736eed6ba149fd4a142b5 // If the browser is visible but just due to be preserving layers diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp -index aa6ef4435df02bad54e195607c5da02bd7ed315a..c7a3f02bf30704c53a3c6a619b2dfbee02edb0c2 100644 +index 22f2b63b9dc1a59bb6ca23f152faf42aa164f79c..17b22da2cce054b793780096fbfa10bb65b8afe8 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp -@@ -702,6 +702,7 @@ bool nsLayoutUtils::AllowZoomingForDocument( +@@ -701,6 +701,7 @@ bool nsLayoutUtils::AllowZoomingForDocument(const Document* aDocument) { !aDocument->GetPresShell()->AsyncPanZoomEnabled()) { return false; } @@ -1596,10 +1592,10 @@ index aa6ef4435df02bad54e195607c5da02bd7ed315a..c7a3f02bf30704c53a3c6a619b2dfbee // in RDM. BrowsingContext* bc = aDocument->GetBrowsingContext(); diff --git a/layout/style/GeckoBindings.h b/layout/style/GeckoBindings.h -index b8317e006298c1345a6f13d26ca20980875e5bd1..001fd4dbe5612588857924b902cf7ccb359885e5 100644 +index 574c2683cadf77b468ca9a4250bc7bc1fbb5c8f3..30c7a89a6ed08f526089a8ab40124a980fac3089 100644 --- a/layout/style/GeckoBindings.h +++ b/layout/style/GeckoBindings.h -@@ -623,6 +623,7 @@ bool Gecko_MediaFeatures_PrefersReducedMotion(const mozilla::dom::Document*); +@@ -607,6 +607,7 @@ bool Gecko_MediaFeatures_PrefersReducedMotion(const mozilla::dom::Document*); bool Gecko_MediaFeatures_PrefersReducedTransparency( const mozilla::dom::Document*); bool Gecko_MediaFeatures_MacRTL(const mozilla::dom::Document*); @@ -1633,10 +1629,10 @@ index 1f9613b8cd936fa9d884be010a8dd6167251faa6..0346bccc1c469446376c5bee3250e3dc return StylePrefersContrast::NoPreference; } diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml -index 3d33f9916a240af4ef5b0028b23e139dc50e9851..358b8365235dad23c08ad26d7d30cde3fd9b2bc8 100644 +index 1e0f2266c6ae3b00b44499031325a6689479069e..3e7e870cbc1884eedb41c776a9b46ab55f9a3f07 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml -@@ -13315,18 +13315,20 @@ +@@ -13496,18 +13496,20 @@ # Use the libwebrtc ScreenCaptureKit desktop capture backend on Mac by default. # When disabled, or on a host where not supported (< macOS 14), the older # CoreGraphics backend is used instead. @@ -1660,10 +1656,10 @@ index 3d33f9916a240af4ef5b0028b23e139dc50e9851..358b8365235dad23c08ad26d7d30cde3 # Use the libwebrtc ScreenCaptureKit desktop capture backend on Mac for screen diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp -index a468108e7147e98f1037e751cb25bc5743a276c3..6b9fab4b6a07cdb9a54719bd7007e32368c485f6 100644 +index b37ab1f707c00065f4c7a688c3bf590bbfcd815b..cb888c7663a603744610a02e3e8cd4d680623c12 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp -@@ -752,7 +752,8 @@ LoadInfo::LoadInfo(const LoadInfo& rhs) +@@ -753,7 +753,8 @@ LoadInfo::LoadInfo(const LoadInfo& rhs) mInterceptionInfo(rhs.mInterceptionInfo), mSchemelessInput(rhs.mSchemelessInput), mUserNavigationInvolvement(rhs.mUserNavigationInvolvement), @@ -1673,7 +1669,7 @@ index a468108e7147e98f1037e751cb25bc5743a276c3..6b9fab4b6a07cdb9a54719bd7007e323 } LoadInfo::LoadInfo( -@@ -2116,4 +2117,16 @@ void LoadInfo::UpdateParentAddressSpaceInfo() { +@@ -2117,4 +2118,16 @@ void LoadInfo::UpdateParentAddressSpaceInfo() { } } @@ -1691,10 +1687,10 @@ index a468108e7147e98f1037e751cb25bc5743a276c3..6b9fab4b6a07cdb9a54719bd7007e323 + } // namespace mozilla::net diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h -index 797517e695981ddddfef253cd5eb227fd08e686d..93927bb84e4a81068b1772a913c4b405605cc063 100644 +index 837efb44f66e2cbe39e563a44a2807e55bab9312..97bd9e9be52510192e260580a6b5638af97a8d5b 100644 --- a/netwerk/base/LoadInfo.h +++ b/netwerk/base/LoadInfo.h -@@ -550,6 +550,8 @@ class LoadInfo final : public nsILoadInfo { +@@ -542,6 +542,8 @@ class LoadInfo final : public nsILoadInfo { dom::UserNavigationInvolvement::None; bool mSkipHTTPSUpgrade = false; @@ -1704,10 +1700,10 @@ index 797517e695981ddddfef253cd5eb227fd08e686d..93927bb84e4a81068b1772a913c4b405 // This is exposed solely for testing purposes and should not be used outside of // LoadInfo diff --git a/netwerk/base/TRRLoadInfo.cpp b/netwerk/base/TRRLoadInfo.cpp -index 8acc7468ae67a75c53569c8d9498b0b27d6bcaa2..5cf23f8a3906f923c0368e8cf5b8fc99df4858f5 100644 +index 9a4cf0648708633b6b826312b262df9d3b6c163f..574aceb5700b47325ef9ceafeab647b2d166a609 100644 --- a/netwerk/base/TRRLoadInfo.cpp +++ b/netwerk/base/TRRLoadInfo.cpp -@@ -555,5 +555,15 @@ TRRLoadInfo::GetFetchDestination(nsACString& aDestination) { +@@ -556,5 +556,15 @@ TRRLoadInfo::GetFetchDestination(nsACString& aDestination) { return NS_ERROR_NOT_IMPLEMENTED; } @@ -1724,10 +1720,10 @@ index 8acc7468ae67a75c53569c8d9498b0b27d6bcaa2..5cf23f8a3906f923c0368e8cf5b8fc99 } // namespace net } // namespace mozilla diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl -index f6a22a498d99ee75c7c9985e278b4331ec3eddc4..cbc8f92fabc7272a2f04b0e37214e7a51a9a0dda 100644 +index f5e892979d77d608fb499f963872076f7d122f76..f48a0d48d880453bb882d97114482dba2bf6bdbf 100644 --- a/netwerk/base/nsILoadInfo.idl +++ b/netwerk/base/nsILoadInfo.idl -@@ -1720,4 +1720,6 @@ interface nsILoadInfo : nsISupports +@@ -1704,4 +1704,6 @@ interface nsILoadInfo : nsISupports return static_cast(userNavigationInvolvement); } %} @@ -1756,10 +1752,10 @@ index 3654f3ed20f6b22d36c4238be40417e77e8f6867..f685e7668ad3310cac8bc8425124a6fe * Set the status and reason for the forthcoming synthesized response. * Multiple calls overwrite existing values. diff --git a/netwerk/ipc/DocumentLoadListener.cpp b/netwerk/ipc/DocumentLoadListener.cpp -index 1df2115be38c8e4c71635581f486c0efb0a48d2d..6a8e39d7b3504b05b463ba218b038455ff52bf2a 100644 +index 090ea90b4dbfcb47b3029142ceb9aaae04df3374..f0d161f4519841a85b38a34bb2c4c6fce893f4cc 100644 --- a/netwerk/ipc/DocumentLoadListener.cpp +++ b/netwerk/ipc/DocumentLoadListener.cpp -@@ -196,6 +196,7 @@ static auto CreateDocumentLoadInfo(CanonicalBrowsingContext* aBrowsingContext, +@@ -205,6 +205,7 @@ static auto CreateDocumentLoadInfo(CanonicalBrowsingContext* aBrowsingContext, aLoadState->GetTextDirectiveUserActivation() || aLoadState->HasLoadFlags(nsIWebNavigation::LOAD_FLAGS_FROM_EXTERNAL)); loadInfo->SetIsMetaRefresh(aLoadState->IsMetaRefresh()); @@ -1768,10 +1764,10 @@ index 1df2115be38c8e4c71635581f486c0efb0a48d2d..6a8e39d7b3504b05b463ba218b038455 return loadInfo.forget(); } diff --git a/netwerk/protocol/http/InterceptedHttpChannel.cpp b/netwerk/protocol/http/InterceptedHttpChannel.cpp -index 60626cc9b3f7495b3f0ffc13346d1319ffd86dab..99c85a483d9e325bc3f7fd86bf772968ece31724 100644 +index f094d87b789e0a9e1984aaf30718bff64f24ef94..d1f7fdaff06e62a7e96bd5c9dc6ea39d2ea593a5 100644 --- a/netwerk/protocol/http/InterceptedHttpChannel.cpp +++ b/netwerk/protocol/http/InterceptedHttpChannel.cpp -@@ -726,10 +726,33 @@ NS_IMPL_ISUPPORTS(ResetInterceptionHeaderVisitor, nsIHttpHeaderVisitor) +@@ -727,10 +727,33 @@ NS_IMPL_ISUPPORTS(ResetInterceptionHeaderVisitor, nsIHttpHeaderVisitor) } // anonymous namespace @@ -1805,7 +1801,7 @@ index 60626cc9b3f7495b3f0ffc13346d1319ffd86dab..99c85a483d9e325bc3f7fd86bf772968 if (mCanceled) { return mStatus; } -@@ -1143,11 +1166,18 @@ InterceptedHttpChannel::OnStartRequest(nsIRequest* aRequest) { +@@ -1148,11 +1171,18 @@ InterceptedHttpChannel::OnStartRequest(nsIRequest* aRequest) { GetCallback(mProgressSink); } @@ -1825,7 +1821,7 @@ index 60626cc9b3f7495b3f0ffc13346d1319ffd86dab..99c85a483d9e325bc3f7fd86bf772968 if (mPump && mLoadFlags & LOAD_CALL_CONTENT_SNIFFERS) { RefPtr pump(mPump); diff --git a/netwerk/protocol/http/InterceptedHttpChannel.h b/netwerk/protocol/http/InterceptedHttpChannel.h -index 430646881b927d2dddda1e0bcf5fd3427580224f..6b5bbb2a411794e9275d1ab83ea02d4cfca88e0e 100644 +index ab440756a6745ce3c4785f211db32173c6bd27c5..2ba8db70059b5143e72063ffb588c55dd2734c62 100644 --- a/netwerk/protocol/http/InterceptedHttpChannel.h +++ b/netwerk/protocol/http/InterceptedHttpChannel.h @@ -89,6 +89,11 @@ class InterceptedHttpChannel final @@ -1841,7 +1837,7 @@ index 430646881b927d2dddda1e0bcf5fd3427580224f..6b5bbb2a411794e9275d1ab83ea02d4c * InterceptionTimeStamps is used to record the time stamps of the * interception. diff --git a/netwerk/protocol/http/nsHttpChannel.cpp b/netwerk/protocol/http/nsHttpChannel.cpp -index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a99d3b2ba 100644 +index 0941cf9dc3933cd0c0e85647fd9531e18a3bcffb..10298f22fe713638b1c96f587b7d7be844f276e4 100644 --- a/netwerk/protocol/http/nsHttpChannel.cpp +++ b/netwerk/protocol/http/nsHttpChannel.cpp @@ -942,11 +942,9 @@ nsresult nsHttpChannel::OnBeforeConnect() { @@ -1868,7 +1864,7 @@ index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a if (mURI->SchemeIs("https") || aShouldUpgrade || !LoadUseHTTPSSVC() || forceOffline) { -@@ -1531,15 +1527,14 @@ nsresult nsHttpChannel::ContinueConnect() { +@@ -1541,15 +1537,14 @@ nsresult nsHttpChannel::ContinueConnect() { "CORS preflight must have been finished by the time we " "do the rest of ContinueConnect"); @@ -1886,7 +1882,7 @@ index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a BYPASS_LOCAL_CACHE(mLoadFlags, LoadPreferCacheLoadOverBypass())) { return NS_ERROR_OFFLINE; } -@@ -1581,7 +1576,7 @@ nsresult nsHttpChannel::ContinueConnect() { +@@ -1591,7 +1586,7 @@ nsresult nsHttpChannel::ContinueConnect() { } // We're about to hit the network. Don't if we're forced offline. @@ -1895,7 +1891,7 @@ index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a return NS_ERROR_OFFLINE; } -@@ -1689,12 +1684,9 @@ void nsHttpChannel::SpeculativeConnect() { +@@ -1699,12 +1694,9 @@ void nsHttpChannel::SpeculativeConnect() { // don't speculate if we are offline, when doing http upgrade (i.e. // websockets bootstrap), or if we can't do keep-alive (because then we // couldn't reuse the speculative connection anyhow). @@ -1909,7 +1905,7 @@ index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a return; } -@@ -5007,7 +4999,7 @@ nsresult nsHttpChannel::OpenCacheEntryInternal(bool isHttps) { +@@ -5060,7 +5052,7 @@ nsresult nsHttpChannel::OpenCacheEntryInternal(bool isHttps) { return NS_OK; } @@ -1918,7 +1914,7 @@ index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a if (offline || (mLoadFlags & INHIBIT_CACHING) || forceOffline) { if (BYPASS_LOCAL_CACHE(mLoadFlags, LoadPreferCacheLoadOverBypass()) && !offline && !forceOffline) { -@@ -8306,6 +8298,20 @@ void nsHttpChannel::MaybeStartDNSPrefetch() { +@@ -8534,6 +8526,20 @@ void nsHttpChannel::MaybeStartDNSPrefetch() { } } @@ -1940,10 +1936,10 @@ index c6d926448e399e0cb3032180efad3cddaf785fc0..7148ba816bf0dab3224323736001237a nsHttpChannel::GetEncodedBodySize(uint64_t* aEncodedBodySize) { if (mCacheEntry && !LoadCacheEntryIsWriteOnly()) { diff --git a/netwerk/protocol/http/nsHttpChannel.h b/netwerk/protocol/http/nsHttpChannel.h -index 602a3def6eab873986afc17ec92073eb476a43fb..4b267ff4859ebc3eecb169b7f793e60ac8ba1728 100644 +index cb5da1a630eb49624078262917d34146c6367444..b826374a2d0dc2814b2fd85efaed941ec63edb54 100644 --- a/netwerk/protocol/http/nsHttpChannel.h +++ b/netwerk/protocol/http/nsHttpChannel.h -@@ -306,6 +306,10 @@ class nsHttpChannel final : public HttpBaseChannel, +@@ -317,6 +317,10 @@ class nsHttpChannel final : public HttpBaseChannel, void MaybeResolveProxyAndBeginConnect(); void MaybeStartDNSPrefetch(); @@ -1955,10 +1951,10 @@ index 602a3def6eab873986afc17ec92073eb476a43fb..4b267ff4859ebc3eecb169b7f793e60a // end server host name. nsIHttpChannelInternal::ProxyDNSStrategy ComputeProxyDNSStrategy(); diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp -index ed63fe936c1c0fa38329c19c7adada56fd756f2d..b492aa20dd7ded36472b3816ea181d9a991b8d6f 100644 +index 8c376eb269cc152bebf4ddb24fee9bda26d4bac8..e52a4768d92c254f07196c903ee9355f464c91b1 100644 --- a/parser/html/nsHtml5TreeOpExecutor.cpp +++ b/parser/html/nsHtml5TreeOpExecutor.cpp -@@ -1449,6 +1449,10 @@ void nsHtml5TreeOpExecutor::UpdateReferrerInfoFromMeta( +@@ -1450,6 +1450,10 @@ void nsHtml5TreeOpExecutor::UpdateReferrerInfoFromMeta( void nsHtml5TreeOpExecutor::AddSpeculationCSP(const nsAString& aCSP) { NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); @@ -1970,10 +1966,10 @@ index ed63fe936c1c0fa38329c19c7adada56fd756f2d..b492aa20dd7ded36472b3816ea181d9a nsCOMPtr preloadCsp = mDocument->GetPreloadCsp(); if (!preloadCsp) { diff --git a/security/manager/ssl/nsCertOverrideService.cpp b/security/manager/ssl/nsCertOverrideService.cpp -index 068d9702fd015c974d698d2c8c741b5d2b0d8316..9ff49d6de9d712b7e5ab9711da7f22269dc2fe49 100644 +index 79a5989f6949505878cfbee21e6609cf2cdbaf37..fb2c56c9bb8047468773c421d3ccca37b873c035 100644 --- a/security/manager/ssl/nsCertOverrideService.cpp +++ b/security/manager/ssl/nsCertOverrideService.cpp -@@ -624,6 +624,8 @@ void nsCertOverrideService::CountPermanentOverrideTelemetry( +@@ -615,6 +615,8 @@ void nsCertOverrideService::CountPermanentOverrideTelemetry( } static bool IsDebugger() { @@ -1983,10 +1979,10 @@ index 068d9702fd015c974d698d2c8c741b5d2b0d8316..9ff49d6de9d712b7e5ab9711da7f2226 nsCOMPtr marionette = do_GetService(NS_MARIONETTE_CONTRACTID); if (marionette) { diff --git a/services/settings/Utils.sys.mjs b/services/settings/Utils.sys.mjs -index 76f69ab74eba9f704b95a7e3c7b27c39a887bf5a..cf0b9223baed50bff6a08497fe571ca153efaeb0 100644 +index 40e919a997a5e112ec9a83aa72680451d4739367..e0d91833af2392adc236f069a60808615ffb8287 100644 --- a/services/settings/Utils.sys.mjs +++ b/services/settings/Utils.sys.mjs -@@ -99,7 +99,7 @@ const _cdnURLs = {}; +@@ -105,7 +105,7 @@ function _isUndefined(value) { export var Utils = { get SERVER_URL() { @@ -1995,7 +1991,7 @@ index 76f69ab74eba9f704b95a7e3c7b27c39a887bf5a..cf0b9223baed50bff6a08497fe571ca1 ? // eslint-disable-next-line mozilla/valid-lazy lazy.gServerURL : AppConstants.REMOTE_SETTINGS_SERVER_URLS[0]; -@@ -113,6 +113,9 @@ export var Utils = { +@@ -119,6 +119,9 @@ export var Utils = { log, get shouldSkipRemoteActivity() { @@ -2006,35 +2002,37 @@ index 76f69ab74eba9f704b95a7e3c7b27c39a887bf5a..cf0b9223baed50bff6a08497fe571ca1 (lazy.isRunningTests || Cu.isInAutomation) && this.SERVER_URL == "data:,#remote-settings-dummy/v1" diff --git a/toolkit/components/browser/nsIWebBrowserChrome.idl b/toolkit/components/browser/nsIWebBrowserChrome.idl -index a665bd039d49aeeb6896e224080a7cc00b0eacbc..099c3b08d7de697cc8edcd5bb1d8000fc28aeefb 100644 +index 11f7f8a614bd9dc99ec23dec1d7b45527331bec0..e222d1be610db5e00ca7380c4f35259caaced091 100644 --- a/toolkit/components/browser/nsIWebBrowserChrome.idl +++ b/toolkit/components/browser/nsIWebBrowserChrome.idl -@@ -87,6 +87,9 @@ interface nsIWebBrowserChrome : nsISupports - // Whether this is a Document Picture-in-Picture window - const unsigned long CHROME_DOCUMENT_PIP = 1 << 22; - -+ // Whether this window has "width" or "height" defined in features -+ const unsigned long JUGGLER_WINDOW_EXPLICIT_SIZE = 1 << 23; -+ - // Prevents new window animations on MacOS and Windows. Currently +@@ -99,7 +99,10 @@ interface nsIWebBrowserChrome : nsISupports // ignored for Linux. const unsigned long CHROME_SUPPRESS_ANIMATION = 1 << 24; + +- // Two bits are free here. ++ // Whether this window has "width" or "height" defined in features ++ const unsigned long JUGGLER_WINDOW_EXPLICIT_SIZE = 1 << 26; ++ ++ // One bit is free here. + + const unsigned long CHROME_CENTER_SCREEN = 1 << 27; + diff --git a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs -index 217d51f4c765e0aac2107246f7142099d21d984e..1b623f956c178904945cddeceec9f737a01c053f 100644 +index 7c5bde49c469a6645e4694bc523dab24302694ba..812311051343beb44883e48d8670545c5beb8d71 100644 --- a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs +++ b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs -@@ -115,7 +115,9 @@ EnterprisePoliciesManager.prototype = { +@@ -113,7 +113,9 @@ EnterprisePoliciesManager.prototype = { Services.prefs.clearUserPref(PREF_POLICIES_APPLIED); } -- let provider = this._chooseProvider(); +- let provider = this._buildProvider(); + // --- Playwright begin --- + let provider = new PlaywrightPoliciesProvider(); + // --- Playwright end --- if (provider.failed) { this.status = Ci.nsIEnterprisePolicies.FAILED; -@@ -736,6 +738,19 @@ class JSONPoliciesProvider { +@@ -760,6 +762,19 @@ class JSONPoliciesProvider extends PoliciesProvider { } } @@ -2051,11 +2049,74 @@ index 217d51f4c765e0aac2107246f7142099d21d984e..1b623f956c178904945cddeceec9f737 + } +} + - class WindowsGPOPoliciesProvider { + class WindowsGPOPoliciesProvider extends PoliciesProvider { constructor() { - this._policies = null; + super(); +diff --git a/toolkit/components/geolocation/GeolocationService.cpp b/toolkit/components/geolocation/GeolocationService.cpp +index 70af7ec0c23833766fdee173c1bcf35448e3af85..1e587ebb60f4591402566f6749426d296d0992b9 100644 +--- a/toolkit/components/geolocation/GeolocationService.cpp ++++ b/toolkit/components/geolocation/GeolocationService.cpp +@@ -52,11 +52,16 @@ NS_INTERFACE_MAP_END + NS_IMPL_ADDREF(GeolocationService) + NS_IMPL_RELEASE(GeolocationService) + +-nsresult GeolocationService::Init() { ++nsresult GeolocationService::Init(bool aIsOverride) { + if (!StaticPrefs::geo_enabled()) { + return NS_ERROR_FAILURE; + } + ++ if (aIsOverride) { ++ mIsOverride = true; ++ mHigherAccuracy = true; ++ } ++ + if (XRE_IsContentProcess()) { + return NS_OK; + } +@@ -277,6 +282,10 @@ bool GeolocationService::HighAccuracyRequested() { + } + + void GeolocationService::UpdateAccuracy(bool aForceHigh) { ++ if (mIsOverride) { ++ return; ++ } ++ + bool highRequired = aForceHigh || HighAccuracyRequested(); + + if (XRE_IsContentProcess()) { +diff --git a/toolkit/components/geolocation/GeolocationService.h b/toolkit/components/geolocation/GeolocationService.h +index ab90326ccabc727b72ac3b2b43ee354ef18e20a2..17ff228f0037687cf68c3c55ab56ab2b3d686d0c 100644 +--- a/toolkit/components/geolocation/GeolocationService.h ++++ b/toolkit/components/geolocation/GeolocationService.h +@@ -42,7 +42,7 @@ class GeolocationService final : public nsIGeolocationService, + + GeolocationService() = default; + +- nsresult Init(); ++ nsresult Init(bool aIsOverride = false); + + // Management of the Geolocation objects + void AddLocator(mozilla::dom::Geolocation* aLocator); +@@ -66,6 +66,7 @@ class GeolocationService final : public nsIGeolocationService, + // Update the accuracy and notify the provider if changed + void UpdateAccuracy(bool aForceHigh = false); + bool HighAccuracyRequested(); ++ bool IsOverride() const { return mIsOverride; } + + private: + ~GeolocationService(); +@@ -93,6 +94,8 @@ class GeolocationService final : public nsIGeolocationService, + // Nothing() if not being started, or a boolean reflecting the requested + // accuracy. + mozilla::Maybe mStarting; ++ ++ bool mIsOverride = false; + }; + + } // namespace mozilla diff --git a/toolkit/components/startup/nsAppStartup.cpp b/toolkit/components/startup/nsAppStartup.cpp -index d0f9c88dcdaca07c6e10139b50b092bf80fc8c3e..f6d1a5ff8f241abdd931f47508d0fffaadce0391 100644 +index b0f1e285ad6b89cf72c8a98fb564d474f5601c4e..52a080d8c16c8531aadf8714b30a31ef60537c46 100644 --- a/toolkit/components/startup/nsAppStartup.cpp +++ b/toolkit/components/startup/nsAppStartup.cpp @@ -377,7 +377,7 @@ nsAppStartup::Quit(uint32_t aMode, int aExitCode, bool* aUserAllowedQuit) { @@ -2083,24 +2144,28 @@ index efe8ff5541915c0fc632e75572d1e3968c60139d..e0157515ded811e47d21705f13f475d6 int32_t aMaxSelfProgress, int32_t aCurTotalProgress, diff --git a/toolkit/components/windowwatcher/nsWindowWatcher.cpp b/toolkit/components/windowwatcher/nsWindowWatcher.cpp -index d5ebdf4413568c89e93d89279510ae910bcdf9fd..a1dbe7916e39fd6bc0292d6262787d39a5c8015d 100644 +index d493fc20e19390e94e5609556f1c6878ee3f66d5..1df133fa362d6d1eb3cb35780403150138626aed 100644 --- a/toolkit/components/windowwatcher/nsWindowWatcher.cpp +++ b/toolkit/components/windowwatcher/nsWindowWatcher.cpp -@@ -1917,7 +1917,11 @@ uint32_t nsWindowWatcher::CalculateChromeFlagsForContent( - // behavior of other browsers and avoids breaking sites like Gmail that - // open a Compose popout via Shift+click. - *aIsPopupRequested = true; -- return nsIWebBrowserChrome::CHROME_MINIMAL_POPUP; -+ uint32_t chromeFlags = 0; +@@ -1902,8 +1902,14 @@ uint32_t nsWindowWatcher::CalculateChromeFlagsForContent( + return nsIWebBrowserChrome::CHROME_DOCUMENT_PICTURE_IN_PICTURE_FLAGS; + } + *aIsPopupRequested = ShouldOpenPopup(aFeatures); +- return *aIsPopupRequested ? nsIWebBrowserChrome::CHROME_MINIMAL_POPUP +- : nsIWebBrowserChrome::CHROME_ALL; ++ if (!*aIsPopupRequested) { ++ return nsIWebBrowserChrome::CHROME_ALL; ++ } ++ uint32_t chromeFlags = nsIWebBrowserChrome::CHROME_MINIMAL_POPUP; + if (aFeatures.Exists("width") || aFeatures.Exists("height")) { + chromeFlags |= nsIWebBrowserChrome::JUGGLER_WINDOW_EXPLICIT_SIZE; + } -+ return chromeFlags | nsIWebBrowserChrome::CHROME_MINIMAL_POPUP; ++ return chromeFlags; } /** diff --git a/toolkit/mozapps/update/UpdateService.sys.mjs b/toolkit/mozapps/update/UpdateService.sys.mjs -index db167b74f040cdb477f68c87c4dfe50ef1173c32..78690b35f701df5a683ea3e392b2f7757f66c73e 100644 +index 266f3ea153d578c20a8d96b3e0a0a319baab7468..9a2e98c5deb895fcacdd68bb1eaba39da22c4303 100644 --- a/toolkit/mozapps/update/UpdateService.sys.mjs +++ b/toolkit/mozapps/update/UpdateService.sys.mjs @@ -4024,6 +4024,8 @@ export class UpdateService { @@ -2177,10 +2242,10 @@ index 524451a83e03f8a9a83103b1f3d87850ad411515..a44b3c5da20f6a0bf9c892d4289a07ac // nsDocumentViewer::LoadComplete that doesn't do various things // that are not relevant here because this wasn't an actual diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp -index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3e7e62808 100644 +index 566509f9ef17ac0a1d9830a5315b751266db6aee..fc659b901334b0ff63ad244bcbff779415bd3813 100644 --- a/uriloader/exthandler/nsExternalHelperAppService.cpp +++ b/uriloader/exthandler/nsExternalHelperAppService.cpp -@@ -111,6 +111,7 @@ +@@ -115,6 +115,7 @@ #include "mozilla/Components.h" #include "mozilla/ClearOnShutdown.h" @@ -2188,7 +2253,7 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 #include "mozilla/Preferences.h" #include "mozilla/ipc/URIUtils.h" -@@ -879,6 +880,12 @@ NS_IMETHODIMP nsExternalHelperAppService::ApplyDecodingForExtension( +@@ -890,6 +891,12 @@ NS_IMETHODIMP nsExternalHelperAppService::ApplyDecodingForExtension( return NS_OK; } @@ -2201,7 +2266,7 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 nsresult nsExternalHelperAppService::GetFileTokenForPath( const char16_t* aPlatformAppPath, nsIFile** aFile) { nsDependentString platformAppPath(aPlatformAppPath); -@@ -1514,7 +1521,12 @@ nsresult nsExternalAppHandler::SetUpTempFile(nsIChannel* aChannel) { +@@ -1568,7 +1575,12 @@ nsresult nsExternalAppHandler::SetUpTempFile(nsIChannel* aChannel) { // Strip off the ".part" from mTempLeafName mTempLeafName.Truncate(mTempLeafName.Length() - std::size(".part") + 1); @@ -2214,7 +2279,7 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 mSaver = do_CreateInstance(NS_BACKGROUNDFILESAVERSTREAMLISTENER_CONTRACTID, &rv); NS_ENSURE_SUCCESS(rv, rv); -@@ -1698,7 +1710,36 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) { +@@ -1752,7 +1764,36 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) { return NS_OK; } @@ -2252,7 +2317,7 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 if (NS_FAILED(rv)) { nsresult transferError = rv; -@@ -1760,6 +1801,9 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) { +@@ -1814,6 +1855,9 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) { bool alwaysAsk = true; mMimeInfo->GetAlwaysAskBeforeHandling(&alwaysAsk); @@ -2262,7 +2327,7 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 if (alwaysAsk) { // But we *don't* ask if this mimeInfo didn't come from // our user configuration datastore and the user has said -@@ -2276,6 +2320,15 @@ nsExternalAppHandler::OnSaveComplete(nsIBackgroundFileSaver* aSaver, +@@ -2330,6 +2374,15 @@ nsExternalAppHandler::OnSaveComplete(nsIBackgroundFileSaver* aSaver, NotifyTransfer(aStatus); } @@ -2278,7 +2343,7 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 return NS_OK; } -@@ -2761,6 +2814,14 @@ NS_IMETHODIMP nsExternalAppHandler::Cancel(nsresult aReason) { +@@ -2815,6 +2868,14 @@ NS_IMETHODIMP nsExternalAppHandler::Cancel(nsresult aReason) { } } @@ -2294,10 +2359,10 @@ index 1eab401455890aafc73f1da9080415fc035f1c30..d7ce1bccb117cac5d95181f6ab0ca7c3 // OnStartRequest) mDialog = nullptr; diff --git a/uriloader/exthandler/nsExternalHelperAppService.h b/uriloader/exthandler/nsExternalHelperAppService.h -index 3f8586ed7ee54af197a82b7a69651b4be2f84dad..929fe5b2b58ceef4055415cfc36a6698b73cba4c 100644 +index 477afd0a414b35af6b4acc13fa0321d826ae7d65..f2941eff522c0a06bb99759da375637c1196dfec 100644 --- a/uriloader/exthandler/nsExternalHelperAppService.h +++ b/uriloader/exthandler/nsExternalHelperAppService.h -@@ -269,6 +269,8 @@ class nsExternalHelperAppService : public nsIExternalHelperAppService, +@@ -302,6 +302,8 @@ class nsExternalHelperAppService : public nsIExternalHelperAppService, mozilla::dom::BrowsingContext* aContentContext, bool aForceSave, nsIInterfaceRequestor* aWindowContext, nsIStreamListener** aStreamListener); @@ -2306,7 +2371,7 @@ index 3f8586ed7ee54af197a82b7a69651b4be2f84dad..929fe5b2b58ceef4055415cfc36a6698 }; /** -@@ -467,6 +469,9 @@ class nsExternalAppHandler final : public nsIStreamListener, +@@ -500,6 +502,9 @@ class nsExternalAppHandler final : public nsIStreamListener, * Upon successful return, both mTempFile and mSaver will be valid. */ nsresult SetUpTempFile(nsIChannel* aChannel); @@ -2390,10 +2455,10 @@ index 777157e17e0db442262b1a9522b0b1b39058789a..54c4dde2ee4847e79b07fffe3ec57a34 } #endif diff --git a/widget/cocoa/NativeKeyBindings.mm b/widget/cocoa/NativeKeyBindings.mm -index 9711cfaf4e3e2974567ea7f7d4074b3541b0248f..34292be04676193f1b8efce45d4fa370c15e970f 100644 +index 4246b5ab669ecad8d2c24777c67470d1ece91d50..9b173d81b571d4aa25a57ca424e0ec6396ab5441 100644 --- a/widget/cocoa/NativeKeyBindings.mm +++ b/widget/cocoa/NativeKeyBindings.mm -@@ -618,6 +618,10 @@ +@@ -635,6 +635,10 @@ break; case KEY_NAME_INDEX_ArrowUp: if (aEvent.IsControl()) { @@ -2404,7 +2469,7 @@ index 9711cfaf4e3e2974567ea7f7d4074b3541b0248f..34292be04676193f1b8efce45d4fa370 break; } if (aEvent.IsMeta()) { -@@ -655,6 +659,10 @@ +@@ -672,6 +676,10 @@ break; case KEY_NAME_INDEX_ArrowDown: if (aEvent.IsControl()) { @@ -2416,7 +2481,7 @@ index 9711cfaf4e3e2974567ea7f7d4074b3541b0248f..34292be04676193f1b8efce45d4fa370 } if (aEvent.IsMeta()) { diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp -index cbaa021c9d31cd57e253afd984c5076acab1941e..6cf72e6006e33eac7720958f7d0cd91983f2d782 100644 +index 8484851f674aa21d09e5a3ed77b9df4edaa89e12..2804831ec785a64c771946f095f855d9408851fe 100644 --- a/widget/headless/HeadlessCompositorWidget.cpp +++ b/widget/headless/HeadlessCompositorWidget.cpp @@ -2,6 +2,8 @@ @@ -2425,10 +2490,10 @@ index cbaa021c9d31cd57e253afd984c5076acab1941e..6cf72e6006e33eac7720958f7d0cd919 +#include "mozilla/gfx/2D.h" +#include "mozilla/layers/CompositorThread.h" - #include "mozilla/widget/PlatformWidgetTypes.h" #include "HeadlessCompositorWidget.h" + #include "VsyncDispatcher.h" -@@ -14,9 +16,30 @@ HeadlessCompositorWidget::HeadlessCompositorWidget( +@@ -15,9 +17,30 @@ HeadlessCompositorWidget::HeadlessCompositorWidget( const layers::CompositorOptions& aOptions, HeadlessWidget* aWindow) : CompositorWidget(aOptions), mWidget(aWindow), @@ -2459,7 +2524,7 @@ index cbaa021c9d31cd57e253afd984c5076acab1941e..6cf72e6006e33eac7720958f7d0cd919 void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) { if (RefPtr cvd = mWidget->GetCompositorVsyncDispatcher()) { -@@ -30,6 +53,59 @@ void HeadlessCompositorWidget::NotifyClientSizeChanged( +@@ -31,6 +54,59 @@ void HeadlessCompositorWidget::NotifyClientSizeChanged( const LayoutDeviceIntSize& aClientSize) { auto size = mClientSize.Lock(); *size = aClientSize; @@ -2520,7 +2585,7 @@ index cbaa021c9d31cd57e253afd984c5076acab1941e..6cf72e6006e33eac7720958f7d0cd919 LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() { diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h -index 8374cd00944eddad27563624cd33bb046b6cf143..0345d19d1da862ccd31afa49b123e9f16755c886 100644 +index f9454a79f3e3ff4d9013db99cf9bb98413633330..68e7b94c3a9c75dc9fceae0d5881971497e4fc7c 100644 --- a/widget/headless/HeadlessCompositorWidget.h +++ b/widget/headless/HeadlessCompositorWidget.h @@ -5,6 +5,7 @@ @@ -2528,10 +2593,10 @@ index 8374cd00944eddad27563624cd33bb046b6cf143..0345d19d1da862ccd31afa49b123e9f1 #define widget_headless_HeadlessCompositorWidget_h +#include "mozilla/ReentrantMonitor.h" + #include "HeadlessWidget.h" #include "mozilla/widget/CompositorWidget.h" - #include "HeadlessWidget.h" -@@ -22,8 +23,11 @@ class HeadlessCompositorWidget final : public CompositorWidget, +@@ -21,8 +22,11 @@ class HeadlessCompositorWidget final : public CompositorWidget, HeadlessWidget* aWindow); void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize); @@ -2543,7 +2608,7 @@ index 8374cd00944eddad27563624cd33bb046b6cf143..0345d19d1da862ccd31afa49b123e9f1 uintptr_t GetWidgetKey() override; -@@ -41,10 +45,18 @@ class HeadlessCompositorWidget final : public CompositorWidget, +@@ -40,10 +44,18 @@ class HeadlessCompositorWidget final : public CompositorWidget, } private: @@ -2563,7 +2628,7 @@ index 8374cd00944eddad27563624cd33bb046b6cf143..0345d19d1da862ccd31afa49b123e9f1 } // namespace widget diff --git a/widget/headless/HeadlessLookAndFeelGTK.cpp b/widget/headless/HeadlessLookAndFeelGTK.cpp -index 34ef4bf32bc4c348bd226f1c3ea5a4f03ad4fac1..394e892cdf35c351b9d8536dcb82c1a130cb2095 100644 +index d6e94f053c22d9ed5df36b1c20cd408c2605bdc5..31fdf23775544cf1ee9e89e8dd09bcc2166b067b 100644 --- a/widget/headless/HeadlessLookAndFeelGTK.cpp +++ b/widget/headless/HeadlessLookAndFeelGTK.cpp @@ -3,6 +3,7 @@ @@ -2588,10 +2653,10 @@ index 34ef4bf32bc4c348bd226f1c3ea5a4f03ad4fac1..394e892cdf35c351b9d8536dcb82c1a1 default: aResult = 0; diff --git a/widget/headless/HeadlessWidget.cpp b/widget/headless/HeadlessWidget.cpp -index 0841e299ea23692310db27acfa78f7e2050bb002..3285e16397b14400127c81c0d1a13711e536b073 100644 +index 0c28540ee6aca7f888ab505f6aeb80e61b9981d6..23458a37b6993996e43138bd0e547e9fc7df6614 100644 --- a/widget/headless/HeadlessWidget.cpp +++ b/widget/headless/HeadlessWidget.cpp -@@ -112,6 +112,8 @@ void HeadlessWidget::Destroy() { +@@ -113,6 +113,8 @@ void HeadlessWidget::Destroy() { } } @@ -2600,7 +2665,7 @@ index 0841e299ea23692310db27acfa78f7e2050bb002..3285e16397b14400127c81c0d1a13711 nsIWidget::OnDestroy(); nsIWidget::Destroy(); -@@ -573,5 +575,14 @@ nsresult HeadlessWidget::SynthesizeNativeTouchpadPan( +@@ -574,5 +576,14 @@ nsresult HeadlessWidget::SynthesizeNativeTouchpadPan( return NS_OK; } @@ -2616,7 +2681,7 @@ index 0841e299ea23692310db27acfa78f7e2050bb002..3285e16397b14400127c81c0d1a13711 } // namespace widget } // namespace mozilla diff --git a/widget/headless/HeadlessWidget.h b/widget/headless/HeadlessWidget.h -index 9daa3334e7ec6aee433ee7a28e6b86a8548f6226..0aa21a1b0a3b07548d832bfb41f73fe37a174fdc 100644 +index 05ae8d02e81e65ec22729173995968367fb026e7..236d2991b75fb613af90d699b5a8f7dcca99a7aa 100644 --- a/widget/headless/HeadlessWidget.h +++ b/widget/headless/HeadlessWidget.h @@ -127,6 +127,9 @@ class HeadlessWidget final : public nsIWidget { @@ -2630,10 +2695,10 @@ index 9daa3334e7ec6aee433ee7a28e6b86a8548f6226..0aa21a1b0a3b07548d832bfb41f73fe3 ~HeadlessWidget(); bool mEnabled; diff --git a/xpcom/reflect/xptinfo/xptinfo.h b/xpcom/reflect/xptinfo/xptinfo.h -index 2888ffaf432e16d67d348ff008372fbb96c06991..cd4cce73f69bee86d4fb7cb510cd60de0cbcd0b8 100644 +index 7b1d918e86af55b5f961d839ca5009335b56d88b..3d2bc9339173a7358137fc28f0441932061d82bc 100644 --- a/xpcom/reflect/xptinfo/xptinfo.h +++ b/xpcom/reflect/xptinfo/xptinfo.h -@@ -503,7 +503,7 @@ static_assert(sizeof(nsXPTMethodInfo) == 8, "wrong size"); +@@ -504,7 +504,7 @@ static_assert(sizeof(nsXPTMethodInfo) == 8, "wrong size"); #if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE) # define PARAM_BUFFER_COUNT 18 #else diff --git a/browser_patches/firefox/preferences/playwright.cfg b/browser_patches/firefox/preferences/playwright.cfg index f6a3cd845c..f635ae6c8f 100644 --- a/browser_patches/firefox/preferences/playwright.cfg +++ b/browser_patches/firefox/preferences/playwright.cfg @@ -20,6 +20,11 @@ pref("dom.security.https_first", false); pref("datareporting.policy.dataSubmissionEnabled", false); pref("datareporting.policy.dataSubmissionPolicyAccepted", false); pref("datareporting.policy.dataSubmissionPolicyBypassNotification", true); +// Do not show the "Terms of Use" first-run notification (Firefox 154+). +pref("termsofuse.bypassNotification", true); +// Do not show the pre-onboarding splash modal in the first window; it waits +// for Nimbus experiments to load and blocks all mouse input (Firefox 154+). +pref("browser.preonboarding.enabled", false); // Force pdfs into downloads. pref("pdfjs.disabled", true); @@ -148,7 +153,7 @@ pref("ui.use_standins_for_native_colors", true); // Turn off the Push service. pref("dom.push.serverURL", ""); // Prevent Remote Settings (firefox.settings.services.mozilla.com) to issue non local connections. -pref("services.settings.server", ""); +pref("services.settings.server", "data:,#remote-settings-dummy/v1"); // Prevent location.services.mozilla.com to issue non local connections. pref("browser.region.network.url", ""); pref("browser.pocket.enabled", false); diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 537a365ae8..0636a59f78 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -17,7 +17,7 @@ }, { "name": "firefox", - "revision": "1543", + "revision": "1544", "installByDefault": true, "browserVersion": "155.0", "title": "Firefox"