| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/accessible/base/NotificationController.h b/accessible/base/NotificationController.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index afb6230bb613ecde4a5e3271478a682d0396dc3b..a3a7d9786f9d18bad6afc292264b9dbc62c14cf2 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/accessible/base/NotificationController.h
 | 
					
						
							|  |  |  | +++ b/accessible/base/NotificationController.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -276,6 +276,8 @@ class NotificationController final : public EventQueue,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  bool IsUpdatePendingForJugglerAccessibility() { return IsUpdatePending(); }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |   protected: | 
					
						
							|  |  |  |    virtual ~NotificationController(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/accessible/interfaces/nsIAccessibleDocument.idl b/accessible/interfaces/nsIAccessibleDocument.idl
 | 
					
						
							|  |  |  | index a91df31c96afda66f478a5a38eaa4352039c2a0b..ee777c1746284027fb3aa2f1686f8082af9d89ee 100644
 | 
					
						
							|  |  |  | --- a/accessible/interfaces/nsIAccessibleDocument.idl
 | 
					
						
							|  |  |  | +++ b/accessible/interfaces/nsIAccessibleDocument.idl
 | 
					
						
							|  |  |  | @@ -72,4 +72,9 @@ interface nsIAccessibleDocument : nsISupports
 | 
					
						
							|  |  |  |     * Return the child document accessible at the given index. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |    nsIAccessibleDocument getChildDocumentAt(in unsigned long index); | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  /**
 | 
					
						
							|  |  |  | +   * Return whether it is updating.
 | 
					
						
							|  |  |  | +   */
 | 
					
						
							|  |  |  | +  readonly attribute boolean isUpdatePendingForJugglerAccessibility;
 | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  | diff --git a/accessible/xpcom/xpcAccessibleDocument.cpp b/accessible/xpcom/xpcAccessibleDocument.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 1ddd5c8372c2742a8dc4e7a8156c084aaf2442fc..7e3aa30c20d8b2fcae5c12d293ca7772ecd28657 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/accessible/xpcom/xpcAccessibleDocument.cpp
 | 
					
						
							|  |  |  | +++ b/accessible/xpcom/xpcAccessibleDocument.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -143,6 +143,15 @@ xpcAccessibleDocument::GetVirtualCursor(nsIAccessiblePivot** aVirtualCursor) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    return NS_OK; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +xpcAccessibleDocument::GetIsUpdatePendingForJugglerAccessibility(bool* updating) {
 | 
					
						
							|  |  |  | +  NS_ENSURE_ARG_POINTER(updating);
 | 
					
						
							|  |  |  | +  *updating = Intl()->Controller()->IsUpdatePendingForJugglerAccessibility();
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  //////////////////////////////////////////////////////////////////////////////// | 
					
						
							|  |  |  |  // xpcAccessibleDocument | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/accessible/xpcom/xpcAccessibleDocument.h b/accessible/xpcom/xpcAccessibleDocument.h
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  | index 416a1c5497c97ed80cc0f37d72545e36f7e36b4c..b81983cf7153378260a21f6af225e3493f8f30dc 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/accessible/xpcom/xpcAccessibleDocument.h
 | 
					
						
							|  |  |  | +++ b/accessible/xpcom/xpcAccessibleDocument.h
 | 
					
						
							|  |  |  | @@ -48,6 +48,8 @@ class xpcAccessibleDocument : public xpcAccessibleHyperText,
 | 
					
						
							|  |  |  |                                  nsIAccessibleDocument** aDocument) final; | 
					
						
							|  |  |  |    NS_IMETHOD GetVirtualCursor(nsIAccessiblePivot** aVirtualCursor) final; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  NS_IMETHOD GetIsUpdatePendingForJugglerAccessibility(bool* aUpdating) final;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    /** | 
					
						
							|  |  |  |     * Return XPCOM wrapper for the internal accessible. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  | diff --git a/browser/app/winlauncher/LauncherProcessWin.cpp b/browser/app/winlauncher/LauncherProcessWin.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 4460774865769609b66c0710f7c83f4d5c02b6fa..2ca95607b9b093218d48f83adc95c514cebe661b 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/browser/app/winlauncher/LauncherProcessWin.cpp
 | 
					
						
							|  |  |  | +++ b/browser/app/winlauncher/LauncherProcessWin.cpp
 | 
					
						
							|  |  |  | @@ -23,6 +23,7 @@
 | 
					
						
							|  |  |  |  #include "mozilla/WinHeaderOnlyUtils.h" | 
					
						
							|  |  |  |  #include "nsWindowsHelpers.h" | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +#include <io.h>
 | 
					
						
							|  |  |  |  #include <windows.h> | 
					
						
							|  |  |  |  #include <processthreadsapi.h> | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -359,8 +360,19 @@ Maybe<int> LauncherMain(int& argc, wchar_t* argv[],
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    HANDLE stdHandles[] = {::GetStdHandle(STD_INPUT_HANDLE), | 
					
						
							|  |  |  |                           ::GetStdHandle(STD_OUTPUT_HANDLE), | 
					
						
							|  |  |  |                           ::GetStdHandle(STD_ERROR_HANDLE)}; | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  |    attrs.AddInheritableHandles(stdHandles); | 
					
						
							|  |  |  | +  // Playwright pipe installation.
 | 
					
						
							|  |  |  | +  bool hasJugglerPipe =
 | 
					
						
							|  |  |  | +      mozilla::CheckArg(argc, argv, L"juggler-pipe",
 | 
					
						
							|  |  |  | +                        static_cast<const wchar_t**>(nullptr),
 | 
					
						
							|  |  |  | +                        mozilla::CheckArgFlag::None) == mozilla::ARG_FOUND;
 | 
					
						
							|  |  |  | +  if (hasJugglerPipe) {
 | 
					
						
							|  |  |  | +    intptr_t stdio3 = _get_osfhandle(3);
 | 
					
						
							|  |  |  | +    intptr_t stdio4 = _get_osfhandle(4);
 | 
					
						
							|  |  |  | +    HANDLE pipeHandles[] = {reinterpret_cast<HANDLE>(stdio3),
 | 
					
						
							|  |  |  | +                            reinterpret_cast<HANDLE>(stdio4)};
 | 
					
						
							|  |  |  | +    attrs.AddInheritableHandles(pipeHandles);
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    DWORD creationFlags = CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  | index b59fe4b1854fec7cb329139f9c6773498fb9de51..29973af04902848808e850b40bf85e5f694d349a 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/browser/installer/allowed-dupes.mn
 | 
					
						
							|  |  |  | +++ b/browser/installer/allowed-dupes.mn
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  | @@ -71,6 +71,12 @@ browser/features/webcompat@mozilla.org/shims/empty-shim.txt
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |  removed-files | 
					
						
							|  |  |  |  #endif | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  | +# Juggler/marionette files
 | 
					
						
							|  |  |  | +chrome/juggler/content/content/floating-scrollbars.css
 | 
					
						
							|  |  |  | +browser/chrome/devtools/skin/floating-scrollbars-responsive-design.css
 | 
					
						
							|  |  |  | +chrome/juggler/content/server/stream-utils.js
 | 
					
						
							|  |  |  | +chrome/marionette/content/stream-utils.js
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  #ifdef MOZ_EME_WIN32_ARTIFACT | 
					
						
							|  |  |  |  gmp-clearkey/0.1/manifest.json | 
					
						
							|  |  |  |  i686/gmp-clearkey/0.1/manifest.json | 
					
						
							|  |  |  | diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
 | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | index 14e582fc61be808d5b6f3ae7801f43c7b0b743d4..80e400b5c3e316afe2bff1bac16808bad16dc4bd 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/browser/installer/package-manifest.in
 | 
					
						
							|  |  |  | +++ b/browser/installer/package-manifest.in
 | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | @@ -192,6 +192,9 @@
 | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  |  @RESPATH@/chrome/remote.manifest | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +@RESPATH@/chrome/juggler@JAREXT@
 | 
					
						
							|  |  |  | +@RESPATH@/chrome/juggler.manifest
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  |  ; [Extensions] | 
					
						
							|  |  |  |  @RESPATH@/components/extensions-toolkit.manifest | 
					
						
							|  |  |  |  @RESPATH@/browser/components/extensions-browser.manifest | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/devtools/server/socket/websocket-server.js b/devtools/server/socket/websocket-server.js
 | 
					
						
							|  |  |  | index 040c7b124dec6bb254563bbe74fe50012cb077a3..b4e6b8132786af70e8ad0dce88b67c2835307f88 100644
 | 
					
						
							|  |  |  | --- a/devtools/server/socket/websocket-server.js
 | 
					
						
							|  |  |  | +++ b/devtools/server/socket/websocket-server.js
 | 
					
						
							|  |  |  | @@ -133,13 +133,12 @@ function writeHttpResponse(output, response) {
 | 
					
						
							|  |  |  |   * Process the WebSocket handshake headers and return the key to be sent in | 
					
						
							|  |  |  |   * Sec-WebSocket-Accept response header. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  | -function processRequest({ requestLine, headers }) {
 | 
					
						
							|  |  |  | +function processRequest({ requestLine, headers }, expectedPath) {
 | 
					
						
							|  |  |  |    const [method, path] = requestLine.split(" "); | 
					
						
							|  |  |  |    if (method !== "GET") { | 
					
						
							|  |  |  |      throw new Error("The handshake request must use GET method"); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -  if (path !== "/") {
 | 
					
						
							|  |  |  | +  if (path !== expectedPath) {
 | 
					
						
							|  |  |  |      throw new Error("The handshake request has unknown path"); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | @@ -189,13 +188,13 @@ function computeKey(key) {
 | 
					
						
							|  |  |  |  /** | 
					
						
							|  |  |  |   * Perform the server part of a WebSocket opening handshake on an incoming connection. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  | -const serverHandshake = async function(input, output) {
 | 
					
						
							|  |  |  | +const serverHandshake = async function(input, output, expectedPath) {
 | 
					
						
							|  |  |  |    // Read the request | 
					
						
							|  |  |  |    const request = await readHttpRequest(input); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    try { | 
					
						
							|  |  |  |      // Check and extract info from the request | 
					
						
							|  |  |  | -    const { acceptKey } = processRequest(request);
 | 
					
						
							|  |  |  | +    const { acceptKey } = processRequest(request, expectedPath);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      // Send response headers | 
					
						
							|  |  |  |      await writeHttpResponse(output, [ | 
					
						
							|  |  |  | @@ -217,8 +216,8 @@ const serverHandshake = async function(input, output) {
 | 
					
						
							|  |  |  |   * Performs the WebSocket handshake and waits for the WebSocket to open. | 
					
						
							|  |  |  |   * Returns Promise with a WebSocket ready to send and receive messages. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  | -const accept = async function(transport, input, output) {
 | 
					
						
							|  |  |  | -  await serverHandshake(input, output);
 | 
					
						
							|  |  |  | +const accept = async function(transport, input, output, expectedPath) {
 | 
					
						
							|  |  |  | +  await serverHandshake(input, output, expectedPath || "/");
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    const transportProvider = { | 
					
						
							|  |  |  |      setListener(upgradeListener) { | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | diff --git a/docshell/base/BrowsingContext.cpp b/docshell/base/BrowsingContext.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 4b4c20d5d04e51e5eeb08027c4b48068ee21d703..5529185d2a39e041b7e5021a5f5de63269644a4b 100644
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | --- a/docshell/base/BrowsingContext.cpp
 | 
					
						
							|  |  |  | +++ b/docshell/base/BrowsingContext.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -111,6 +111,20 @@ struct ParamTraits<mozilla::dom::PrefersColorSchemeOverride>
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |            mozilla::dom::PrefersColorSchemeOverride::None, | 
					
						
							|  |  |  |            mozilla::dom::PrefersColorSchemeOverride::EndGuard_> {}; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +template <>
 | 
					
						
							|  |  |  | +struct ParamTraits<mozilla::dom::PrefersReducedMotionOverride>
 | 
					
						
							|  |  |  | +    : public ContiguousEnumSerializer<
 | 
					
						
							|  |  |  | +          mozilla::dom::PrefersReducedMotionOverride,
 | 
					
						
							|  |  |  | +          mozilla::dom::PrefersReducedMotionOverride::None,
 | 
					
						
							|  |  |  | +          mozilla::dom::PrefersReducedMotionOverride::EndGuard_> {};
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +template <>
 | 
					
						
							|  |  |  | +struct ParamTraits<mozilla::dom::ForcedColorsOverride>
 | 
					
						
							|  |  |  | +    : public ContiguousEnumSerializer<
 | 
					
						
							|  |  |  | +          mozilla::dom::ForcedColorsOverride,
 | 
					
						
							|  |  |  | +          mozilla::dom::ForcedColorsOverride::None,
 | 
					
						
							|  |  |  | +          mozilla::dom::ForcedColorsOverride::EndGuard_> {};
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |  template <> | 
					
						
							|  |  |  |  struct ParamTraits<mozilla::dom::ExplicitActiveStatus> | 
					
						
							|  |  |  |      : public ContiguousEnumSerializer< | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2782,6 +2796,40 @@ void BrowsingContext::DidSet(FieldIndex<IDX_PrefersColorSchemeOverride>,
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  |    PresContextAffectingFieldChanged(); | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void BrowsingContext::DidSet(FieldIndex<IDX_PrefersReducedMotionOverride>,
 | 
					
						
							|  |  |  | +                             dom::PrefersReducedMotionOverride aOldValue) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(IsTop());
 | 
					
						
							|  |  |  | +  if (PrefersReducedMotionOverride() == aOldValue) {
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  PreOrderWalk([&](BrowsingContext* aContext) {
 | 
					
						
							|  |  |  | +    if (nsIDocShell* shell = aContext->GetDocShell()) {
 | 
					
						
							|  |  |  | +      if (nsPresContext* pc = shell->GetPresContext()) {
 | 
					
						
							|  |  |  | +        pc->MediaFeatureValuesChanged(
 | 
					
						
							|  |  |  | +            {MediaFeatureChangeReason::SystemMetricsChange},
 | 
					
						
							|  |  |  | +            MediaFeatureChangePropagation::JustThisDocument);
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  });
 | 
					
						
							|  |  |  | +}
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +void BrowsingContext::DidSet(FieldIndex<IDX_ForcedColorsOverride>,
 | 
					
						
							|  |  |  | +                             dom::ForcedColorsOverride aOldValue) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(IsTop());
 | 
					
						
							|  |  |  | +  if (ForcedColorsOverride() == aOldValue) {
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  PreOrderWalk([&](BrowsingContext* aContext) {
 | 
					
						
							|  |  |  | +    if (nsIDocShell* shell = aContext->GetDocShell()) {
 | 
					
						
							|  |  |  | +      if (nsPresContext* pc = shell->GetPresContext()) {
 | 
					
						
							|  |  |  | +        pc->MediaFeatureValuesChanged(
 | 
					
						
							|  |  |  | +            {MediaFeatureChangeReason::SystemMetricsChange},
 | 
					
						
							|  |  |  | +            MediaFeatureChangePropagation::JustThisDocument);
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  });
 | 
					
						
							|  |  |  | +}
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |  void BrowsingContext::DidSet(FieldIndex<IDX_MediumOverride>, | 
					
						
							|  |  |  |                               nsString&& aOldValue) { | 
					
						
							|  |  |  |    MOZ_ASSERT(IsTop()); | 
					
						
							|  |  |  | diff --git a/docshell/base/BrowsingContext.h b/docshell/base/BrowsingContext.h
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index e0b091feba6ce38e57681c62c386d3b70234de1f..4fae381a8bded7ae004ccb25187b3ace559fea41 100644
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | --- a/docshell/base/BrowsingContext.h
 | 
					
						
							|  |  |  | +++ b/docshell/base/BrowsingContext.h
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -176,10 +176,10 @@ enum class ExplicitActiveStatus : uint8_t {
 | 
					
						
							|  |  |  |    FIELD(GVInaudibleAutoplayRequestStatus, GVAutoplayRequestStatus)            \ | 
					
						
							|  |  |  |    /* ScreenOrientation-related APIs */                                        \ | 
					
						
							|  |  |  |    FIELD(CurrentOrientationAngle, float)                                       \ | 
					
						
							|  |  |  | -  FIELD(CurrentOrientationType, mozilla::dom::OrientationType)                \
 | 
					
						
							|  |  |  | +  FIELD(CurrentOrientationType, dom::OrientationType)                \
 | 
					
						
							|  |  |  |    FIELD(OrientationLock, mozilla::hal::ScreenOrientation)                     \ | 
					
						
							|  |  |  |    FIELD(UserAgentOverride, nsString)                                          \ | 
					
						
							|  |  |  | -  FIELD(TouchEventsOverrideInternal, mozilla::dom::TouchEventsOverride)       \
 | 
					
						
							|  |  |  | +  FIELD(TouchEventsOverrideInternal, dom::TouchEventsOverride)       \
 | 
					
						
							|  |  |  |    FIELD(EmbedderElementType, Maybe<nsString>)                                 \ | 
					
						
							|  |  |  |    FIELD(MessageManagerGroup, nsString)                                        \ | 
					
						
							|  |  |  |    FIELD(MaxTouchPointsOverride, uint8_t)                                      \ | 
					
						
							|  |  |  | @@ -217,6 +217,10 @@ enum class ExplicitActiveStatus : uint8_t {
 | 
					
						
							|  |  |  |     * <browser> embedder element. */                                           \ | 
					
						
							|  |  |  |    FIELD(EmbedderColorScheme, dom::PrefersColorSchemeOverride)                 \ | 
					
						
							|  |  |  |    FIELD(DisplayMode, dom::DisplayMode)                                        \ | 
					
						
							|  |  |  | +  /* playwright addition */                                                   \
 | 
					
						
							|  |  |  | +  FIELD(PrefersReducedMotionOverride, dom::PrefersReducedMotionOverride)      \
 | 
					
						
							|  |  |  | +  /* playwright addition */                                                   \
 | 
					
						
							|  |  |  | +  FIELD(ForcedColorsOverride, dom::ForcedColorsOverride)                      \
 | 
					
						
							| 
									
										
										
										
											2021-08-14 00:01:09 +08:00
										 |  |  |    /* The number of entries added to the session history because of this       \ | 
					
						
							|  |  |  |     * browsing context. */                                                     \ | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  |    FIELD(HistoryEntryCount, uint32_t)                                          \ | 
					
						
							|  |  |  | @@ -893,6 +897,14 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |      return GetPrefersColorSchemeOverride(); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  dom::PrefersReducedMotionOverride PrefersReducedMotionOverride() const {
 | 
					
						
							|  |  |  | +    return GetPrefersReducedMotionOverride();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +  dom::ForcedColorsOverride ForcedColorsOverride() const {
 | 
					
						
							|  |  |  | +    return GetForcedColorsOverride();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-09-08 22:54:44 +08:00
										 |  |  |    bool IsInBFCache() const; | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    bool AllowJavascript() const { return GetAllowJavascript(); } | 
					
						
							|  |  |  | @@ -1047,6 +1059,23 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    void PresContextAffectingFieldChanged(); | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |   | 
					
						
							|  |  |  | +  bool CanSet(FieldIndex<IDX_PrefersReducedMotionOverride>,
 | 
					
						
							|  |  |  | +              dom::PrefersReducedMotionOverride, ContentParent*) {
 | 
					
						
							|  |  |  | +    return IsTop();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  void DidSet(FieldIndex<IDX_PrefersReducedMotionOverride>,
 | 
					
						
							|  |  |  | +              dom::PrefersReducedMotionOverride aOldValue);
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  bool CanSet(FieldIndex<IDX_ForcedColorsOverride>,
 | 
					
						
							|  |  |  | +              dom::ForcedColorsOverride, ContentParent*) {
 | 
					
						
							|  |  |  | +    return IsTop();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  void DidSet(FieldIndex<IDX_ForcedColorsOverride>,
 | 
					
						
							|  |  |  | +              dom::ForcedColorsOverride aOldValue);
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |    void DidSet(FieldIndex<IDX_MediumOverride>, nsString&& aOldValue); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    bool CanSet(FieldIndex<IDX_SuspendMediaWhenInactive>, bool, ContentParent*) { | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index e7f3305fae1c6754974b2a53995080f487d559cf..eaa173262e6cfec0765153fb890588fef768d74c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/docshell/base/nsDocShell.cpp
 | 
					
						
							|  |  |  | +++ b/docshell/base/nsDocShell.cpp
 | 
					
						
							|  |  |  | @@ -15,6 +15,12 @@
 | 
					
						
							|  |  |  |  #  include <unistd.h>  // for getpid() | 
					
						
							|  |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +#if JS_HAS_INTL_API && !MOZ_SYSTEM_ICU
 | 
					
						
							|  |  |  | +#  include "unicode/locid.h"
 | 
					
						
							|  |  |  | +#endif /* JS_HAS_INTL_API && !MOZ_SYSTEM_ICU */
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +#include "js/LocaleSensitive.h"
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  #include "mozilla/ArrayUtils.h" | 
					
						
							|  |  |  |  #include "mozilla/Attributes.h" | 
					
						
							|  |  |  |  #include "mozilla/AutoRestore.h" | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | @@ -65,6 +71,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "mozilla/dom/ContentFrameMessageManager.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/DocGroup.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/Element.h" | 
					
						
							|  |  |  | +#include "mozilla/dom/Geolocation.h"
 | 
					
						
							|  |  |  |  #include "mozilla/dom/HTMLAnchorElement.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/HTMLIFrameElement.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/PerformanceNavigation.h" | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | @@ -90,6 +97,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "mozilla/dom/JSWindowActorChild.h" | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  |  #include "mozilla/dom/DocumentBinding.h" | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "mozilla/ipc/ProtocolUtils.h" | 
					
						
							|  |  |  | +#include "mozilla/dom/WorkerCommon.h"
 | 
					
						
							|  |  |  |  #include "mozilla/net/DocumentChannel.h" | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  |  #include "mozilla/net/DocumentChannelChild.h" | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "mozilla/net/ParentChannelWrapper.h" | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | @@ -114,6 +122,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "nsIDocShellTreeOwner.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/Document.h" | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  |  #include "nsHTMLDocument.h" | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +#include "mozilla/dom/Element.h"
 | 
					
						
							|  |  |  |  #include "nsIDocumentLoaderFactory.h" | 
					
						
							|  |  |  |  #include "nsIDOMWindow.h" | 
					
						
							|  |  |  |  #include "nsIEditingSession.h" | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | @@ -208,6 +217,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |  #include "nsFocusManager.h" | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "nsGlobalWindow.h" | 
					
						
							|  |  |  |  #include "nsJSEnvironment.h" | 
					
						
							|  |  |  | +#include "nsJSUtils.h"
 | 
					
						
							|  |  |  |  #include "nsNetCID.h" | 
					
						
							|  |  |  |  #include "nsNetUtil.h" | 
					
						
							|  |  |  |  #include "nsObjectLoadingContent.h" | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -371,6 +381,13 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        mAllowDNSPrefetch(true), | 
					
						
							|  |  |  |        mAllowWindowControl(true), | 
					
						
							|  |  |  |        mCSSErrorReportingEnabled(false), | 
					
						
							|  |  |  | +      mFileInputInterceptionEnabled(false),
 | 
					
						
							|  |  |  | +      mOverrideHasFocus(false),
 | 
					
						
							|  |  |  | +      mBypassCSPEnabled(false),
 | 
					
						
							|  |  |  | +      mForceActiveState(false),
 | 
					
						
							|  |  |  | +      mOnlineOverride(nsIDocShell::ONLINE_OVERRIDE_NONE),
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +      mReducedMotionOverride(REDUCED_MOTION_OVERRIDE_NONE),
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +      mForcedColorsOverride(FORCED_COLORS_OVERRIDE_NO_OVERRIDE),
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        mAllowAuth(mItemType == typeContent), | 
					
						
							|  |  |  |        mAllowKeywordFixup(false), | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  |        mDisableMetaRefreshWhenInactive(false), | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -3256,6 +3273,221 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    return NS_OK; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +// =============== Juggler Begin =======================
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +nsDocShell* nsDocShell::GetRootDocShell() {
 | 
					
						
							|  |  |  | +  nsCOMPtr<nsIDocShellTreeItem> rootAsItem;
 | 
					
						
							|  |  |  | +  GetInProcessSameTypeRootTreeItem(getter_AddRefs(rootAsItem));
 | 
					
						
							|  |  |  | +  nsCOMPtr<nsIDocShell> rootShell = do_QueryInterface(rootAsItem);
 | 
					
						
							|  |  |  | +  return nsDocShell::Cast(rootShell);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetBypassCSPEnabled(bool* aEnabled) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(aEnabled);
 | 
					
						
							|  |  |  | +  *aEnabled = mBypassCSPEnabled;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetBypassCSPEnabled(bool aEnabled) {
 | 
					
						
							|  |  |  | +  mBypassCSPEnabled = aEnabled;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetForceActiveState(bool* aEnabled) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(aEnabled);
 | 
					
						
							|  |  |  | +  *aEnabled = mForceActiveState;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetForceActiveState(bool aEnabled) {
 | 
					
						
							|  |  |  | +  mForceActiveState = aEnabled;
 | 
					
						
							|  |  |  | +  ActivenessMaybeChanged();
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +bool nsDocShell::IsBypassCSPEnabled() {
 | 
					
						
							|  |  |  | +  return GetRootDocShell()->mBypassCSPEnabled;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetOverrideHasFocus(bool* aEnabled) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(aEnabled);
 | 
					
						
							|  |  |  | +  *aEnabled = mOverrideHasFocus;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetOverrideHasFocus(bool aEnabled) {
 | 
					
						
							|  |  |  | +  mOverrideHasFocus = aEnabled;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +bool nsDocShell::ShouldOverrideHasFocus() const {
 | 
					
						
							|  |  |  | +  return mOverrideHasFocus;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetLanguageOverride(nsAString& aLanguageOverride) {
 | 
					
						
							|  |  |  | +  aLanguageOverride = GetRootDocShell()->mLanguageOverride;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +static void SetIcuLocale(const nsAString& aLanguageOverride) {
 | 
					
						
							|  |  |  | +  icu::Locale locale(NS_LossyConvertUTF16toASCII(aLanguageOverride).get());
 | 
					
						
							|  |  |  | +  if (icu::Locale::getDefault() == locale)
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  UErrorCode error_code = U_ZERO_ERROR;
 | 
					
						
							|  |  |  | +  const char* lang = locale.getLanguage();
 | 
					
						
							|  |  |  | +  if (lang != nullptr && *lang != '\0') {
 | 
					
						
							|  |  |  | +    icu::Locale::setDefault(locale, error_code);
 | 
					
						
							|  |  |  | +  } else {
 | 
					
						
							|  |  |  | +    fprintf(stderr, "SetIcuLocale Failed to set the ICU default locale to %s\n", NS_LossyConvertUTF16toASCII(aLanguageOverride).get());
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  AutoJSAPI jsapi;
 | 
					
						
							|  |  |  | +  jsapi.Init();
 | 
					
						
							|  |  |  | +  JSContext* cx = jsapi.cx();
 | 
					
						
							|  |  |  | +  JS_ResetDefaultLocale(JS_GetRuntime(cx));
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  ResetDefaultLocaleInAllWorkers();
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetLanguageOverride(const nsAString& aLanguageOverride) {
 | 
					
						
							|  |  |  | +  mLanguageOverride = aLanguageOverride;
 | 
					
						
							|  |  |  | +  SetIcuLocale(aLanguageOverride);
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::OverrideTimezone(const nsAString& aTimezoneOverride,
 | 
					
						
							|  |  |  | +                             bool* aSuccess) {
 | 
					
						
							|  |  |  | +  NS_ENSURE_ARG(aSuccess);
 | 
					
						
							|  |  |  | +  NS_LossyConvertUTF16toASCII timeZoneId(aTimezoneOverride);
 | 
					
						
							|  |  |  | +  *aSuccess = nsJSUtils::SetTimeZoneOverride(timeZoneId.get());
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  // Set TZ which affects localtime_s().
 | 
					
						
							|  |  |  | +  auto setTimeZoneEnv = [](const char* value) {
 | 
					
						
							|  |  |  | +#if defined(_WIN32)
 | 
					
						
							|  |  |  | +    return _putenv_s("TZ", value) == 0;
 | 
					
						
							|  |  |  | +#else
 | 
					
						
							|  |  |  | +    return setenv("TZ", value, true) == 0;
 | 
					
						
							|  |  |  | +#endif /* _WIN32 */
 | 
					
						
							|  |  |  | +  };
 | 
					
						
							|  |  |  | +  if (*aSuccess) {
 | 
					
						
							|  |  |  | +    *aSuccess = setTimeZoneEnv(timeZoneId.get());
 | 
					
						
							|  |  |  | +    if (!*aSuccess) {
 | 
					
						
							|  |  |  | +      fprintf(stderr, "Failed to set 'TZ' to '%s'\n", timeZoneId.get());
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetFileInputInterceptionEnabled(bool* aEnabled) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(aEnabled);
 | 
					
						
							|  |  |  | +  *aEnabled = GetRootDocShell()->mFileInputInterceptionEnabled;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetFileInputInterceptionEnabled(bool aEnabled) {
 | 
					
						
							|  |  |  | +  mFileInputInterceptionEnabled = aEnabled;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +bool nsDocShell::IsFileInputInterceptionEnabled() {
 | 
					
						
							|  |  |  | +  return GetRootDocShell()->mFileInputInterceptionEnabled;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +void nsDocShell::FilePickerShown(mozilla::dom::Element* element) {
 | 
					
						
							|  |  |  | +  nsCOMPtr<nsIObserverService> observerService =
 | 
					
						
							|  |  |  | +      mozilla::services::GetObserverService();
 | 
					
						
							|  |  |  | +  observerService->NotifyObservers(
 | 
					
						
							|  |  |  | +      ToSupports(element), "juggler-file-picker-shown", nullptr);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +RefPtr<nsGeolocationService> nsDocShell::GetGeolocationServiceOverride() {
 | 
					
						
							|  |  |  | +  return GetRootDocShell()->mGeolocationServiceOverride;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetGeolocationOverride(nsIDOMGeoPosition* aGeolocationOverride) {
 | 
					
						
							|  |  |  | +  if (aGeolocationOverride) {
 | 
					
						
							|  |  |  | +    if (!mGeolocationServiceOverride) {
 | 
					
						
							|  |  |  | +      mGeolocationServiceOverride = new nsGeolocationService();
 | 
					
						
							|  |  |  | +      mGeolocationServiceOverride->Init();
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +    mGeolocationServiceOverride->Update(aGeolocationOverride);
 | 
					
						
							|  |  |  | +  } else {
 | 
					
						
							|  |  |  | +    mGeolocationServiceOverride = nullptr;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetOnlineOverride(OnlineOverride* aOnlineOverride) {
 | 
					
						
							|  |  |  | +  *aOnlineOverride = GetRootDocShell()->mOnlineOverride;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetOnlineOverride(OnlineOverride aOnlineOverride) {
 | 
					
						
							|  |  |  | +  // We don't have a way to verify this coming from Javascript, so this check is
 | 
					
						
							|  |  |  | +  // still needed.
 | 
					
						
							|  |  |  | +  if (!(aOnlineOverride == ONLINE_OVERRIDE_NONE ||
 | 
					
						
							|  |  |  | +        aOnlineOverride == ONLINE_OVERRIDE_ONLINE ||
 | 
					
						
							|  |  |  | +        aOnlineOverride == ONLINE_OVERRIDE_OFFLINE)) {
 | 
					
						
							|  |  |  | +    return NS_ERROR_INVALID_ARG;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  mOnlineOverride = aOnlineOverride;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +nsDocShell::GetReducedMotionOverride(ReducedMotionOverride* aReducedMotionOverride) {
 | 
					
						
							|  |  |  | +  *aReducedMotionOverride = GetRootDocShell()->mReducedMotionOverride;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetReducedMotionOverride(ReducedMotionOverride aReducedMotionOverride) {
 | 
					
						
							|  |  |  | +  mReducedMotionOverride = aReducedMotionOverride;
 | 
					
						
							|  |  |  | +  RefPtr<nsPresContext> presContext = GetPresContext();
 | 
					
						
							|  |  |  | +  if (presContext) {
 | 
					
						
							|  |  |  | +    presContext->MediaFeatureValuesChanged(
 | 
					
						
							|  |  |  | +        {MediaFeatureChangeReason::SystemMetricsChange},
 | 
					
						
							|  |  |  | +        MediaFeatureChangePropagation::JustThisDocument);
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::GetForcedColorsOverride(ForcedColorsOverride* aForcedColorsOverride) {
 | 
					
						
							|  |  |  | +  *aForcedColorsOverride = GetRootDocShell()->mForcedColorsOverride;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +nsDocShell::SetForcedColorsOverride(ForcedColorsOverride aForcedColorsOverride) {
 | 
					
						
							|  |  |  | +  mForcedColorsOverride = aForcedColorsOverride;
 | 
					
						
							|  |  |  | +  RefPtr<nsPresContext> presContext = GetPresContext();
 | 
					
						
							|  |  |  | +  if (presContext) {
 | 
					
						
							|  |  |  | +    presContext->MediaFeatureValuesChanged(
 | 
					
						
							|  |  |  | +        {MediaFeatureChangeReason::SystemMetricsChange},
 | 
					
						
							|  |  |  | +        MediaFeatureChangePropagation::JustThisDocument);
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +// =============== Juggler End =======================
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  NS_IMETHODIMP | 
					
						
							|  |  |  |  nsDocShell::GetIsNavigating(bool* aOut) { | 
					
						
							|  |  |  |    *aOut = mIsNavigating; | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -4886,7 +5118,7 @@ nsDocShell::GetVisibility(bool* aVisibility) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  void nsDocShell::ActivenessMaybeChanged() { | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | -  const bool isActive = mBrowsingContext->IsActive();
 | 
					
						
							|  |  |  | +  const bool isActive = mForceActiveState || mBrowsingContext->IsActive();
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    if (RefPtr<PresShell> presShell = GetPresShell()) { | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |      presShell->ActivenessMaybeChanged(); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -8624,6 +8856,12 @@ nsresult nsDocShell::PerformRetargeting(nsDocShellLoadState* aLoadState) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |                       true,  // aForceNoOpener | 
					
						
							|  |  |  |                       getter_AddRefs(newBC)); | 
					
						
							|  |  |  |        MOZ_ASSERT(!newBC); | 
					
						
							|  |  |  | +      if (rv == NS_OK) {
 | 
					
						
							|  |  |  | +        nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
 | 
					
						
							|  |  |  | +        if (observerService) {
 | 
					
						
							|  |  |  | +          observerService->NotifyObservers(GetAsSupports(this), "juggler-window-open-in-new-context", nullptr);
 | 
					
						
							|  |  |  | +        }
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  |        return rv; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -12780,6 +13018,9 @@ class OnLinkClickEvent : public Runnable {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        mHandler->OnLinkClickSync(mContent, mLoadState, mNoOpenerImplied, | 
					
						
							|  |  |  |                                  mTriggeringPrincipal); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  | +    nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
 | 
					
						
							|  |  |  | +    observerService->NotifyObservers(ToSupports(mContent), "juggler-link-click-sync", nullptr);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |      return NS_OK; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -12859,6 +13100,8 @@ nsresult nsDocShell::OnLinkClick(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    nsCOMPtr<nsIRunnable> ev = | 
					
						
							|  |  |  |        new OnLinkClickEvent(this, aContent, loadState, noOpenerImplied, | 
					
						
							|  |  |  |                             aIsTrusted, aTriggeringPrincipal); | 
					
						
							|  |  |  | +  nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
 | 
					
						
							|  |  |  | +  observerService->NotifyObservers(ToSupports(aContent), "juggler-link-click", nullptr);
 | 
					
						
							|  |  |  |    return Dispatch(TaskCategory::UI, ev.forget()); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 61998bf661a2c765411280e03d0726b227c31a3f..5ba8e2ac8e13ae9d18591fd477e5c9414843e3cc 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/docshell/base/nsDocShell.h
 | 
					
						
							|  |  |  | +++ b/docshell/base/nsDocShell.h
 | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  | @@ -16,6 +16,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "mozilla/UniquePtr.h" | 
					
						
							|  |  |  |  #include "mozilla/WeakPtr.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/BrowsingContext.h" | 
					
						
							|  |  |  | +#include "mozilla/dom/Element.h"
 | 
					
						
							|  |  |  |  #include "mozilla/dom/WindowProxyHolder.h" | 
					
						
							|  |  |  |  #include "nsCOMPtr.h" | 
					
						
							|  |  |  |  #include "nsCharsetSource.h" | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -77,6 +78,7 @@ class nsCommandManager;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  class nsDocShellEditorData; | 
					
						
							|  |  |  |  class nsDOMNavigationTiming; | 
					
						
							|  |  |  |  class nsDSURIContentListener; | 
					
						
							|  |  |  | +class nsGeolocationService;
 | 
					
						
							|  |  |  |  class nsGlobalWindowOuter; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  class FramingChecker; | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -409,6 +411,15 @@ class nsDocShell final : public nsDocLoader,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    void SetWillChangeProcess() { mWillChangeProcess = true; } | 
					
						
							|  |  |  |    bool WillChangeProcess() { return mWillChangeProcess; } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  bool IsFileInputInterceptionEnabled();
 | 
					
						
							|  |  |  | +  void FilePickerShown(mozilla::dom::Element* element);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  bool ShouldOverrideHasFocus() const;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  bool IsBypassCSPEnabled();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  RefPtr<nsGeolocationService> GetGeolocationServiceOverride();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // Create a content viewer within this nsDocShell for the given | 
					
						
							|  |  |  |    // `WindowGlobalChild` actor. | 
					
						
							|  |  |  |    nsresult CreateContentViewerForActor( | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1028,6 +1039,8 @@ class nsDocShell final : public nsDocLoader,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    bool CSSErrorReportingEnabled() const { return mCSSErrorReportingEnabled; } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  nsDocShell* GetRootDocShell();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // 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 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1313,6 +1326,16 @@ class nsDocShell final : public nsDocLoader,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    bool mAllowDNSPrefetch : 1; | 
					
						
							|  |  |  |    bool mAllowWindowControl : 1; | 
					
						
							|  |  |  |    bool mCSSErrorReportingEnabled : 1; | 
					
						
							|  |  |  | +  bool mFileInputInterceptionEnabled: 1;
 | 
					
						
							|  |  |  | +  bool mOverrideHasFocus : 1;
 | 
					
						
							|  |  |  | +  bool mBypassCSPEnabled : 1;
 | 
					
						
							|  |  |  | +  bool mForceActiveState : 1;
 | 
					
						
							|  |  |  | +  nsString mLanguageOverride;
 | 
					
						
							|  |  |  | +  RefPtr<nsGeolocationService> mGeolocationServiceOverride;
 | 
					
						
							|  |  |  | +  OnlineOverride mOnlineOverride;
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +  ReducedMotionOverride mReducedMotionOverride;
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +  ForcedColorsOverride mForcedColorsOverride;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |    bool mAllowAuth : 1; | 
					
						
							|  |  |  |    bool mAllowKeywordFixup : 1; | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  |    bool mDisableMetaRefreshWhenInactive : 1; | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index 6b85ddd842a6d2e29f86047017b78b2007b99867..e0b56c4f85544580b9a631619fb06799ad244494 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/docshell/base/nsIDocShell.idl
 | 
					
						
							|  |  |  | +++ b/docshell/base/nsIDocShell.idl
 | 
					
						
							|  |  |  | @@ -44,6 +44,7 @@ interface nsIURI;
 | 
					
						
							|  |  |  |  interface nsIChannel; | 
					
						
							|  |  |  |  interface nsIContentViewer; | 
					
						
							|  |  |  |  interface nsIContentSecurityPolicy; | 
					
						
							|  |  |  | +interface nsIDOMGeoPosition;
 | 
					
						
							|  |  |  |  interface nsIEditor; | 
					
						
							|  |  |  |  interface nsIEditingSession; | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  |  interface nsIInputStream; | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -803,6 +804,41 @@ interface nsIDocShell : nsIDocShellTreeItem
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |     */ | 
					
						
							|  |  |  |    void synchronizeLayoutHistoryState(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  attribute boolean fileInputInterceptionEnabled;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  attribute boolean overrideHasFocus;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  attribute boolean bypassCSPEnabled;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  attribute boolean forceActiveState;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  attribute AString languageOverride;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  boolean overrideTimezone(in AString timezoneId);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  cenum OnlineOverride: 8 {
 | 
					
						
							|  |  |  | +    ONLINE_OVERRIDE_NONE = 0,
 | 
					
						
							|  |  |  | +    ONLINE_OVERRIDE_ONLINE = 1,
 | 
					
						
							|  |  |  | +    ONLINE_OVERRIDE_OFFLINE = 2,
 | 
					
						
							|  |  |  | +  };
 | 
					
						
							|  |  |  | +  [infallible] attribute nsIDocShell_OnlineOverride onlineOverride;
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +  cenum ReducedMotionOverride : 8 {
 | 
					
						
							|  |  |  | +    REDUCED_MOTION_OVERRIDE_REDUCE,
 | 
					
						
							|  |  |  | +    REDUCED_MOTION_OVERRIDE_NO_PREFERENCE,
 | 
					
						
							|  |  |  | +    REDUCED_MOTION_OVERRIDE_NONE, /* This clears the override. */
 | 
					
						
							|  |  |  | +  };
 | 
					
						
							|  |  |  | +  [infallible] attribute nsIDocShell_ReducedMotionOverride reducedMotionOverride;
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +  cenum ForcedColorsOverride : 8 {
 | 
					
						
							|  |  |  | +    FORCED_COLORS_OVERRIDE_ACTIVE,
 | 
					
						
							|  |  |  | +    FORCED_COLORS_OVERRIDE_NONE,
 | 
					
						
							|  |  |  | +    FORCED_COLORS_OVERRIDE_NO_OVERRIDE, /* This clears the override. */
 | 
					
						
							|  |  |  | +  };
 | 
					
						
							|  |  |  | +  [infallible] attribute nsIDocShell_ForcedColorsOverride forcedColorsOverride;
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  void setGeolocationOverride(in nsIDOMGeoPosition position);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    /** | 
					
						
							|  |  |  |     * 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
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index b34ad3970c1ecaefeb756b9c2f4ca44727bd8be9..e1ea4bce868c4385d498305bf7c1bbd4de282415 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/Document.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/Document.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -3646,6 +3646,9 @@ void Document::SendToConsole(nsCOMArray<nsISecurityConsoleMessage>& aMessages) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  void Document::ApplySettingsFromCSP(bool aSpeculative) { | 
					
						
							|  |  |  | +  if (mDocumentContainer && mDocumentContainer->IsBypassCSPEnabled())
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    nsresult rv = NS_OK; | 
					
						
							|  |  |  |    if (!aSpeculative) { | 
					
						
							|  |  |  |      // 1) apply settings from regular CSP | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -3703,6 +3706,11 @@ nsresult Document::InitCSP(nsIChannel* aChannel) {
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  |    MOZ_ASSERT(!mScriptGlobalObject, | 
					
						
							|  |  |  |               "CSP must be initialized before mScriptGlobalObject is set!"); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  | +  nsCOMPtr<nsIDocShell> shell(mDocumentContainer);
 | 
					
						
							|  |  |  | +  if (shell && nsDocShell::Cast(shell)->IsBypassCSPEnabled()) {
 | 
					
						
							|  |  |  | +    return NS_OK;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // If this is a data document - no need to set CSP. | 
					
						
							|  |  |  |    if (mLoadedAsData) { | 
					
						
							|  |  |  |      return NS_OK; | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -4509,6 +4517,10 @@ bool Document::HasFocus(ErrorResult& rv) const {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      return false; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  if (IsActive() && mDocumentContainer->ShouldOverrideHasFocus()) {
 | 
					
						
							|  |  |  | +    return true;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |    if (!fm->IsInActiveWindow(bc)) { | 
					
						
							|  |  |  |      return false; | 
					
						
							|  |  |  |    } | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -17974,6 +17986,71 @@ ColorScheme Document::PreferredColorScheme(IgnoreRFP aIgnoreRFP) const {
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |    return LookAndFeel::PreferredColorSchemeForContent(); | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +bool Document::PrefersReducedMotion() const {
 | 
					
						
							|  |  |  | +  auto* docShell = static_cast<nsDocShell*>(GetDocShell());
 | 
					
						
							|  |  |  | +  nsIDocShell::ReducedMotionOverride reducedMotion;
 | 
					
						
							|  |  |  | +  if (docShell && docShell->GetReducedMotionOverride(&reducedMotion) == NS_OK &&
 | 
					
						
							|  |  |  | +      reducedMotion != nsIDocShell::REDUCED_MOTION_OVERRIDE_NONE) {
 | 
					
						
							|  |  |  | +    switch (reducedMotion) {
 | 
					
						
							|  |  |  | +      case nsIDocShell::REDUCED_MOTION_OVERRIDE_REDUCE:
 | 
					
						
							|  |  |  | +        return true;
 | 
					
						
							|  |  |  | +      case nsIDocShell::REDUCED_MOTION_OVERRIDE_NO_PREFERENCE:
 | 
					
						
							|  |  |  | +        return false;
 | 
					
						
							|  |  |  | +      case nsIDocShell::REDUCED_MOTION_OVERRIDE_NONE:
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +    };
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  if (auto* bc = GetBrowsingContext()) {
 | 
					
						
							|  |  |  | +    switch (bc->Top()->PrefersReducedMotionOverride()) {
 | 
					
						
							|  |  |  | +      case dom::PrefersReducedMotionOverride::Reduce:
 | 
					
						
							|  |  |  | +        return true;
 | 
					
						
							|  |  |  | +      case dom::PrefersReducedMotionOverride::No_preference:
 | 
					
						
							|  |  |  | +        return false;
 | 
					
						
							|  |  |  | +      case dom::PrefersReducedMotionOverride::None:
 | 
					
						
							|  |  |  | +      case dom::PrefersReducedMotionOverride::EndGuard_:
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  if (nsContentUtils::ShouldResistFingerprinting(this)) {
 | 
					
						
							|  |  |  | +    return false;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return LookAndFeel::GetInt(LookAndFeel::IntID::PrefersReducedMotion, 0) == 1;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +bool Document::ForcedColors() const {
 | 
					
						
							|  |  |  | +  auto* docShell = static_cast<nsDocShell*>(GetDocShell());
 | 
					
						
							|  |  |  | +  nsIDocShell::ForcedColorsOverride forcedColors;
 | 
					
						
							|  |  |  | +  if (docShell && docShell->GetForcedColorsOverride(&forcedColors) == NS_OK) {
 | 
					
						
							|  |  |  | +    switch (forcedColors) {
 | 
					
						
							|  |  |  | +      case nsIDocShell::FORCED_COLORS_OVERRIDE_ACTIVE:
 | 
					
						
							|  |  |  | +        return true;
 | 
					
						
							|  |  |  | +      case nsIDocShell::FORCED_COLORS_OVERRIDE_NONE:
 | 
					
						
							|  |  |  | +        return false;
 | 
					
						
							|  |  |  | +      case nsIDocShell::FORCED_COLORS_OVERRIDE_NO_OVERRIDE:
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +    };
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  if (auto* bc = GetBrowsingContext()) {
 | 
					
						
							|  |  |  | +    switch (bc->Top()->ForcedColorsOverride()) {
 | 
					
						
							|  |  |  | +      case dom::ForcedColorsOverride::Active:
 | 
					
						
							|  |  |  | +        return true;
 | 
					
						
							|  |  |  | +      case dom::ForcedColorsOverride::None:
 | 
					
						
							|  |  |  | +        return false;
 | 
					
						
							|  |  |  | +      case dom::ForcedColorsOverride::No_override:
 | 
					
						
							|  |  |  | +      case dom::ForcedColorsOverride::EndGuard_:
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  if (mIsBeingUsedAsImage) {
 | 
					
						
							|  |  |  | +    return false;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return !PreferenceSheet::PrefsFor(*this).mUseDocumentColors;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |  bool Document::HasRecentlyStartedForegroundLoads() { | 
					
						
							|  |  |  |    if (!sLoadingForegroundTopLevelContentDocument) { | 
					
						
							|  |  |  |      return false; | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | diff --git a/dom/base/Document.h b/dom/base/Document.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 422ae0179f660b4ff49f1d7e06173d23d5794628..de74cd1b5a2e8ae214be9304a6346067fb541d29 100644
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | --- a/dom/base/Document.h
 | 
					
						
							|  |  |  | +++ b/dom/base/Document.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -4016,6 +4016,9 @@ class Document : public nsINode,
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |    // color-scheme meta tag. | 
					
						
							|  |  |  |    ColorScheme DefaultColorScheme() const; | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |   | 
					
						
							|  |  |  | +  bool PrefersReducedMotion() const;
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +  bool ForcedColors() const;
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |    static bool HasRecentlyStartedForegroundLoads(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    static bool AutomaticStorageAccessPermissionCanBeGranted( | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 92081a09b4925e0b687608abd8ad51d02ff2f5cf..b010190d8af0cd1765d91b5bbd7e46e360a6c30f 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/Navigator.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/Navigator.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -325,14 +325,18 @@ void Navigator::GetAppName(nsAString& aAppName, CallerType aCallerType) const {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   * for more detail. | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |  /* static */ | 
					
						
							|  |  |  | -void Navigator::GetAcceptLanguages(nsTArray<nsString>& aLanguages) {
 | 
					
						
							|  |  |  | +void Navigator::GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray<nsString>& aLanguages) {
 | 
					
						
							|  |  |  |    MOZ_ASSERT(NS_IsMainThread()); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    aLanguages.Clear(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    // E.g. "de-de, en-us,en". | 
					
						
							|  |  |  |    nsAutoString acceptLang; | 
					
						
							|  |  |  | -  Preferences::GetLocalizedString("intl.accept_languages", acceptLang);
 | 
					
						
							|  |  |  | +  if (aLanguageOverride && aLanguageOverride->Length())
 | 
					
						
							|  |  |  | +    acceptLang = *aLanguageOverride;
 | 
					
						
							|  |  |  | +  else
 | 
					
						
							|  |  |  | +    Preferences::GetLocalizedString("intl.accept_languages", acceptLang);
 | 
					
						
							|  |  |  | +    
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    // Split values on commas. | 
					
						
							|  |  |  |    for (nsDependentSubstring lang : | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -384,7 +388,13 @@ void Navigator::GetLanguage(nsAString& aLanguage) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  void Navigator::GetLanguages(nsTArray<nsString>& aLanguages) { | 
					
						
							|  |  |  | -  GetAcceptLanguages(aLanguages);
 | 
					
						
							| 
									
										
										
										
											2022-06-30 04:47:45 +08:00
										 |  |  | +  if (mWindow && mWindow->GetDocShell()) {
 | 
					
						
							|  |  |  | +    nsString languageOverride;
 | 
					
						
							|  |  |  | +    mWindow->GetDocShell()->GetLanguageOverride(languageOverride);
 | 
					
						
							|  |  |  | +    GetAcceptLanguages(&languageOverride, aLanguages);
 | 
					
						
							|  |  |  | +  } else {
 | 
					
						
							|  |  |  | +    GetAcceptLanguages(nullptr, aLanguages);
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    // The returned value is cached by the binding code. The window listens to the | 
					
						
							|  |  |  |    // accept languages change and will clear the cache when needed. It has to | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -563,7 +573,13 @@ bool Navigator::CookieEnabled() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    return granted; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -bool Navigator::OnLine() { return !NS_IsOffline(); }
 | 
					
						
							|  |  |  | +bool Navigator::OnLine() {
 | 
					
						
							|  |  |  | +  nsDocShell* docShell = static_cast<nsDocShell*>(GetDocShell());
 | 
					
						
							|  |  |  | +  nsIDocShell::OnlineOverride onlineOverride;
 | 
					
						
							|  |  |  | +  if (!docShell || docShell->GetOnlineOverride(&onlineOverride) != NS_OK || onlineOverride == nsIDocShell::ONLINE_OVERRIDE_NONE)
 | 
					
						
							|  |  |  | +    return !NS_IsOffline();
 | 
					
						
							|  |  |  | +  return onlineOverride == nsIDocShell::ONLINE_OVERRIDE_ONLINE;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  void Navigator::GetBuildID(nsAString& aBuildID, CallerType aCallerType, | 
					
						
							|  |  |  |                             ErrorResult& aRv) const { | 
					
						
							|  |  |  | diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index cb821086b1ac884ba96ef8874211bff16106b206..3b93388637f9ec7493735e9beb6f02a78e14c6b3 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/Navigator.h
 | 
					
						
							|  |  |  | +++ b/dom/base/Navigator.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -215,7 +215,7 @@ class Navigator final : public nsISupports, public nsWrapperCache {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    StorageManager* Storage(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  static void GetAcceptLanguages(nsTArray<nsString>& aLanguages);
 | 
					
						
							|  |  |  | +  static void GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray<nsString>& aLanguages);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    dom::MediaCapabilities* MediaCapabilities(); | 
					
						
							|  |  |  |    dom::MediaSession* MediaSession(); | 
					
						
							|  |  |  | diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 25b6994c9a42054f97b18d5c4a3e35a0010ee749..cef7ba95112677f1a41beb66db718126601bd151 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsContentUtils.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/nsContentUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -8505,7 +8505,8 @@ nsresult nsContentUtils::SendMouseEvent(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      bool aIgnoreRootScrollFrame, float aPressure, | 
					
						
							|  |  |  |      unsigned short aInputSourceArg, uint32_t aIdentifier, bool aToWindow, | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |      PreventDefaultResult* aPreventDefault, bool aIsDOMEventSynthesized, | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | -    bool aIsWidgetEventSynthesized) {
 | 
					
						
							|  |  |  | +    bool aIsWidgetEventSynthesized,
 | 
					
						
							|  |  |  | +    bool convertToPointer) {
 | 
					
						
							|  |  |  |    nsPoint offset; | 
					
						
							|  |  |  |    nsCOMPtr<nsIWidget> widget = GetWidget(aPresShell, &offset); | 
					
						
							|  |  |  |    if (!widget) return NS_ERROR_FAILURE; | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -8564,6 +8565,7 @@ nsresult nsContentUtils::SendMouseEvent(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    event.mTime = PR_IntervalNow(); | 
					
						
							|  |  |  |    event.mFlags.mIsSynthesizedForTests = aIsDOMEventSynthesized; | 
					
						
							|  |  |  |    event.mExitFrom = exitFrom; | 
					
						
							|  |  |  | +  event.convertToPointer = convertToPointer;
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    nsPresContext* presContext = aPresShell->GetPresContext(); | 
					
						
							|  |  |  |    if (!presContext) return NS_ERROR_FAILURE; | 
					
						
							|  |  |  | diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index de038d0832adb4037d2d076011e433412e85cb83..79c59cb6da7a7746df983614d7eff02f97eddfb0 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsContentUtils.h
 | 
					
						
							|  |  |  | +++ b/dom/base/nsContentUtils.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2957,7 +2957,8 @@ class nsContentUtils {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        int32_t aModifiers, bool aIgnoreRootScrollFrame, float aPressure, | 
					
						
							|  |  |  |        unsigned short aInputSourceArg, uint32_t aIdentifier, bool aToWindow, | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |        mozilla::PreventDefaultResult* aPreventDefault, | 
					
						
							|  |  |  | -      bool aIsDOMEventSynthesized, bool aIsWidgetEventSynthesized);
 | 
					
						
							|  |  |  | +      bool aIsDOMEventSynthesized, bool aIsWidgetEventSynthesized,
 | 
					
						
							|  |  |  | +      bool convertToPointer = true);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    static void FirePageShowEventForFrameLoaderSwap( | 
					
						
							|  |  |  |        nsIDocShellTreeItem* aItem, | 
					
						
							|  |  |  | diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 972be59520940e93e703312e42c2ef250d2bb4d6..11faf5ab1ab25449ebfbaf41b1dfad15a43096a9 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsDOMWindowUtils.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/nsDOMWindowUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -683,7 +683,7 @@ nsDOMWindowUtils::SendMouseEvent(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      int32_t aClickCount, int32_t aModifiers, bool aIgnoreRootScrollFrame, | 
					
						
							|  |  |  |      float aPressure, unsigned short aInputSourceArg, | 
					
						
							|  |  |  |      bool aIsDOMEventSynthesized, bool aIsWidgetEventSynthesized, | 
					
						
							|  |  |  | -    int32_t aButtons, uint32_t aIdentifier, uint8_t aOptionalArgCount,
 | 
					
						
							|  |  |  | +    int32_t aButtons, uint32_t aIdentifier, bool aDisablePointerEvent, uint8_t aOptionalArgCount,
 | 
					
						
							|  |  |  |      bool* aPreventDefault) { | 
					
						
							|  |  |  |    return SendMouseEventCommon( | 
					
						
							|  |  |  |        aType, aX, aY, aButton, aClickCount, aModifiers, aIgnoreRootScrollFrame, | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -691,7 +691,7 @@ nsDOMWindowUtils::SendMouseEvent(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        aOptionalArgCount >= 7 ? aIdentifier : DEFAULT_MOUSE_POINTER_ID, false, | 
					
						
							|  |  |  |        aPreventDefault, aOptionalArgCount >= 4 ? aIsDOMEventSynthesized : true, | 
					
						
							|  |  |  |        aOptionalArgCount >= 5 ? aIsWidgetEventSynthesized : false, | 
					
						
							|  |  |  | -      aOptionalArgCount >= 6 ? aButtons : MOUSE_BUTTONS_NOT_SPECIFIED);
 | 
					
						
							|  |  |  | +      aOptionalArgCount >= 6 ? aButtons : MOUSE_BUTTONS_NOT_SPECIFIED, !aDisablePointerEvent);
 | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  NS_IMETHODIMP | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -718,13 +718,13 @@ nsDOMWindowUtils::SendMouseEventCommon(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      int32_t aClickCount, int32_t aModifiers, bool aIgnoreRootScrollFrame, | 
					
						
							|  |  |  |      float aPressure, unsigned short aInputSourceArg, uint32_t aPointerId, | 
					
						
							|  |  |  |      bool aToWindow, bool* aPreventDefault, bool aIsDOMEventSynthesized, | 
					
						
							|  |  |  | -    bool aIsWidgetEventSynthesized, int32_t aButtons) {
 | 
					
						
							|  |  |  | +    bool aIsWidgetEventSynthesized, int32_t aButtons, bool aConvertToPointer) {
 | 
					
						
							|  |  |  |    RefPtr<PresShell> presShell = GetPresShell(); | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |    PreventDefaultResult preventDefaultResult; | 
					
						
							|  |  |  |    nsresult rv = nsContentUtils::SendMouseEvent( | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        presShell, aType, aX, aY, aButton, aButtons, aClickCount, aModifiers, | 
					
						
							|  |  |  |        aIgnoreRootScrollFrame, aPressure, aInputSourceArg, aPointerId, aToWindow, | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | -      &preventDefaultResult, aIsDOMEventSynthesized, aIsWidgetEventSynthesized);
 | 
					
						
							|  |  |  | +      &preventDefaultResult, aIsDOMEventSynthesized, aIsWidgetEventSynthesized, aConvertToPointer);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |    if (aPreventDefault) { | 
					
						
							|  |  |  |      *aPreventDefault = preventDefaultResult != PreventDefaultResult::No; | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/dom/base/nsDOMWindowUtils.h b/dom/base/nsDOMWindowUtils.h
 | 
					
						
							| 
									
										
										
										
											2021-09-08 22:54:44 +08:00
										 |  |  | index 30e0fafa77857c33e9871259a6ac0cebac965df8..3d8810abcfac1c220529b4e6163b0159475723ff 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsDOMWindowUtils.h
 | 
					
						
							|  |  |  | +++ b/dom/base/nsDOMWindowUtils.h
 | 
					
						
							|  |  |  | @@ -93,7 +93,7 @@ class nsDOMWindowUtils final : public nsIDOMWindowUtils,
 | 
					
						
							|  |  |  |        int32_t aClickCount, int32_t aModifiers, bool aIgnoreRootScrollFrame, | 
					
						
							|  |  |  |        float aPressure, unsigned short aInputSourceArg, uint32_t aIdentifier, | 
					
						
							|  |  |  |        bool aToWindow, bool* aPreventDefault, bool aIsDOMEventSynthesized, | 
					
						
							|  |  |  | -      bool aIsWidgetEventSynthesized, int32_t aButtons);
 | 
					
						
							|  |  |  | +      bool aIsWidgetEventSynthesized, int32_t aButtons, bool aConvertToPointer = true);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    MOZ_CAN_RUN_SCRIPT | 
					
						
							|  |  |  |    nsresult SendTouchEventCommon( | 
					
						
							|  |  |  | diff --git a/dom/base/nsFocusManager.cpp b/dom/base/nsFocusManager.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 25c06cd90d552345da4fffbcdb4dfaab02377c97..cc81b234da508405daba42735430dd3f065d2b0c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsFocusManager.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/nsFocusManager.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -1610,6 +1610,10 @@ void nsFocusManager::SetFocusInner(Element* aNewContent, int32_t aFlags,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |          (GetActiveBrowsingContext() == newRootBrowsingContext); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  // In Playwright, we want to send focus events even if the element
 | 
					
						
							|  |  |  | +  // isn't actually in the active window.
 | 
					
						
							|  |  |  | +  isElementInActiveWindow = true;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // Exit fullscreen if a website focuses another window | 
					
						
							|  |  |  |    if (StaticPrefs::full_screen_api_exit_on_windowRaise() && | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  |        !isElementInActiveWindow && (aFlags & FLAG_RAISE) && | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2934,7 +2938,9 @@ void nsFocusManager::RaiseWindow(nsPIDOMWindowOuter* aWindow,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  if (sTestMode) {
 | 
					
						
							|  |  |  | +  // In Playwright, we still want to execte the embedder functions
 | 
					
						
							|  |  |  | +  // to actually show / focus windows.
 | 
					
						
							|  |  |  | +  if (false && sTestMode) {
 | 
					
						
							|  |  |  |      // In test mode, emulate raising the window. WindowRaised takes | 
					
						
							|  |  |  |      // 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
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 02e1ad995ba68d69e4353b89464a0259e22d24a0..bb169f97aff4fe707a4fb2be6c5db5eba7e80c49 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsGlobalWindowOuter.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/nsGlobalWindowOuter.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2489,7 +2489,7 @@ nsresult nsGlobalWindowOuter::SetNewDocument(Document* aDocument,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |          &nsGlobalWindowInner::FireOnNewGlobalObject)); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  if (newInnerWindow && !newInnerWindow->mHasNotifiedGlobalCreated && mDoc) {
 | 
					
						
							|  |  |  | +  if (newInnerWindow && mDoc) {
 | 
					
						
							|  |  |  |      // We should probably notify. However if this is the, arguably bad, | 
					
						
							|  |  |  |      // situation when we're creating a temporary non-chrome-about-blank | 
					
						
							|  |  |  |      // document in a chrome docshell, don't notify just yet. Instead wait | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2508,10 +2508,16 @@ nsresult nsGlobalWindowOuter::SetNewDocument(Document* aDocument,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      }(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      if (!isContentAboutBlankInChromeDocshell) { | 
					
						
							|  |  |  | -      newInnerWindow->mHasNotifiedGlobalCreated = true;
 | 
					
						
							|  |  |  | -      nsContentUtils::AddScriptRunner(NewRunnableMethod(
 | 
					
						
							|  |  |  | -          "nsGlobalWindowOuter::DispatchDOMWindowCreated", this,
 | 
					
						
							|  |  |  | -          &nsGlobalWindowOuter::DispatchDOMWindowCreated));
 | 
					
						
							|  |  |  | +      if (!newInnerWindow->mHasNotifiedGlobalCreated) {
 | 
					
						
							|  |  |  | +        newInnerWindow->mHasNotifiedGlobalCreated = true;
 | 
					
						
							|  |  |  | +        nsContentUtils::AddScriptRunner(NewRunnableMethod(
 | 
					
						
							|  |  |  | +            "nsGlobalWindowOuter::DispatchDOMWindowCreated", this,
 | 
					
						
							|  |  |  | +            &nsGlobalWindowOuter::DispatchDOMWindowCreated));
 | 
					
						
							|  |  |  | +      } else if (!reUseInnerWindow) {
 | 
					
						
							|  |  |  | +        nsContentUtils::AddScriptRunner(NewRunnableMethod(
 | 
					
						
							|  |  |  | +            "nsGlobalWindowOuter::JugglerDispatchDOMWindowReused", this,
 | 
					
						
							|  |  |  | +            &nsGlobalWindowOuter::JugglerDispatchDOMWindowReused));
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2632,6 +2638,19 @@ void nsGlobalWindowOuter::DispatchDOMWindowCreated() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void nsGlobalWindowOuter::JugglerDispatchDOMWindowReused() {
 | 
					
						
							|  |  |  | +  nsCOMPtr<nsIObserverService> observerService =
 | 
					
						
							|  |  |  | +      mozilla::services::GetObserverService();
 | 
					
						
							|  |  |  | +  if (observerService && mDoc) {
 | 
					
						
							|  |  |  | +    nsIPrincipal* principal = mDoc->NodePrincipal();
 | 
					
						
							|  |  |  | +    if (!principal->IsSystemPrincipal()) {
 | 
					
						
							|  |  |  | +      observerService->NotifyObservers(static_cast<nsIDOMWindow*>(this),
 | 
					
						
							|  |  |  | +                                      "juggler-dom-window-reused",
 | 
					
						
							|  |  |  | +                                      nullptr);
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  void nsGlobalWindowOuter::ClearStatus() { SetStatusOuter(u""_ns); } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  void nsGlobalWindowOuter::SetDocShell(nsDocShell* aDocShell) { | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -3769,6 +3788,14 @@ Maybe<CSSIntSize> nsGlobalWindowOuter::GetRDMDeviceSize(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        } | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | +  if (topInProcessContentDoc) {
 | 
					
						
							|  |  |  | +    nsIDocShell* docShell = topInProcessContentDoc->GetDocShell();
 | 
					
						
							|  |  |  | +    if (docShell && docShell->GetDeviceSizeIsPageSize()) {
 | 
					
						
							|  |  |  | +      nsPresContext* presContext = docShell->GetPresContext();
 | 
					
						
							|  |  |  | +      if (presContext)
 | 
					
						
							|  |  |  | +        return Some(CSSPixel::FromAppUnitsRounded(presContext->GetVisibleArea().Size()));
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  |    return Nothing(); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/dom/base/nsGlobalWindowOuter.h b/dom/base/nsGlobalWindowOuter.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index a82771c6d0bf1b5d5547e42fa3dad61537381d4a..0a4e153a11972b305a425ecb4fdb427766174a18 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsGlobalWindowOuter.h
 | 
					
						
							|  |  |  | +++ b/dom/base/nsGlobalWindowOuter.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -333,6 +333,7 @@ class nsGlobalWindowOuter final : public mozilla::dom::EventTarget,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    // Outer windows only. | 
					
						
							|  |  |  |    void DispatchDOMWindowCreated(); | 
					
						
							|  |  |  | +  void JugglerDispatchDOMWindowReused();
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    // Outer windows only. | 
					
						
							|  |  |  |    virtual void EnsureSizeAndPositionUpToDate() override; | 
					
						
							|  |  |  | diff --git a/dom/base/nsINode.cpp b/dom/base/nsINode.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | index 1088bfc489a067f95bfb84a822a787bdf9463e54..54c4687ff71ec1b82912d9139f061ef5c7d4a426 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsINode.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/nsINode.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | @@ -1324,6 +1324,62 @@ void nsINode::GetBoxQuadsFromWindowOrigin(const BoxQuadOptions& aOptions,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    mozilla::GetBoxQuadsFromWindowOrigin(this, aOptions, aResult, aRv); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | +static nsIFrame* GetFirstFrame(nsINode* aNode) {
 | 
					
						
							|  |  |  | +  if (!aNode->IsContent())
 | 
					
						
							|  |  |  | +    return nullptr;
 | 
					
						
							|  |  |  | +  nsIFrame* frame = aNode->AsContent()->GetPrimaryFrame(FlushType::Frames);
 | 
					
						
							|  |  |  | +  if (!frame) {
 | 
					
						
							|  |  |  | +    FlattenedChildIterator iter(aNode->AsContent());
 | 
					
						
							|  |  |  | +    for (nsIContent* child = iter.GetNextChild(); child; child = iter.GetNextChild()) {
 | 
					
						
							|  |  |  | +      frame = child->GetPrimaryFrame(FlushType::Frames);
 | 
					
						
							|  |  |  | +      if (frame) {
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return frame;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +void nsINode::ScrollRectIntoViewIfNeeded(int32_t x, int32_t y,
 | 
					
						
							|  |  |  | +                                         int32_t w, int32_t h,
 | 
					
						
							|  |  |  | +                                         ErrorResult& aRv) {
 | 
					
						
							|  |  |  | +  aRv = NS_ERROR_UNEXPECTED;
 | 
					
						
							|  |  |  | +  nsCOMPtr<Document> document = OwnerDoc();
 | 
					
						
							|  |  |  | +  if (!document) {
 | 
					
						
							|  |  |  | +    return aRv.ThrowNotFoundError("Node is detached from document");
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  PresShell* presShell = document->GetPresShell();
 | 
					
						
							|  |  |  | +  if (!presShell) {
 | 
					
						
							|  |  |  | +    return aRv.ThrowNotFoundError("Node is detached from document");
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | +  nsIFrame* primaryFrame = GetFirstFrame(this);
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | +  if (!primaryFrame) {
 | 
					
						
							|  |  |  | +    return aRv.ThrowNotFoundError("Node does not have a layout object");
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | +  aRv = NS_OK;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  nsRect rect;
 | 
					
						
							|  |  |  | +  if (x == -1 && y == -1 && w == -1 && h == -1) {
 | 
					
						
							|  |  |  | +    rect = primaryFrame->GetRectRelativeToSelf();
 | 
					
						
							|  |  |  | +  } else {
 | 
					
						
							|  |  |  | +    rect = nsRect(nsPresContext::CSSPixelsToAppUnits(x),
 | 
					
						
							|  |  |  | +                  nsPresContext::CSSPixelsToAppUnits(y),
 | 
					
						
							|  |  |  | +                  nsPresContext::CSSPixelsToAppUnits(w),
 | 
					
						
							|  |  |  | +                  nsPresContext::CSSPixelsToAppUnits(h));
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  presShell->ScrollFrameRectIntoView(
 | 
					
						
							|  |  |  | +      primaryFrame, rect,
 | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  | +      nsMargin(),
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +      ScrollAxis(kScrollToCenter, WhenToScroll::Always),
 | 
					
						
							|  |  |  | +      ScrollAxis(kScrollToCenter, WhenToScroll::Always),
 | 
					
						
							|  |  |  | +      ScrollFlags::ScrollOverflowHidden);
 | 
					
						
							|  |  |  | +  // If a _visual_ scroll update is pending, cancel it; otherwise, it will
 | 
					
						
							|  |  |  | +  // clobber next scroll (e.g. subsequent window.scrollTo(0, 0) wlll break).
 | 
					
						
							|  |  |  | +  if (presShell->GetPendingVisualScrollUpdate()) {
 | 
					
						
							|  |  |  | +    presShell->AcknowledgePendingVisualScrollUpdate();
 | 
					
						
							|  |  |  | +    presShell->ClearPendingVisualScrollUpdate();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  already_AddRefed<DOMQuad> nsINode::ConvertQuadFromNode( | 
					
						
							|  |  |  |      DOMQuad& aQuad, const GeometryNode& aFrom, | 
					
						
							|  |  |  |      const ConvertCoordinateOptions& aOptions, CallerType aCallerType, | 
					
						
							|  |  |  | diff --git a/dom/base/nsINode.h b/dom/base/nsINode.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 0c7c5867c4a1f2543b774a1f3371c4ce0807f33f..ae35e4a023297f2f0b9d59eb9a0fa8e5aa649202 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsINode.h
 | 
					
						
							|  |  |  | +++ b/dom/base/nsINode.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2130,6 +2130,10 @@ class nsINode : public mozilla::dom::EventTarget {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |                                     nsTArray<RefPtr<DOMQuad>>& aResult, | 
					
						
							|  |  |  |                                     ErrorResult& aRv); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  void ScrollRectIntoViewIfNeeded(int32_t x, int32_t y,
 | 
					
						
							|  |  |  | +                                  int32_t w, int32_t h,
 | 
					
						
							|  |  |  | +                                  ErrorResult& aRv);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    already_AddRefed<DOMQuad> ConvertQuadFromNode( | 
					
						
							|  |  |  |        DOMQuad& aQuad, const TextOrElementOrDocument& aFrom, | 
					
						
							|  |  |  |        const ConvertCoordinateOptions& aOptions, CallerType aCallerType, | 
					
						
							|  |  |  | diff --git a/dom/base/nsJSUtils.cpp b/dom/base/nsJSUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 1da84501bf3ce25b932ec3693f247cdb1a4fdf21..2305a1730e18ba7293a41772b9b7495b5aa66210 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsJSUtils.cpp
 | 
					
						
							|  |  |  | +++ b/dom/base/nsJSUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | @@ -169,6 +169,11 @@ bool nsJSUtils::GetScopeChainForElement(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    return true; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +/* static */
 | 
					
						
							|  |  |  | +bool nsJSUtils::SetTimeZoneOverride(const char* timezoneId) {
 | 
					
						
							|  |  |  | +  return JS::SetTimeZoneOverride(timezoneId);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  /* static */ | 
					
						
							|  |  |  |  void nsJSUtils::ResetTimeZone() { JS::ResetTimeZone(); } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/dom/base/nsJSUtils.h b/dom/base/nsJSUtils.h
 | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | index 85a21e459305f556933f4dc0fa7441d8f9ed95a9..d7cb86479ba2ed06542307349d6d86dfd026d55d 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/base/nsJSUtils.h
 | 
					
						
							|  |  |  | +++ b/dom/base/nsJSUtils.h
 | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | @@ -78,6 +78,7 @@ class nsJSUtils {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        JSContext* aCx, mozilla::dom::Element* aElement, | 
					
						
							|  |  |  |        JS::MutableHandleVector<JSObject*> aScopeChain); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  static bool SetTimeZoneOverride(const char* timezoneId);
 | 
					
						
							|  |  |  |    static void ResetTimeZone(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    static bool DumpEnabled(); | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | diff --git a/dom/chrome-webidl/BrowsingContext.webidl b/dom/chrome-webidl/BrowsingContext.webidl
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 414e8367d19057d3249f07f6590fc84534406bf3..5872741f2e22d500cd3b939e66e730aaac5ad717 100644
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | --- a/dom/chrome-webidl/BrowsingContext.webidl
 | 
					
						
							|  |  |  | +++ b/dom/chrome-webidl/BrowsingContext.webidl
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | @@ -52,6 +52,24 @@ enum PrefersColorSchemeOverride {
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |    "dark", | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +/**
 | 
					
						
							|  |  |  | + * CSS prefers-reduced-motion values.
 | 
					
						
							|  |  |  | + */
 | 
					
						
							|  |  |  | +enum PrefersReducedMotionOverride {
 | 
					
						
							|  |  |  | +  "none",
 | 
					
						
							|  |  |  | +  "reduce",
 | 
					
						
							|  |  |  | +  "no-preference",
 | 
					
						
							|  |  |  | +};
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +/**
 | 
					
						
							|  |  |  | + * CSS forced-colors values.
 | 
					
						
							|  |  |  | + */
 | 
					
						
							|  |  |  | +enum ForcedColorsOverride {
 | 
					
						
							|  |  |  | +  "none",
 | 
					
						
							|  |  |  | +  "active",
 | 
					
						
							|  |  |  | +  "no-override",  /* This clears the override. */
 | 
					
						
							|  |  |  | +};
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |  /** | 
					
						
							|  |  |  |   * Allowed overrides of platform/pref default behaviour for touch events. | 
					
						
							|  |  |  |   */ | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | @@ -186,6 +204,12 @@ interface BrowsingContext {
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |    // Color-scheme simulation, for DevTools. | 
					
						
							|  |  |  |    [SetterThrows] attribute PrefersColorSchemeOverride prefersColorSchemeOverride; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  // Reduced-Motion simulation, for DevTools.
 | 
					
						
							|  |  |  | +  [SetterThrows] attribute PrefersReducedMotionOverride prefersReducedMotionOverride;
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  | +  // Forced-Colors simulation, for DevTools.
 | 
					
						
							|  |  |  | +  [SetterThrows] attribute ForcedColorsOverride forcedColorsOverride;
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |    /** | 
					
						
							|  |  |  |     * A unique identifier for the browser element that is hosting this | 
					
						
							|  |  |  |     * BrowsingContext tree. Every BrowsingContext in the element's tree will | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/dom/geolocation/Geolocation.cpp b/dom/geolocation/Geolocation.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 5b85084f551faa37ed41a3f7c15482b68b653937..b0886dc9fdd5740d24359aed29d45351599950e1 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/geolocation/Geolocation.cpp
 | 
					
						
							|  |  |  | +++ b/dom/geolocation/Geolocation.cpp
 | 
					
						
							|  |  |  | @@ -23,6 +23,7 @@
 | 
					
						
							|  |  |  |  #include "nsComponentManagerUtils.h" | 
					
						
							|  |  |  |  #include "nsContentPermissionHelper.h" | 
					
						
							|  |  |  |  #include "nsContentUtils.h" | 
					
						
							|  |  |  | +#include "nsDocShell.h"
 | 
					
						
							|  |  |  |  #include "nsGlobalWindow.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/Document.h" | 
					
						
							|  |  |  |  #include "nsINamed.h" | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -260,10 +261,8 @@ nsGeolocationRequest::Allow(JS::Handle<JS::Value> aChoices) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      return NS_OK; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  RefPtr<nsGeolocationService> gs =
 | 
					
						
							|  |  |  | -      nsGeolocationService::GetGeolocationService();
 | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -  bool canUseCache = false;
 | 
					
						
							|  |  |  | +  nsGeolocationService* gs = mLocator->GetGeolocationService();
 | 
					
						
							|  |  |  | +  bool canUseCache = gs != nsGeolocationService::sService.get();
 | 
					
						
							|  |  |  |    CachedPositionAndAccuracy lastPosition = gs->GetCachedPosition(); | 
					
						
							|  |  |  |    if (lastPosition.position) { | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |      EpochTimeStamp cachedPositionTime_ms; | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -436,8 +435,7 @@ void nsGeolocationRequest::Shutdown() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    // If there are no other high accuracy requests, the geolocation service will | 
					
						
							|  |  |  |    // notify the provider to switch to the default accuracy. | 
					
						
							|  |  |  |    if (mOptions && mOptions->mEnableHighAccuracy) { | 
					
						
							|  |  |  | -    RefPtr<nsGeolocationService> gs =
 | 
					
						
							|  |  |  | -        nsGeolocationService::GetGeolocationService();
 | 
					
						
							|  |  |  | +    nsGeolocationService* gs = mLocator ? mLocator->GetGeolocationService() : nullptr;
 | 
					
						
							|  |  |  |      if (gs) { | 
					
						
							|  |  |  |        gs->UpdateAccuracy(); | 
					
						
							|  |  |  |      } | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -727,8 +725,14 @@ void nsGeolocationService::StopDevice() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  StaticRefPtr<nsGeolocationService> nsGeolocationService::sService; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  already_AddRefed<nsGeolocationService> | 
					
						
							|  |  |  | -nsGeolocationService::GetGeolocationService() {
 | 
					
						
							|  |  |  | +nsGeolocationService::GetGeolocationService(nsDocShell* docShell) {
 | 
					
						
							|  |  |  |    RefPtr<nsGeolocationService> result; | 
					
						
							|  |  |  | +  if (docShell) {
 | 
					
						
							|  |  |  | +    result = docShell->GetGeolocationServiceOverride();
 | 
					
						
							|  |  |  | +    if (result)
 | 
					
						
							|  |  |  | +      return result.forget();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    if (nsGeolocationService::sService) { | 
					
						
							|  |  |  |      result = nsGeolocationService::sService; | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -820,7 +824,9 @@ nsresult Geolocation::Init(nsPIDOMWindowInner* aContentDom) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    // If no aContentDom was passed into us, we are being used | 
					
						
							|  |  |  |    // by chrome/c++ and have no mOwner, no mPrincipal, and no need | 
					
						
							|  |  |  |    // to prompt. | 
					
						
							|  |  |  | -  mService = nsGeolocationService::GetGeolocationService();
 | 
					
						
							|  |  |  | +  nsCOMPtr<Document> doc = aContentDom ? aContentDom->GetDoc() : nullptr;
 | 
					
						
							|  |  |  | +  mService = nsGeolocationService::GetGeolocationService(
 | 
					
						
							|  |  |  | +      doc ? static_cast<nsDocShell*>(doc->GetDocShell()) : nullptr);
 | 
					
						
							|  |  |  |    if (mService) { | 
					
						
							|  |  |  |      mService->AddLocator(this); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | diff --git a/dom/geolocation/Geolocation.h b/dom/geolocation/Geolocation.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 5c0d2f96a22c6928d6aee5a226032c0944ae7a54..5a7bb1f6cea1946eea143dca4e2f1e19746a04a4 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/geolocation/Geolocation.h
 | 
					
						
							|  |  |  | +++ b/dom/geolocation/Geolocation.h
 | 
					
						
							|  |  |  | @@ -31,6 +31,7 @@
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #include "nsIGeolocationProvider.h" | 
					
						
							|  |  |  |  #include "mozilla/Attributes.h" | 
					
						
							|  |  |  | +#include "nsDocShell.h"
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  class nsGeolocationService; | 
					
						
							|  |  |  |  class nsGeolocationRequest; | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -48,13 +49,14 @@ struct CachedPositionAndAccuracy {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    bool isHighAccuracy; | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  /** | 
					
						
							|  |  |  |   * Singleton that manages the geolocation provider | 
					
						
							|  |  |  |   */ | 
					
						
							|  |  |  |  class nsGeolocationService final : public nsIGeolocationUpdate, | 
					
						
							|  |  |  |                                     public nsIObserver { | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  | -  static already_AddRefed<nsGeolocationService> GetGeolocationService();
 | 
					
						
							|  |  |  | +  static already_AddRefed<nsGeolocationService> GetGeolocationService(nsDocShell* docShell = nullptr);
 | 
					
						
							|  |  |  |    static mozilla::StaticRefPtr<nsGeolocationService> sService; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    NS_DECL_THREADSAFE_ISUPPORTS | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -179,6 +181,8 @@ class Geolocation final : public nsIGeolocationUpdate, public nsWrapperCache {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    // null. | 
					
						
							|  |  |  |    static already_AddRefed<Geolocation> NonWindowSingleton(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  nsGeolocationService* GetGeolocationService() { return mService; };
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  |    ~Geolocation(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index d53de983402c9e0fd2d1bd848563efc04edee616..c635674099390cf412a361430517c200fec5796a 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/html/HTMLInputElement.cpp
 | 
					
						
							|  |  |  | +++ b/dom/html/HTMLInputElement.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -53,6 +53,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #include "nsMappedAttributes.h" | 
					
						
							|  |  |  |  #include "nsIFormControl.h" | 
					
						
							|  |  |  |  #include "mozilla/dom/Document.h" | 
					
						
							|  |  |  | +#include "nsDocShell.h"
 | 
					
						
							|  |  |  |  #include "nsIFormControlFrame.h" | 
					
						
							|  |  |  |  #include "nsITextControlFrame.h" | 
					
						
							|  |  |  |  #include "nsIFrame.h" | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -746,6 +747,12 @@ nsresult HTMLInputElement::InitFilePicker(FilePickerType aType) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      return NS_ERROR_FAILURE; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  nsDocShell* docShell = static_cast<nsDocShell*>(win->GetDocShell());
 | 
					
						
							|  |  |  | +  if (docShell && docShell->IsFileInputInterceptionEnabled()) {
 | 
					
						
							|  |  |  | +    docShell->FilePickerShown(this);
 | 
					
						
							|  |  |  | +    return NS_OK;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    if (IsPopupBlocked(doc)) { | 
					
						
							|  |  |  |      return NS_OK; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 579043a768c506db54a20d615a3f44a2a55de627..33fdee86da62f1e0cc3caa6e4bc4382be9bf762e 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/interfaces/base/nsIDOMWindowUtils.idl
 | 
					
						
							|  |  |  | +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -372,7 +372,8 @@ interface nsIDOMWindowUtils : nsISupports {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |                           [optional] in boolean aIsDOMEventSynthesized, | 
					
						
							|  |  |  |                           [optional] in boolean aIsWidgetEventSynthesized, | 
					
						
							|  |  |  |                           [optional] in long aButtons, | 
					
						
							|  |  |  | -                         [optional] in unsigned long aIdentifier);
 | 
					
						
							|  |  |  | +                         [optional] in unsigned long aIdentifier,
 | 
					
						
							|  |  |  | +                         [optional] in boolean aDisablePointerEvent);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    /** Synthesize a touch event. The event types supported are: | 
					
						
							|  |  |  |     *    touchstart, touchend, touchmove, and touchcancel | 
					
						
							|  |  |  | diff --git a/dom/media/systemservices/video_engine/desktop_capture_impl.cc b/dom/media/systemservices/video_engine/desktop_capture_impl.cc
 | 
					
						
							| 
									
										
										
										
											2022-08-05 09:52:30 +08:00
										 |  |  | index 9d4e8fbbfe8d45cc6245c7659423004ad1ceedeb..f955c7bace3cedfe0469e59a5e8c5824158c4d50 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/media/systemservices/video_engine/desktop_capture_impl.cc
 | 
					
						
							|  |  |  | +++ b/dom/media/systemservices/video_engine/desktop_capture_impl.cc
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -123,10 +123,11 @@ int32_t ScreenDeviceInfoImpl::GetOrientation(const char* deviceUniqueIdUTF8,
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |    return 0; | 
					
						
							|  |  |  |  } | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  | -VideoCaptureModule* DesktopCaptureImpl::Create(const int32_t id,
 | 
					
						
							|  |  |  | +VideoCaptureModuleEx* DesktopCaptureImpl::Create(const int32_t id,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |                                                 const char* uniqueId, | 
					
						
							|  |  |  | -                                               const CaptureDeviceType type) {
 | 
					
						
							|  |  |  | -  return new rtc::RefCountedObject<DesktopCaptureImpl>(id, uniqueId, type);
 | 
					
						
							|  |  |  | +                                               const CaptureDeviceType type,
 | 
					
						
							|  |  |  | +                                               bool captureCursor) {
 | 
					
						
							|  |  |  | +  return new rtc::RefCountedObject<DesktopCaptureImpl>(id, uniqueId, type, captureCursor);
 | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  int32_t WindowDeviceInfoImpl::Init() { | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -358,9 +359,13 @@ int32_t DesktopCaptureImpl::Init() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      DesktopCapturer::SourceId sourceId = atoi(_deviceUniqueId.c_str()); | 
					
						
							|  |  |  |      pWindowCapturer->SelectSource(sourceId); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -    desktop_capturer_cursor_composer_ =
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  | -        std::unique_ptr<DesktopAndCursorComposer>(
 | 
					
						
							|  |  |  | -            new DesktopAndCursorComposer(std::move(pWindowCapturer), options));
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    if (capture_cursor_) {
 | 
					
						
							|  |  |  | +      desktop_capturer_cursor_composer_ =
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  | +          std::unique_ptr<DesktopAndCursorComposer>(
 | 
					
						
							|  |  |  | +              new DesktopAndCursorComposer(std::move(pWindowCapturer), options));
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    } else {
 | 
					
						
							|  |  |  | +      desktop_capturer_cursor_composer_ = std::move(pWindowCapturer);
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  |    } else if (_deviceType == CaptureDeviceType::Browser) { | 
					
						
							|  |  |  |      // XXX We don't capture cursors, so avoid the extra indirection layer. We | 
					
						
							|  |  |  |      // could also pass null for the pMouseCursorMonitor. | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -377,13 +382,15 @@ int32_t DesktopCaptureImpl::Init() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  DesktopCaptureImpl::DesktopCaptureImpl(const int32_t id, const char* uniqueId, | 
					
						
							|  |  |  | -                                       const CaptureDeviceType type)
 | 
					
						
							|  |  |  | +                                       const CaptureDeviceType type,
 | 
					
						
							|  |  |  | +                                       bool captureCursor)
 | 
					
						
							|  |  |  |      : _id(id), | 
					
						
							|  |  |  |        _deviceUniqueId(uniqueId), | 
					
						
							|  |  |  |        _deviceType(type), | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |        _requestedCapability(), | 
					
						
							|  |  |  |        _rotateFrame(kVideoRotation_0), | 
					
						
							|  |  |  |        last_capture_time_ms_(rtc::TimeMillis()), | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +      capture_cursor_(captureCursor),
 | 
					
						
							|  |  |  |        time_event_(EventWrapper::Create()), | 
					
						
							|  |  |  |  #if defined(_WIN32) | 
					
						
							|  |  |  |        capturer_thread_( | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -428,6 +435,19 @@ void DesktopCaptureImpl::DeRegisterCaptureDataCallback(
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void DesktopCaptureImpl::RegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) {
 | 
					
						
							|  |  |  | +  rtc::CritScope lock(&_apiCs);
 | 
					
						
							|  |  |  | +  _rawFrameCallbacks.insert(rawFrameCallback);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +void DesktopCaptureImpl::DeRegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) {
 | 
					
						
							|  |  |  | +  rtc::CritScope lock(&_apiCs);
 | 
					
						
							|  |  |  | +  auto it = _rawFrameCallbacks.find(rawFrameCallback);
 | 
					
						
							|  |  |  | +  if (it != _rawFrameCallbacks.end()) {
 | 
					
						
							|  |  |  | +    _rawFrameCallbacks.erase(it);
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  int32_t DesktopCaptureImpl::StopCaptureIfAllClientsClose() { | 
					
						
							|  |  |  |    if (_dataCallBacks.empty()) { | 
					
						
							|  |  |  |      return StopCapture(); | 
					
						
							| 
									
										
										
										
											2022-08-05 09:52:30 +08:00
										 |  |  | @@ -636,6 +656,15 @@ void DesktopCaptureImpl::OnCaptureResult(DesktopCapturer::Result result,
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |    frameInfo.height = frame->size().height(); | 
					
						
							|  |  |  |    frameInfo.videoType = VideoType::kARGB; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  size_t videoFrameStride =
 | 
					
						
							|  |  |  | +      frameInfo.width * DesktopFrame::kBytesPerPixel;
 | 
					
						
							| 
									
										
										
										
											2022-08-05 09:52:30 +08:00
										 |  |  | +  {
 | 
					
						
							|  |  |  | +    rtc::CritScope cs(&_apiCs);
 | 
					
						
							|  |  |  | +    for (auto rawFrameCallback : _rawFrameCallbacks) {
 | 
					
						
							|  |  |  | +      rawFrameCallback->OnRawFrame(videoFrame, videoFrameStride, frameInfo);
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    size_t videoFrameLength = | 
					
						
							|  |  |  |        frameInfo.width * frameInfo.height * DesktopFrame::kBytesPerPixel; | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |    IncomingFrame(videoFrame, videoFrameLength, | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/dom/media/systemservices/video_engine/desktop_capture_impl.h b/dom/media/systemservices/video_engine/desktop_capture_impl.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index b725849dab1d1f898ab988e57a35c27e3eb44700..e2e13b0a0926475fe673fecf5e3c497569d158b3 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/media/systemservices/video_engine/desktop_capture_impl.h
 | 
					
						
							|  |  |  | +++ b/dom/media/systemservices/video_engine/desktop_capture_impl.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -46,6 +46,21 @@ namespace webrtc {
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  class VideoCaptureEncodeInterface; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +class RawFrameCallback {
 | 
					
						
							|  |  |  | + public:
 | 
					
						
							|  |  |  | +  virtual ~RawFrameCallback() {}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  virtual void OnRawFrame(uint8_t* videoFrame, size_t videoFrameLength, const VideoCaptureCapability& frameInfo) = 0;
 | 
					
						
							|  |  |  | +};
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +class VideoCaptureModuleEx : public VideoCaptureModule {
 | 
					
						
							|  |  |  | + public:
 | 
					
						
							|  |  |  | +  virtual ~VideoCaptureModuleEx() {}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  virtual void RegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) = 0;
 | 
					
						
							|  |  |  | +  virtual void DeRegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) = 0;
 | 
					
						
							|  |  |  | +};
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  // simulate deviceInfo interface for video engine, bridge screen/application and | 
					
						
							|  |  |  |  // real screen/application device info | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -158,12 +173,13 @@ class BrowserDeviceInfoImpl : public VideoCaptureModule::DeviceInfo {
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |  // As with video, DesktopCaptureImpl is a proxy for screen sharing | 
					
						
							|  |  |  |  // and follows the video pipeline design | 
					
						
							|  |  |  |  class DesktopCaptureImpl : public DesktopCapturer::Callback, | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  | -                           public VideoCaptureModule {
 | 
					
						
							|  |  |  | +                           public VideoCaptureModuleEx {
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |   public: | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    /* Create a screen capture modules object | 
					
						
							|  |  |  |     */ | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  | -  static VideoCaptureModule* Create(const int32_t id, const char* uniqueId,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | -                                    const CaptureDeviceType type);
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  | +  static VideoCaptureModuleEx* Create(const int32_t id, const char* uniqueId,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +                                    const CaptureDeviceType type,
 | 
					
						
							|  |  |  | +                                    bool captureCursor = true);
 | 
					
						
							|  |  |  |    static VideoCaptureModule::DeviceInfo* CreateDeviceInfo( | 
					
						
							|  |  |  |        const int32_t id, const CaptureDeviceType type); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -173,6 +189,8 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
 | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |    void DeRegisterCaptureDataCallback( | 
					
						
							|  |  |  |        rtc::VideoSinkInterface<VideoFrame>* dataCallback) override; | 
					
						
							|  |  |  |    int32_t StopCaptureIfAllClientsClose() override; | 
					
						
							|  |  |  | +  void RegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) override;
 | 
					
						
							|  |  |  | +  void DeRegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) override;
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    int32_t SetCaptureRotation(VideoRotation rotation) override; | 
					
						
							|  |  |  |    bool SetApplyRotation(bool enable) override; | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -193,7 +211,7 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |   protected: | 
					
						
							|  |  |  |    DesktopCaptureImpl(const int32_t id, const char* uniqueId, | 
					
						
							|  |  |  | -                     const CaptureDeviceType type);
 | 
					
						
							|  |  |  | +                     const CaptureDeviceType type, bool captureCursor);
 | 
					
						
							|  |  |  |    virtual ~DesktopCaptureImpl(); | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |    int32_t DeliverCapturedFrame(webrtc::VideoFrame& captureFrame); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -215,6 +233,7 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |    rtc::RecursiveCriticalSection _apiCs; | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    std::set<rtc::VideoSinkInterface<VideoFrame>*> _dataCallBacks; | 
					
						
							|  |  |  | +  std::set<RawFrameCallback*> _rawFrameCallbacks;
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    int64_t _incomingFrameTimesNanos | 
					
						
							|  |  |  |        [kFrameRateCountHistorySize];  // timestamp for local captured frames | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -237,6 +256,7 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
 | 
					
						
							|  |  |  |    void ProcessIter(); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  | +  bool capture_cursor_ = true;
 | 
					
						
							|  |  |  |    // This is created on the main thread and accessed on both the main thread | 
					
						
							|  |  |  |    // and the capturer thread. It is created prior to the capturer thread | 
					
						
							|  |  |  |    // starting and is destroyed after it is stopped. | 
					
						
							|  |  |  | diff --git a/dom/script/ScriptSettings.cpp b/dom/script/ScriptSettings.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index 8c8a5810fd56512cf37635da1f43757719f06113..d2bc58fcd3b05f989f948839d574d00d0409873c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/script/ScriptSettings.cpp
 | 
					
						
							|  |  |  | +++ b/dom/script/ScriptSettings.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -150,6 +150,30 @@ ScriptSettingsStackEntry::~ScriptSettingsStackEntry() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    MOZ_ASSERT_IF(mGlobalObject, mGlobalObject->HasJSGlobal()); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +static nsIGlobalObject* UnwrapSandboxGlobal(nsIGlobalObject* global) {
 | 
					
						
							|  |  |  | +  if (!global)
 | 
					
						
							|  |  |  | +    return global;
 | 
					
						
							|  |  |  | +  JSObject* globalObject = global->GetGlobalJSObject();
 | 
					
						
							|  |  |  | +  if (!globalObject)
 | 
					
						
							|  |  |  | +    return global;
 | 
					
						
							|  |  |  | +  JSContext* cx = nsContentUtils::GetCurrentJSContext();
 | 
					
						
							|  |  |  | +  if (!cx)
 | 
					
						
							|  |  |  | +    return global;
 | 
					
						
							|  |  |  | +  JS::Rooted<JSObject*> proto(cx);
 | 
					
						
							|  |  |  | +  JS::RootedObject rootedGlobal(cx, globalObject);
 | 
					
						
							|  |  |  | +  if (!JS_GetPrototype(cx, rootedGlobal, &proto))
 | 
					
						
							|  |  |  | +    return global;
 | 
					
						
							|  |  |  | +  if (!proto || !xpc::IsSandboxPrototypeProxy(proto))
 | 
					
						
							|  |  |  | +    return global;
 | 
					
						
							|  |  |  | +  // If this is a sandbox associated with a DOMWindow via a
 | 
					
						
							|  |  |  | +  // sandboxPrototype, use that DOMWindow. This supports GreaseMonkey
 | 
					
						
							|  |  |  | +  // and JetPack content scripts.
 | 
					
						
							|  |  |  | +  proto = js::CheckedUnwrapDynamic(proto, cx, /* stopAtWindowProxy = */ false);
 | 
					
						
							|  |  |  | +  if (!proto)
 | 
					
						
							|  |  |  | +    return global;
 | 
					
						
							|  |  |  | +  return xpc::WindowGlobalOrNull(proto);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  // If the entry or incumbent global ends up being something that the subject | 
					
						
							|  |  |  |  // principal doesn't subsume, we don't want to use it. This never happens on | 
					
						
							|  |  |  |  // the web, but can happen with asymmetric privilege relationships (i.e. | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -177,7 +201,7 @@ static nsIGlobalObject* ClampToSubject(nsIGlobalObject* aGlobalOrNull) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    NS_ENSURE_TRUE(globalPrin, GetCurrentGlobal()); | 
					
						
							|  |  |  |    if (!nsContentUtils::SubjectPrincipalOrSystemIfNativeCaller() | 
					
						
							|  |  |  |             ->SubsumesConsideringDomain(globalPrin)) { | 
					
						
							|  |  |  | -    return GetCurrentGlobal();
 | 
					
						
							|  |  |  | +    return UnwrapSandboxGlobal(GetCurrentGlobal());
 | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    return aGlobalOrNull; | 
					
						
							|  |  |  | diff --git a/dom/security/nsCSPUtils.cpp b/dom/security/nsCSPUtils.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index b31ca1000cb1d7b8ca1af74b9ac0313aba053875..54abd38a35fc2b4906760c370d9f96d7f2ade0e2 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/security/nsCSPUtils.cpp
 | 
					
						
							|  |  |  | +++ b/dom/security/nsCSPUtils.cpp
 | 
					
						
							|  |  |  | @@ -127,6 +127,11 @@ void CSP_ApplyMetaCSPToDoc(mozilla::dom::Document& aDoc,
 | 
					
						
							|  |  |  |      return; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  if (aDoc.GetDocShell() &&
 | 
					
						
							|  |  |  | +      nsDocShell::Cast(aDoc.GetDocShell())->IsBypassCSPEnabled()) {
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    nsAutoString policyStr( | 
					
						
							|  |  |  |        nsContentUtils::TrimWhitespace<nsContentUtils::IsHTMLWhitespace>( | 
					
						
							|  |  |  |            aPolicyStr)); | 
					
						
							|  |  |  | diff --git a/dom/webidl/GeometryUtils.webidl b/dom/webidl/GeometryUtils.webidl
 | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | index 2f71b284ee5f7e11f117c447834b48355784448c..ddcc545da1efec5784273b032efa00ad8b89fec0 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/webidl/GeometryUtils.webidl
 | 
					
						
							|  |  |  | +++ b/dom/webidl/GeometryUtils.webidl
 | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | @@ -16,6 +16,8 @@ dictionary BoxQuadOptions {
 | 
					
						
							|  |  |  |    GeometryNode relativeTo; | 
					
						
							|  |  |  |    [ChromeOnly] | 
					
						
							|  |  |  |    boolean createFramesForSuppressedWhitespace = true; | 
					
						
							|  |  |  | +  [ChromeOnly]
 | 
					
						
							|  |  |  | +  boolean recurseWhenNoFrame = false;
 | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  dictionary ConvertCoordinateOptions { | 
					
						
							|  |  |  | @@ -27,6 +29,9 @@ interface mixin GeometryUtils {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    [Throws, Func="nsINode::HasBoxQuadsSupport", NeedsCallerType] | 
					
						
							|  |  |  |    sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options = {}); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  [ChromeOnly, Throws, Func="nsINode::HasBoxQuadsSupport"]
 | 
					
						
							|  |  |  | +  void scrollRectIntoViewIfNeeded(long x, long y, long w, long h);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    /* getBoxQuadsFromWindowOrigin is similar to getBoxQuads, but the | 
					
						
							|  |  |  |     * returned quads are further translated relative to the window | 
					
						
							|  |  |  |     * origin -- which is not the layout origin. Further translation | 
					
						
							|  |  |  | diff --git a/dom/workers/RuntimeService.cpp b/dom/workers/RuntimeService.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 88e55560a914f1661b5302a924de519157c25dd9..b86513356488b48cb788acefaaa9905c38c2b05c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/workers/RuntimeService.cpp
 | 
					
						
							|  |  |  | +++ b/dom/workers/RuntimeService.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -977,7 +977,7 @@ void PrefLanguagesChanged(const char* /* aPrefName */, void* /* aClosure */) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    AssertIsOnMainThread(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    nsTArray<nsString> languages; | 
					
						
							|  |  |  | -  Navigator::GetAcceptLanguages(languages);
 | 
					
						
							|  |  |  | +  Navigator::GetAcceptLanguages(nullptr, languages);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    RuntimeService* runtime = RuntimeService::GetService(); | 
					
						
							|  |  |  |    if (runtime) { | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1179,8 +1179,7 @@ bool RuntimeService::RegisterWorker(WorkerPrivate& aWorkerPrivate) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |        // The navigator overridden properties should have already been read. | 
					
						
							|  |  |  | -
 | 
					
						
							|  |  |  | -      Navigator::GetAcceptLanguages(mNavigatorProperties.mLanguages);
 | 
					
						
							|  |  |  | +      Navigator::GetAcceptLanguages(nullptr, mNavigatorProperties.mLanguages);
 | 
					
						
							|  |  |  |        mNavigatorPropertiesLoaded = true; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1778,6 +1777,13 @@ void RuntimeService::PropagateStorageAccessPermissionGranted(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void RuntimeService::ResetDefaultLocaleInAllWorkers() {
 | 
					
						
							|  |  |  | +  AssertIsOnMainThread();
 | 
					
						
							|  |  |  | +  BroadcastAllWorkers([](auto& worker) {
 | 
					
						
							|  |  |  | +    worker.ResetDefaultLocale();
 | 
					
						
							|  |  |  | +  });
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  |  template <typename Func> | 
					
						
							|  |  |  |  void RuntimeService::BroadcastAllWorkers(const Func& aFunc) { | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    AssertIsOnMainThread(); | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2193,6 +2199,14 @@ void PropagateStorageAccessPermissionGrantedToWorkers(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void ResetDefaultLocaleInAllWorkers() {
 | 
					
						
							|  |  |  | +  AssertIsOnMainThread();
 | 
					
						
							|  |  |  | +  RuntimeService* runtime = RuntimeService::GetService();
 | 
					
						
							|  |  |  | +  if (runtime) {
 | 
					
						
							|  |  |  | +    runtime->ResetDefaultLocaleInAllWorkers();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  WorkerPrivate* GetWorkerPrivateFromContext(JSContext* aCx) { | 
					
						
							|  |  |  |    MOZ_ASSERT(!NS_IsMainThread()); | 
					
						
							|  |  |  |    MOZ_ASSERT(aCx); | 
					
						
							|  |  |  | diff --git a/dom/workers/RuntimeService.h b/dom/workers/RuntimeService.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index ef32cc847e8b86319830bb93879aaf809fe464d4..5db3be0dc87e50ff75177194ca734313b22509d6 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/workers/RuntimeService.h
 | 
					
						
							|  |  |  | +++ b/dom/workers/RuntimeService.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -110,6 +110,8 @@ class RuntimeService final : public nsIObserver {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    void PropagateStorageAccessPermissionGranted( | 
					
						
							|  |  |  |        const nsPIDOMWindowInner& aWindow); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  void ResetDefaultLocaleInAllWorkers();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    const NavigatorProperties& GetNavigatorProperties() const { | 
					
						
							|  |  |  |      return mNavigatorProperties; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | diff --git a/dom/workers/WorkerCommon.h b/dom/workers/WorkerCommon.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index d10dabb5c5ff8e17851edf2bd2efc08e74584d8e..53c4070c5fde43b27fb8fbfdcf4c23d8af57fba3 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/workers/WorkerCommon.h
 | 
					
						
							|  |  |  | +++ b/dom/workers/WorkerCommon.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -44,6 +44,8 @@ void ResumeWorkersForWindow(const nsPIDOMWindowInner& aWindow);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  void PropagateStorageAccessPermissionGrantedToWorkers( | 
					
						
							|  |  |  |      const nsPIDOMWindowInner& aWindow); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void ResetDefaultLocaleInAllWorkers();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  // All of these are implemented in WorkerScope.cpp | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  bool IsWorkerGlobal(JSObject* global); | 
					
						
							|  |  |  | diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 96357690e6f056501bef4729291c0c280d43b8e3..6fbcad9a972d61ab1d2de295219c361288ffb381 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/workers/WorkerPrivate.cpp
 | 
					
						
							|  |  |  | +++ b/dom/workers/WorkerPrivate.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -699,6 +699,18 @@ class UpdateContextOptionsRunnable final : public WorkerControlRunnable {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +class ResetDefaultLocaleRunnable final : public WorkerControlRunnable {
 | 
					
						
							|  |  |  | + public:
 | 
					
						
							|  |  |  | +  explicit ResetDefaultLocaleRunnable(WorkerPrivate* aWorkerPrivate)
 | 
					
						
							|  |  |  | +      : WorkerControlRunnable(aWorkerPrivate, WorkerThreadUnchangedBusyCount) {}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  virtual bool WorkerRun(JSContext* aCx,
 | 
					
						
							|  |  |  | +                         WorkerPrivate* aWorkerPrivate) override {
 | 
					
						
							|  |  |  | +    aWorkerPrivate->ResetDefaultLocaleInternal(aCx);
 | 
					
						
							|  |  |  | +    return true;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +};
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  class UpdateLanguagesRunnable final : public WorkerRunnable { | 
					
						
							|  |  |  |    nsTArray<nsString> mLanguages; | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1951,6 +1963,16 @@ void WorkerPrivate::UpdateContextOptions(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void WorkerPrivate::ResetDefaultLocale() {
 | 
					
						
							|  |  |  | +  AssertIsOnParentThread();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  RefPtr<ResetDefaultLocaleRunnable> runnable =
 | 
					
						
							|  |  |  | +      new ResetDefaultLocaleRunnable(this);
 | 
					
						
							|  |  |  | +  if (!runnable->Dispatch()) {
 | 
					
						
							|  |  |  | +    NS_WARNING("Failed to reset default locale in worker!");
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  void WorkerPrivate::UpdateLanguages(const nsTArray<nsString>& aLanguages) { | 
					
						
							|  |  |  |    AssertIsOnParentThread(); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -5123,6 +5145,15 @@ void WorkerPrivate::UpdateContextOptionsInternal(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void WorkerPrivate::ResetDefaultLocaleInternal(JSContext* aCx) {
 | 
					
						
							|  |  |  | +  JS_ResetDefaultLocale(JS_GetRuntime(aCx));
 | 
					
						
							|  |  |  | +  auto data = mWorkerThreadAccessible.Access();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  for (uint32_t index = 0; index < data->mChildWorkers.Length(); index++) {
 | 
					
						
							|  |  |  | +    data->mChildWorkers[index]->ResetDefaultLocale();
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  void WorkerPrivate::UpdateLanguagesInternal( | 
					
						
							|  |  |  |      const nsTArray<nsString>& aLanguages) { | 
					
						
							|  |  |  |    WorkerGlobalScope* globalScope = GlobalScope(); | 
					
						
							|  |  |  | diff --git a/dom/workers/WorkerPrivate.h b/dom/workers/WorkerPrivate.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 1f31c4a6a94491cb6c981655e30e1fd42c4dbfc1..dbfdf4fc27f112e7cadbb768a858323f8ee919d1 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/dom/workers/WorkerPrivate.h
 | 
					
						
							|  |  |  | +++ b/dom/workers/WorkerPrivate.h
 | 
					
						
							| 
									
										
										
										
											2022-04-21 00:27:57 +08:00
										 |  |  | @@ -330,6 +330,8 @@ class WorkerPrivate final
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    void UpdateContextOptionsInternal(JSContext* aCx, | 
					
						
							|  |  |  |                                      const JS::ContextOptions& aContextOptions); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  void ResetDefaultLocaleInternal(JSContext* aCx);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    void UpdateLanguagesInternal(const nsTArray<nsString>& aLanguages); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    void UpdateJSWorkerMemoryParameterInternal(JSContext* aCx, JSGCParamKey key, | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -966,6 +968,8 @@ class WorkerPrivate final
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    void UpdateContextOptions(const JS::ContextOptions& aContextOptions); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  void ResetDefaultLocale();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    void UpdateLanguages(const nsTArray<nsString>& aLanguages); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    void UpdateJSWorkerMemoryParameter(JSGCParamKey key, Maybe<uint32_t> value); | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | diff --git a/intl/components/src/TimeZone.cpp b/intl/components/src/TimeZone.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index 145dd3f07112c2390325de50f8eae674484adfe6..8cb3787e1b6bb25c6a58f1d910ae7dbc440d9ace 100644
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | --- a/intl/components/src/TimeZone.cpp
 | 
					
						
							|  |  |  | +++ b/intl/components/src/TimeZone.cpp
 | 
					
						
							|  |  |  | @@ -16,6 +16,7 @@
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  namespace mozilla::intl { | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  /* static */ | 
					
						
							|  |  |  |  Result<UniquePtr<TimeZone>, ICUError> TimeZone::TryCreate( | 
					
						
							|  |  |  |      Maybe<Span<const char16_t>> aTimeZoneOverride) { | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -239,6 +240,13 @@ static ICUResult SetDefaultTimeZone(TimeZoneIdentifierVector& timeZone) {
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +bool TimeZone::IsValidTimeZoneId(const char* timeZoneId) {
 | 
					
						
							|  |  |  | +  // Validate timezone id.
 | 
					
						
							|  |  |  | +  mozilla::UniquePtr<icu::TimeZone> timeZone(icu::TimeZone::createTimeZone(
 | 
					
						
							|  |  |  | +      icu::UnicodeString(timeZoneId, -1, US_INV)));
 | 
					
						
							|  |  |  | +  return timeZone && *timeZone != icu::TimeZone::getUnknown();
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  Result<bool, ICUError> TimeZone::SetDefaultTimeZone( | 
					
						
							|  |  |  |      Span<const char> aTimeZone) { | 
					
						
							|  |  |  |  #if MOZ_INTL_USE_ICU_CPP_TIMEZONE | 
					
						
							|  |  |  | diff --git a/intl/components/src/TimeZone.h b/intl/components/src/TimeZone.h
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  | index 180092bd3fc0b70462cc6ba67e72946e4c4c7604..bcaecb9fcd7b630c75289581a887cc6894733168 100644
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | --- a/intl/components/src/TimeZone.h
 | 
					
						
							|  |  |  | +++ b/intl/components/src/TimeZone.h
 | 
					
						
							|  |  |  | @@ -154,6 +154,8 @@ class TimeZone final {
 | 
					
						
							|  |  |  |      return FillBufferWithICUCall(aBuffer, ucal_getHostTimeZone); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  static bool IsValidTimeZoneId(const char* timeZoneId);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    /** | 
					
						
							|  |  |  |     * Set the default time zone. | 
					
						
							|  |  |  |     */ | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/js/public/Date.h b/js/public/Date.h
 | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  | index bb69d58dc96ed7f0b37f73e26abdd0bdfeaaf556..8436d439f72287176a2fe6a1a837d3db73409e67 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/js/public/Date.h
 | 
					
						
							|  |  |  | +++ b/js/public/Date.h
 | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  | @@ -53,6 +53,8 @@ namespace JS {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   */ | 
					
						
							|  |  |  |  extern JS_PUBLIC_API void ResetTimeZone(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +extern JS_PUBLIC_API bool SetTimeZoneOverride(const char* timezoneId);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  class ClippedTime; | 
					
						
							|  |  |  |  inline ClippedTime TimeClip(double time); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/js/src/debugger/Object.cpp b/js/src/debugger/Object.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 1c00fed8e0dc84b12c9b1c169d841e27402579a1..ad25cb5f8a0572c9c8622f85551b79dd2ffea819 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/js/src/debugger/Object.cpp
 | 
					
						
							|  |  |  | +++ b/js/src/debugger/Object.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -2373,7 +2373,11 @@ Maybe<Completion> DebuggerObject::call(JSContext* cx,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |          invokeArgs[i].set(args2[i]); | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +      // Disable CSP for the scope of the call.
 | 
					
						
							|  |  |  | +      const JSSecurityCallbacks* securityCallbacks = JS_GetSecurityCallbacks(cx);
 | 
					
						
							|  |  |  | +      JS_SetSecurityCallbacks(cx, nullptr);
 | 
					
						
							|  |  |  |        ok = js::Call(cx, calleev, thisv, invokeArgs, &result); | 
					
						
							|  |  |  | +      JS_SetSecurityCallbacks(cx, securityCallbacks);
 | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/js/src/vm/DateTime.cpp b/js/src/vm/DateTime.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index a86a6e9f7177c86624f118ebbc2e012766137bd1..5ebd1f106a556471fda5961d1f11f8eac31718cc 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/js/src/vm/DateTime.cpp
 | 
					
						
							|  |  |  | +++ b/js/src/vm/DateTime.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -178,6 +178,11 @@ void js::DateTimeInfo::internalResetTimeZone(ResetTimeZoneMode mode) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +void js::DateTimeInfo::internalSetTimeZoneOverride(std::string timeZone) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  timeZoneOverride_ = std::move(timeZone);
 | 
					
						
							|  |  |  | +  internalResetTimeZone(ResetTimeZoneMode::ResetEvenIfOffsetUnchanged);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  void js::DateTimeInfo::updateTimeZone() { | 
					
						
							|  |  |  |    MOZ_ASSERT(timeZoneStatus_ != TimeZoneStatus::Valid); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -502,10 +507,24 @@ void js::ResetTimeZoneInternal(ResetTimeZoneMode mode) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    js::DateTimeInfo::resetTimeZone(mode); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +void js::SetTimeZoneOverrideInternal(std::string timeZone) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  auto guard = js::DateTimeInfo::instance->lock();
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +  guard->internalSetTimeZoneOverride(timeZone);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  JS_PUBLIC_API void JS::ResetTimeZone() { | 
					
						
							|  |  |  |    js::ResetTimeZoneInternal(js::ResetTimeZoneMode::ResetEvenIfOffsetUnchanged); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +JS_PUBLIC_API bool JS::SetTimeZoneOverride(const char* timeZoneId) {
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +  if (!mozilla::intl::TimeZone::IsValidTimeZoneId(timeZoneId)) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    fprintf(stderr, "Invalid timezone id: %s\n", timeZoneId);
 | 
					
						
							|  |  |  | +    return false;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +  js::SetTimeZoneOverrideInternal(std::string(timeZoneId));
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  return true;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-10-15 03:08:38 +08:00
										 |  |  |  #if JS_HAS_INTL_API | 
					
						
							|  |  |  |  #  if defined(XP_WIN) | 
					
						
							|  |  |  |  static bool IsOlsonCompatibleWindowsTimeZoneId(std::string_view tz) { | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -727,9 +746,17 @@ void js::ResyncICUDefaultTimeZone() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  void js::DateTimeInfo::internalResyncICUDefaultTimeZone() { | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  |  #if JS_HAS_INTL_API | 
					
						
							|  |  |  | +  if (!timeZoneOverride_.empty()) {
 | 
					
						
							| 
									
										
										
										
											2021-10-28 00:34:16 +08:00
										 |  |  | +    mozilla::Span<const char> tzid = mozilla::Span(timeZoneOverride_.data(), timeZoneOverride_.length());
 | 
					
						
							| 
									
										
										
										
											2021-12-16 00:31:33 +08:00
										 |  |  | +    auto result = mozilla::intl::TimeZone::SetDefaultTimeZone(tzid);
 | 
					
						
							|  |  |  | +    if (result.isErr()) {
 | 
					
						
							|  |  |  | +      fprintf(stderr, "ERROR: failed to setup default time zone\n");
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							| 
									
										
										
										
											2021-10-28 00:34:16 +08:00
										 |  |  | +    return;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-10-28 00:34:16 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |    if (const char* tzenv = std::getenv("TZ")) { | 
					
						
							|  |  |  |      std::string_view tz(tzenv); | 
					
						
							|  |  |  | -
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  |      mozilla::Span<const char> tzid; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #  if defined(XP_WIN) | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/js/src/vm/DateTime.h b/js/src/vm/DateTime.h
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | index 3ce936fe3a4a83f9161eddc9e5289322d6a363e3..6b1c34244d8b2f2102ec423e2d96812fb5d41a9d 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/js/src/vm/DateTime.h
 | 
					
						
							|  |  |  | +++ b/js/src/vm/DateTime.h
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | @@ -63,6 +63,8 @@ enum class ResetTimeZoneMode : bool {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   */ | 
					
						
							|  |  |  |  extern void ResetTimeZoneInternal(ResetTimeZoneMode mode); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +extern void SetTimeZoneOverrideInternal(std::string timeZone);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |  /** | 
					
						
							|  |  |  |   * ICU's default time zone, used for various date/time formatting operations | 
					
						
							|  |  |  |   * that include the local time in the representation, is allowed to go stale | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | @@ -202,6 +204,7 @@ class DateTimeInfo {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    // and js::ResyncICUDefaultTimeZone(). | 
					
						
							|  |  |  |    friend void js::ResetTimeZoneInternal(ResetTimeZoneMode); | 
					
						
							|  |  |  |    friend void js::ResyncICUDefaultTimeZone(); | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +  friend void js::SetTimeZoneOverrideInternal(std::string);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    static void resetTimeZone(ResetTimeZoneMode mode) { | 
					
						
							|  |  |  |      auto guard = instance->lock(); | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | @@ -293,6 +296,8 @@ class DateTimeInfo {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    JS::UniqueChars locale_; | 
					
						
							|  |  |  |    JS::UniqueTwoByteChars standardName_; | 
					
						
							|  |  |  |    JS::UniqueTwoByteChars daylightSavingsName_; | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +  std::string timeZoneOverride_;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #else | 
					
						
							|  |  |  |    // Restrict the data-time range to the minimum required time_t range as | 
					
						
							|  |  |  |    // specified in POSIX. Most operating systems support 64-bit time_t | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | @@ -308,6 +313,8 @@ class DateTimeInfo {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    void internalResetTimeZone(ResetTimeZoneMode mode); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | +  void internalSetTimeZoneOverride(std::string timeZone);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +
 | 
					
						
							|  |  |  |    void updateTimeZone(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    void internalResyncICUDefaultTimeZone(); | 
					
						
							| 
									
										
										
										
											2022-08-15 16:47:57 +08:00
										 |  |  | diff --git a/layout/base/GeometryUtils.cpp b/layout/base/GeometryUtils.cpp
 | 
					
						
							|  |  |  | index dac899f7558b26d6848da8b98ed8a93555c8751a..2a07d67fa1c2840b25085566e84dc3b2d9b789cf 100644
 | 
					
						
							|  |  |  | --- a/layout/base/GeometryUtils.cpp
 | 
					
						
							|  |  |  | +++ b/layout/base/GeometryUtils.cpp
 | 
					
						
							|  |  |  | @@ -23,6 +23,7 @@
 | 
					
						
							|  |  |  |  #include "nsContentUtils.h" | 
					
						
							|  |  |  |  #include "nsCSSFrameConstructor.h" | 
					
						
							|  |  |  |  #include "nsLayoutUtils.h" | 
					
						
							|  |  |  | +#include "ChildIterator.h"
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  using namespace mozilla; | 
					
						
							|  |  |  |  using namespace mozilla::dom; | 
					
						
							|  |  |  | @@ -261,11 +262,27 @@ static bool CheckFramesInSameTopLevelBrowsingContext(nsIFrame* aFrame1,
 | 
					
						
							|  |  |  |    return false; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +static nsIFrame* GetFrameForNode(nsINode* aNode,
 | 
					
						
							|  |  |  | +                                 bool aCreateFramesForSuppressedWhitespace,
 | 
					
						
							|  |  |  | +                                 bool aRecurseWhenNoFrame) {
 | 
					
						
							|  |  |  | +  nsIFrame* frame = GetFrameForNode(aNode, aCreateFramesForSuppressedWhitespace);
 | 
					
						
							|  |  |  | +  if (!frame && aRecurseWhenNoFrame && aNode->IsContent()) {
 | 
					
						
							|  |  |  | +    dom::FlattenedChildIterator iter(aNode->AsContent());
 | 
					
						
							|  |  |  | +    for (nsIContent* child = iter.GetNextChild(); child; child = iter.GetNextChild()) {
 | 
					
						
							|  |  |  | +      frame = GetFrameForNode(child, aCreateFramesForSuppressedWhitespace, aRecurseWhenNoFrame);
 | 
					
						
							|  |  |  | +      if (frame) {
 | 
					
						
							|  |  |  | +        break;
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  return frame;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  void GetBoxQuads(nsINode* aNode, const dom::BoxQuadOptions& aOptions, | 
					
						
							|  |  |  |                   nsTArray<RefPtr<DOMQuad> >& aResult, CallerType aCallerType, | 
					
						
							|  |  |  |                   ErrorResult& aRv) { | 
					
						
							|  |  |  |    nsIFrame* frame = | 
					
						
							|  |  |  | -      GetFrameForNode(aNode, aOptions.mCreateFramesForSuppressedWhitespace);
 | 
					
						
							|  |  |  | +      GetFrameForNode(aNode, aOptions.mCreateFramesForSuppressedWhitespace, aOptions.mRecurseWhenNoFrame);
 | 
					
						
							|  |  |  |    if (!frame) { | 
					
						
							|  |  |  |      // No boxes to return | 
					
						
							|  |  |  |      return; | 
					
						
							|  |  |  | @@ -280,7 +297,7 @@ void GetBoxQuads(nsINode* aNode, const dom::BoxQuadOptions& aOptions,
 | 
					
						
							|  |  |  |    // when that happens and re-check it. | 
					
						
							|  |  |  |    if (!weakFrame.IsAlive()) { | 
					
						
							|  |  |  |      frame = | 
					
						
							|  |  |  | -        GetFrameForNode(aNode, aOptions.mCreateFramesForSuppressedWhitespace);
 | 
					
						
							|  |  |  | +        GetFrameForNode(aNode, aOptions.mCreateFramesForSuppressedWhitespace, aOptions.mRecurseWhenNoFrame);
 | 
					
						
							|  |  |  |      if (!frame) { | 
					
						
							|  |  |  |        // No boxes to return | 
					
						
							|  |  |  |        return; | 
					
						
							| 
									
										
										
										
											2022-06-03 00:04:04 +08:00
										 |  |  | diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 014b655e374af3bf6f346febb76df4f7484e2e8d..cf62af15fd34fbcbb3d2bc3b00065eb5aee21d62 100644
 | 
					
						
							| 
									
										
										
										
											2022-06-03 00:04:04 +08:00
										 |  |  | --- a/layout/base/PresShell.cpp
 | 
					
						
							|  |  |  | +++ b/layout/base/PresShell.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -10885,7 +10885,9 @@ auto PresShell::ComputeActiveness() const -> Activeness {
 | 
					
						
							| 
									
										
										
										
											2022-06-03 00:04:04 +08:00
										 |  |  |      if (!browserChild->IsVisible()) { | 
					
						
							|  |  |  |        MOZ_LOG(gLog, LogLevel::Debug, | 
					
						
							|  |  |  |                (" > BrowserChild %p is not visible", browserChild)); | 
					
						
							|  |  |  | -      return {false, inActiveTab};
 | 
					
						
							|  |  |  | +      bool isActive;
 | 
					
						
							|  |  |  | +      root->GetDocShell()->GetForceActiveState(&isActive);
 | 
					
						
							|  |  |  | +      return {isActive, inActiveTab};
 | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      // If the browser is visible but just due to be preserving layers | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | diff --git a/layout/style/GeckoBindings.h b/layout/style/GeckoBindings.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 3bc4cd498dc22b7d3db097beb9988c68baf26437..77557e174283e8c151ad540f92ede87f88197c80 100644
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | --- a/layout/style/GeckoBindings.h
 | 
					
						
							|  |  |  | +++ b/layout/style/GeckoBindings.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -575,6 +575,7 @@ void Gecko_MediaFeatures_GetDeviceSize(const mozilla::dom::Document*,
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  float Gecko_MediaFeatures_GetResolution(const mozilla::dom::Document*); | 
					
						
							|  |  |  |  bool Gecko_MediaFeatures_PrefersReducedMotion(const mozilla::dom::Document*); | 
					
						
							|  |  |  | +bool Gecko_MediaFeatures_ForcedColors(const mozilla::dom::Document*);
 | 
					
						
							|  |  |  |  mozilla::StylePrefersContrast Gecko_MediaFeatures_PrefersContrast( | 
					
						
							|  |  |  |      const mozilla::dom::Document*); | 
					
						
							|  |  |  |  mozilla::StylePrefersColorScheme Gecko_MediaFeatures_PrefersColorScheme( | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index 2ef43008df12886ad00485ef743564774850c2ba..bb53b96ae491146d895e1c32d62dc0f2ea00812f 100644
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  | --- a/layout/style/nsMediaFeatures.cpp
 | 
					
						
							|  |  |  | +++ b/layout/style/nsMediaFeatures.cpp
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  | @@ -260,10 +260,11 @@ bool Gecko_MediaFeatures_MatchesPlatform(StylePlatform aPlatform) {
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  bool Gecko_MediaFeatures_PrefersReducedMotion(const Document* aDocument) { | 
					
						
							|  |  |  | -  if (nsContentUtils::ShouldResistFingerprinting(aDocument)) {
 | 
					
						
							|  |  |  | -    return false;
 | 
					
						
							|  |  |  | -  }
 | 
					
						
							|  |  |  | -  return LookAndFeel::GetInt(LookAndFeel::IntID::PrefersReducedMotion, 0) == 1;
 | 
					
						
							|  |  |  | +  return aDocument->PrefersReducedMotion();
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +bool Gecko_MediaFeatures_ForcedColors(const Document* aDocument) {
 | 
					
						
							|  |  |  | +  return aDocument->ForcedColors();
 | 
					
						
							| 
									
										
										
										
											2021-05-19 03:23:12 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  StylePrefersColorScheme Gecko_MediaFeatures_PrefersColorScheme( | 
					
						
							| 
									
										
										
										
											2021-05-08 12:47:40 +08:00
										 |  |  | diff --git a/media/libjpeg/jconfig.h b/media/libjpeg/jconfig.h
 | 
					
						
							|  |  |  | index f2723e654098ff27542e1eb16a536c11ad0af617..b0b480551ff7d895dfdeb5a9800874858929c8ba 100644
 | 
					
						
							|  |  |  | --- a/media/libjpeg/jconfig.h
 | 
					
						
							|  |  |  | +++ b/media/libjpeg/jconfig.h
 | 
					
						
							|  |  |  | @@ -17,6 +17,7 @@
 | 
					
						
							|  |  |  |  /* #undef D_ARITH_CODING_SUPPORTED */ | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  /* Support in-memory source/destination managers */ | 
					
						
							|  |  |  | +#define MEM_SRCDST_SUPPORTED 1
 | 
					
						
							|  |  |  |  /* #undef MEM_SRCDST_SUPPORTED */ | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  /* Use accelerated SIMD routines. */ | 
					
						
							| 
									
										
										
										
											2021-09-01 18:27:37 +08:00
										 |  |  | diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 4e81c2325b0d4a73f6fe52f10a7a6ad593e806ce..541ac135bb854ecf951d4f4dab0aaed1fe8fc051 100644
 | 
					
						
							| 
									
										
										
										
											2021-09-01 18:27:37 +08:00
										 |  |  | --- a/modules/libpref/init/all.js
 | 
					
						
							|  |  |  | +++ b/modules/libpref/init/all.js
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -4359,7 +4359,9 @@ pref("devtools.experiment.f12.shortcut_disabled", false);
 | 
					
						
							| 
									
										
										
										
											2021-09-01 18:27:37 +08:00
										 |  |  |  // doesn't provide a way to lock the pref | 
					
						
							|  |  |  |  pref("dom.postMessage.sharedArrayBuffer.bypassCOOP_COEP.insecure.enabled", false); | 
					
						
							|  |  |  |  #else | 
					
						
							|  |  |  | -pref("dom.postMessage.sharedArrayBuffer.bypassCOOP_COEP.insecure.enabled", false, locked);
 | 
					
						
							|  |  |  | +// Playwright: DO NOT make preference locked so that we can overwrite it
 | 
					
						
							|  |  |  | +// later in our playwright.cfg file.
 | 
					
						
							|  |  |  | +pref("dom.postMessage.sharedArrayBuffer.bypassCOOP_COEP.insecure.enabled", false);
 | 
					
						
							|  |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  // Whether to start the private browsing mode at application startup | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/netwerk/base/nsINetworkInterceptController.idl b/netwerk/base/nsINetworkInterceptController.idl
 | 
					
						
							| 
									
										
										
										
											2021-09-08 22:54:44 +08:00
										 |  |  | index e869cd28d396aa87c522241d3e63d435ee8dbae6..2d307f089209721d88d231b03e8628890b8228ea 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/netwerk/base/nsINetworkInterceptController.idl
 | 
					
						
							|  |  |  | +++ b/netwerk/base/nsINetworkInterceptController.idl
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | @@ -59,6 +59,7 @@ interface nsIInterceptedChannel : nsISupports
 | 
					
						
							|  |  |  |       * results in the resulting client not being controlled. | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |       */ | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |      void resetInterception(in boolean bypass); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    void resetInterceptionWithURI(in nsIURI aURI);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      /** | 
					
						
							|  |  |  |       * Set the status and reason for the forthcoming synthesized response. | 
					
						
							|  |  |  | diff --git a/netwerk/protocol/http/InterceptedHttpChannel.cpp b/netwerk/protocol/http/InterceptedHttpChannel.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 56eabba18f021719aa084b5bb616d3602d782a97..1408518cdba2db29e994963c4e21aead2aa573c6 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/netwerk/protocol/http/InterceptedHttpChannel.cpp
 | 
					
						
							|  |  |  | +++ b/netwerk/protocol/http/InterceptedHttpChannel.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -662,6 +662,14 @@ void InterceptedHttpChannel::DoAsyncAbort(nsresult aStatus) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    Unused << AsyncAbort(aStatus); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +NS_IMETHODIMP
 | 
					
						
							|  |  |  | +InterceptedHttpChannel::ResetInterceptionWithURI(nsIURI* aURI) {
 | 
					
						
							|  |  |  | +  if (aURI) {
 | 
					
						
							|  |  |  | +    mURI = aURI;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | +  return ResetInterception(true);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  NS_IMETHODIMP | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |  InterceptedHttpChannel::ResetInterception(bool aBypass) { | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    if (mCanceled) { | 
					
						
							|  |  |  | diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | index d956b3b5c6ecf6a983689d09e491193519f34ceb..826aabb5b794a2d4028950066ca3036223a35e0c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/parser/html/nsHtml5TreeOpExecutor.cpp
 | 
					
						
							|  |  |  | +++ b/parser/html/nsHtml5TreeOpExecutor.cpp
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -1330,6 +1330,10 @@ void nsHtml5TreeOpExecutor::UpdateReferrerInfoFromMeta(
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  |  void nsHtml5TreeOpExecutor::AddSpeculationCSP(const nsAString& aCSP) { | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    NS_ASSERTION(NS_IsMainThread(), "Wrong thread!"); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  if (mDocShell && static_cast<nsDocShell*>(mDocShell.get())->IsBypassCSPEnabled()) {
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    nsresult rv = NS_OK; | 
					
						
							|  |  |  |    nsCOMPtr<nsIContentSecurityPolicy> preloadCsp = mDocument->GetPreloadCsp(); | 
					
						
							|  |  |  |    if (!preloadCsp) { | 
					
						
							|  |  |  | diff --git a/security/manager/ssl/nsCertOverrideService.cpp b/security/manager/ssl/nsCertOverrideService.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 153722c33b9db6475aa5134ad5b665051ac68658..74324d95f7088c65c3d52ab2a7c40e89901d9512 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/security/manager/ssl/nsCertOverrideService.cpp
 | 
					
						
							|  |  |  | +++ b/security/manager/ssl/nsCertOverrideService.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -572,7 +572,12 @@ nsCertOverrideService::HasMatchingOverride(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    bool disableAllSecurityCheck = false; | 
					
						
							|  |  |  |    { | 
					
						
							|  |  |  |      MutexAutoLock lock(mMutex); | 
					
						
							|  |  |  | -    disableAllSecurityCheck = mDisableAllSecurityCheck;
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | +    if (aOriginAttributes.mUserContextId) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +      disableAllSecurityCheck = mUserContextIdsWithDisabledSecurityChecks.has(
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | +          aOriginAttributes.mUserContextId);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    } else {
 | 
					
						
							|  |  |  | +      disableAllSecurityCheck = mDisableAllSecurityCheck;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    if (disableAllSecurityCheck) { | 
					
						
							|  |  |  |      nsCertOverride::OverrideBits all = nsCertOverride::OverrideBits::Untrusted | | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -789,14 +794,24 @@ static bool IsDebugger() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  NS_IMETHODIMP | 
					
						
							|  |  |  |  nsCertOverrideService:: | 
					
						
							|  |  |  | -    SetDisableAllSecurityChecksAndLetAttackersInterceptMyData(bool aDisable) {
 | 
					
						
							|  |  |  | -  if (!(PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR") || IsDebugger())) {
 | 
					
						
							|  |  |  | +    SetDisableAllSecurityChecksAndLetAttackersInterceptMyData(
 | 
					
						
							|  |  |  | +      bool aDisable, uint32_t aUserContextId) {
 | 
					
						
							|  |  |  | +  if (false /* juggler hacks */ && !(PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR") || IsDebugger())) {
 | 
					
						
							|  |  |  |      return NS_ERROR_NOT_AVAILABLE; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |    { | 
					
						
							|  |  |  |      MutexAutoLock lock(mMutex); | 
					
						
							|  |  |  | -    mDisableAllSecurityCheck = aDisable;
 | 
					
						
							|  |  |  | +    if (aUserContextId) {
 | 
					
						
							|  |  |  | +      if (aDisable) {
 | 
					
						
							|  |  |  | +        mozilla::Unused << mUserContextIdsWithDisabledSecurityChecks.put(aUserContextId);
 | 
					
						
							|  |  |  | +      } else {
 | 
					
						
							|  |  |  | +        mUserContextIdsWithDisabledSecurityChecks.remove(aUserContextId);
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +      return NS_OK;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    } else {
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  | +      mDisableAllSecurityCheck = aDisable;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +    }
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    nsCOMPtr<nsINSSComponent> nss(do_GetService(PSM_COMPONENT_CONTRACTID)); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/security/manager/ssl/nsCertOverrideService.h b/security/manager/ssl/nsCertOverrideService.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index e601df1b13d9b2c028bffe6348d052960c80951c..0d782585199479db6218f4c72ed7b6133e3122b3 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/security/manager/ssl/nsCertOverrideService.h
 | 
					
						
							|  |  |  | +++ b/security/manager/ssl/nsCertOverrideService.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -134,6 +134,7 @@ class nsCertOverrideService final : public nsICertOverrideService,
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    mozilla::Mutex mMutex; | 
					
						
							|  |  |  |    bool mDisableAllSecurityCheck GUARDED_BY(mMutex); | 
					
						
							|  |  |  | +  mozilla::HashSet<uint32_t> mUserContextIdsWithDisabledSecurityChecks GUARDED_BY(mMutex);
 | 
					
						
							|  |  |  |    nsCOMPtr<nsIFile> mSettingsFile GUARDED_BY(mMutex); | 
					
						
							|  |  |  |    nsTHashtable<nsCertOverrideEntry> mSettingsTable GUARDED_BY(mMutex); | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/security/manager/ssl/nsICertOverrideService.idl b/security/manager/ssl/nsICertOverrideService.idl
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  | index 3862fe6830874c036592fd217cab7ad5f4cd3e27..3166b37db0e52f7f2972d2bcb7a72ed819805794 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/security/manager/ssl/nsICertOverrideService.idl
 | 
					
						
							|  |  |  | +++ b/security/manager/ssl/nsICertOverrideService.idl
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  | @@ -201,7 +201,9 @@ interface nsICertOverrideService : nsISupports {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |     *  @param aDisable If true, disable all security check and make | 
					
						
							|  |  |  |     *                  hasMatchingOverride always return true. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  | -  void setDisableAllSecurityChecksAndLetAttackersInterceptMyData(in boolean aDisable);
 | 
					
						
							|  |  |  | +  void setDisableAllSecurityChecksAndLetAttackersInterceptMyData(
 | 
					
						
							|  |  |  | +      in boolean aDisable,
 | 
					
						
							|  |  |  | +      [optional] in uint32_t aUserContextId);
 | 
					
						
							| 
									
										
										
										
											2021-08-04 00:15:52 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    readonly attribute boolean securityCheckDisabled; | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  }; | 
					
						
							|  |  |  | diff --git a/services/settings/Utils.jsm b/services/settings/Utils.jsm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index a8b0c67ce19d801d2f032d1b59110871a9859787..9d8d689bc4c4fb6aa00ff6c551cbab0dcda7d85d 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/services/settings/Utils.jsm
 | 
					
						
							|  |  |  | +++ b/services/settings/Utils.jsm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -102,7 +102,7 @@ function _isUndefined(value) {
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  var Utils = { | 
					
						
							|  |  |  |    get SERVER_URL() { | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | -    return lazy.allowServerURLOverride
 | 
					
						
							|  |  |  | +    return true || lazy.allowServerURLOverride
 | 
					
						
							|  |  |  |        ? lazy.gServerURL | 
					
						
							|  |  |  |        : AppConstants.REMOTE_SETTINGS_SERVER_URL; | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  |    }, | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 8c93dfa24ce7810f004227fc0430338229a0bc3f..09a1f93dd027394345e910e00b765689490ac2a3 100644
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | --- a/servo/components/style/gecko/media_features.rs
 | 
					
						
							|  |  |  | +++ b/servo/components/style/gecko/media_features.rs
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | @@ -224,10 +224,15 @@ pub enum ForcedColors {
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  /// https://drafts.csswg.org/mediaqueries-5/#forced-colors | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  |  fn eval_forced_colors(context: &Context, query_value: Option<ForcedColors>) -> bool { | 
					
						
							|  |  |  | -    let forced = !context.device().use_document_colors();
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +    let prefers_forced_colors =
 | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | +        unsafe { bindings::Gecko_MediaFeatures_ForcedColors(context.device().document()) };
 | 
					
						
							| 
									
										
										
										
											2021-06-09 07:00:15 +08:00
										 |  |  | +    let query_value = match query_value {
 | 
					
						
							|  |  |  | +        Some(v) => v,
 | 
					
						
							|  |  |  | +        None => return prefers_forced_colors,
 | 
					
						
							|  |  |  | +    };
 | 
					
						
							|  |  |  |      match query_value { | 
					
						
							|  |  |  | -        Some(query_value) => forced == (query_value == ForcedColors::Active),
 | 
					
						
							|  |  |  | -        None => forced,
 | 
					
						
							|  |  |  | +        ForcedColors::Active => prefers_forced_colors,
 | 
					
						
							|  |  |  | +        ForcedColors::None => !prefers_forced_colors,
 | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/toolkit/components/browser/nsIWebBrowserChrome.idl b/toolkit/components/browser/nsIWebBrowserChrome.idl
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  | index 4f7337926efbb086a2be97cdbcb3dca39e27c786..f2005cb726ff153d6b1011d6af0479dbf1af02a5 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/components/browser/nsIWebBrowserChrome.idl
 | 
					
						
							|  |  |  | +++ b/toolkit/components/browser/nsIWebBrowserChrome.idl
 | 
					
						
							|  |  |  | @@ -70,6 +70,9 @@ interface nsIWebBrowserChrome : nsISupports
 | 
					
						
							|  |  |  |      // Whether this window should use out-of-process cross-origin subframes. | 
					
						
							|  |  |  |      const unsigned long CHROME_FISSION_WINDOW         = 0x00200000; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +    // Whether this window has "width" or "height" defined in features
 | 
					
						
							|  |  |  | +    const unsigned long JUGGLER_WINDOW_EXPLICIT_SIZE  = 0x00400000;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |      // Prevents new window animations on MacOS and Windows. Currently | 
					
						
							|  |  |  |      // ignored for Linux. | 
					
						
							|  |  |  |      const unsigned long CHROME_SUPPRESS_ANIMATION     = 0x01000000; | 
					
						
							| 
									
										
										
										
											2021-08-25 22:26:20 +08:00
										 |  |  | diff --git a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 5184d1dcb0618dc15abd28462985040236ddf643..bce45ad2d76098c16e0877fa46f71158c884ea5a 100644
 | 
					
						
							| 
									
										
										
										
											2021-08-25 22:26:20 +08:00
										 |  |  | --- a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
 | 
					
						
							|  |  |  | +++ b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -116,6 +116,12 @@ EnterprisePoliciesManager.prototype = {
 | 
					
						
							| 
									
										
										
										
											2021-08-25 22:26:20 +08:00
										 |  |  |        Services.prefs.clearUserPref(PREF_POLICIES_APPLIED); | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +    // Playwright: Disable enterprise policies
 | 
					
						
							|  |  |  | +    if (true) {
 | 
					
						
							|  |  |  | +      this.status = Ci.nsIEnterprisePolicies.INACTIVE;
 | 
					
						
							|  |  |  | +      return;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |      let provider = this._chooseProvider(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |      if (provider.failed) { | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/toolkit/components/startup/nsAppStartup.cpp b/toolkit/components/startup/nsAppStartup.cpp
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | index a76e612bc7149155305468307bebf0e69679897d..ba3c5dc0af69a34fcfbf04a3dbc506ef45833107 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/components/startup/nsAppStartup.cpp
 | 
					
						
							|  |  |  | +++ b/toolkit/components/startup/nsAppStartup.cpp
 | 
					
						
							| 
									
										
										
										
											2021-10-14 16:20:52 +08:00
										 |  |  | @@ -370,7 +370,7 @@ nsAppStartup::Quit(uint32_t aMode, int aExitCode, bool* aUserAllowedQuit) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      nsCOMPtr<nsISimpleEnumerator> windowEnumerator; | 
					
						
							|  |  |  |      nsCOMPtr<nsIWindowMediator> mediator( | 
					
						
							|  |  |  |          do_GetService(NS_WINDOWMEDIATOR_CONTRACTID)); | 
					
						
							|  |  |  | -    if (mediator) {
 | 
					
						
							|  |  |  | +    if (ferocity != eForceQuit && mediator) {
 | 
					
						
							|  |  |  |        mediator->GetEnumerator(nullptr, getter_AddRefs(windowEnumerator)); | 
					
						
							|  |  |  |        if (windowEnumerator) { | 
					
						
							|  |  |  |          bool more; | 
					
						
							|  |  |  | diff --git a/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp b/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | index 3e9672fdfe9ddab8acd0f8b18772aece92bb3b64..83454a9c27c96d72597445653beaa014c38728cd 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp
 | 
					
						
							|  |  |  | +++ b/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp
 | 
					
						
							| 
									
										
										
										
											2021-08-14 00:01:09 +08:00
										 |  |  | @@ -174,8 +174,8 @@ nsBrowserStatusFilter::OnStateChange(nsIWebProgress* aWebProgress,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  NS_IMETHODIMP | 
					
						
							|  |  |  | -nsBrowserStatusFilter::OnProgressChange(nsIWebProgress* aWebProgress,
 | 
					
						
							|  |  |  | -                                        nsIRequest* aRequest,
 | 
					
						
							|  |  |  | +nsBrowserStatusFilter::OnProgressChange(nsIWebProgress *aWebProgress,
 | 
					
						
							|  |  |  | +                                        nsIRequest *aRequest,
 | 
					
						
							|  |  |  |                                          int32_t aCurSelfProgress, | 
					
						
							|  |  |  |                                          int32_t aMaxSelfProgress, | 
					
						
							|  |  |  |                                          int32_t aCurTotalProgress, | 
					
						
							|  |  |  | diff --git a/toolkit/components/windowwatcher/nsWindowWatcher.cpp b/toolkit/components/windowwatcher/nsWindowWatcher.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 3983d580cd11a8241481876aaf8a924f4f083ad0..0dd75bab6249a4db25dea3cabefd4f8e3744caad 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/components/windowwatcher/nsWindowWatcher.cpp
 | 
					
						
							|  |  |  | +++ b/toolkit/components/windowwatcher/nsWindowWatcher.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1815,7 +1815,11 @@ uint32_t nsWindowWatcher::CalculateChromeFlagsForContent(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |    // Open a minimal popup. | 
					
						
							|  |  |  |    *aIsPopupRequested = true; | 
					
						
							|  |  |  | -  return nsIWebBrowserChrome::CHROME_MINIMAL_POPUP;
 | 
					
						
							|  |  |  | +  uint32_t chromeFlags = 0;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  if (aFeatures.Exists("width") || aFeatures.Exists("height")) {
 | 
					
						
							|  |  |  | +    chromeFlags |= nsIWebBrowserChrome::JUGGLER_WINDOW_EXPLICIT_SIZE;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  | +  return chromeFlags | nsIWebBrowserChrome::CHROME_MINIMAL_POPUP;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |  /** | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/toolkit/mozapps/update/UpdateService.jsm b/toolkit/mozapps/update/UpdateService.jsm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 393ff53b8f69aba56d7f4d849e18aaddb0b94f49..f29602b0c7c436dec335bb7d6033750f3499fbbe 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/mozapps/update/UpdateService.jsm
 | 
					
						
							|  |  |  | +++ b/toolkit/mozapps/update/UpdateService.jsm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -3607,6 +3607,8 @@ UpdateService.prototype = {
 | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  |    }, | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  |    get disabledForTesting() { | 
					
						
							| 
									
										
										
										
											2022-05-16 23:39:02 +08:00
										 |  |  | +    /* for playwright */
 | 
					
						
							|  |  |  | +    return true;
 | 
					
						
							|  |  |  |      return ( | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  |        (Cu.isInAutomation || | 
					
						
							|  |  |  |          lazy.Marionette.running || | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/toolkit/toolkit.mozbuild b/toolkit/toolkit.mozbuild
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 1241f1b0f94e0965b517898167ca1b52cfb48dc5..39c14eb7c548b81d564bd2a4ed15c70a920e173c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/toolkit.mozbuild
 | 
					
						
							|  |  |  | +++ b/toolkit/toolkit.mozbuild
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -154,6 +154,7 @@ if CONFIG['ENABLE_WEBDRIVER']:
 | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  |          '/remote', | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |          '/testing/firefox-ui', | 
					
						
							|  |  |  |          '/testing/marionette', | 
					
						
							|  |  |  | +        '/juggler',
 | 
					
						
							|  |  |  |          '/toolkit/components/telemetry/tests/marionette', | 
					
						
							|  |  |  |      ] | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | diff --git a/toolkit/xre/nsWindowsWMain.cpp b/toolkit/xre/nsWindowsWMain.cpp
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  | index ea14a59b80bbfbaa17d7569734b8409d9d21fcde..f993e78e02563cada8c131be3d4658bc8f7532b6 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/toolkit/xre/nsWindowsWMain.cpp
 | 
					
						
							|  |  |  | +++ b/toolkit/xre/nsWindowsWMain.cpp
 | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  | @@ -14,9 +14,11 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #include "mozilla/Char16.h" | 
					
						
							|  |  |  | +#include "mozilla/CmdLineAndEnvUtils.h"
 | 
					
						
							|  |  |  |  #include "nsUTF8Utils.h" | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |  #include "nsWindowsHelpers.h" | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  | +#include <io.h>
 | 
					
						
							|  |  |  |  #include <windows.h> | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |  #include <versionhelpers.h> | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  | @@ -130,6 +132,20 @@ int wmain(int argc, WCHAR** argv) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    SanitizeEnvironmentVariables(); | 
					
						
							|  |  |  |    SetDllDirectoryW(L""); | 
					
						
							|  |  |  | +  bool hasJugglerPipe =
 | 
					
						
							|  |  |  | +      mozilla::CheckArg(argc, argv, L"juggler-pipe",
 | 
					
						
							|  |  |  | +                        static_cast<const wchar_t**>(nullptr),
 | 
					
						
							|  |  |  | +                        mozilla::CheckArgFlag::None) == mozilla::ARG_FOUND;
 | 
					
						
							|  |  |  | +  if (hasJugglerPipe && !mozilla::EnvHasValue("PW_PIPE_READ")) {
 | 
					
						
							|  |  |  | +    intptr_t stdio3 = _get_osfhandle(3);
 | 
					
						
							|  |  |  | +    intptr_t stdio4 = _get_osfhandle(4);
 | 
					
						
							|  |  |  | +    CHAR stdio3str[20];
 | 
					
						
							|  |  |  | +    CHAR stdio4str[20];
 | 
					
						
							|  |  |  | +    itoa(stdio3, stdio3str, 10);
 | 
					
						
							|  |  |  | +    itoa(stdio4, stdio4str, 10);
 | 
					
						
							|  |  |  | +    SetEnvironmentVariableA("PW_PIPE_READ", stdio3str);
 | 
					
						
							|  |  |  | +    SetEnvironmentVariableA("PW_PIPE_WRITE", stdio4str);
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    // Only run this code if LauncherProcessWin.h was included beforehand, thus | 
					
						
							|  |  |  |    // signalling that the hosting process should support launcher mode. | 
					
						
							|  |  |  | diff --git a/uriloader/base/nsDocLoader.cpp b/uriloader/base/nsDocLoader.cpp
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | index 9ca3975c99c8bff3829bce1cf49d1235910c3ab8..6606eb02fba53ea8bd401d07460b85b068abd2bd 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/uriloader/base/nsDocLoader.cpp
 | 
					
						
							|  |  |  | +++ b/uriloader/base/nsDocLoader.cpp
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | @@ -827,6 +827,13 @@ void nsDocLoader::DocLoaderIsEmpty(bool aFlushLayout,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |                          ("DocLoader:%p: Firing load event for document.open\n", | 
					
						
							|  |  |  |                           this)); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +                nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
 | 
					
						
							|  |  |  | +                if (os) {
 | 
					
						
							|  |  |  | +                  nsIPrincipal* principal = doc->NodePrincipal();
 | 
					
						
							|  |  |  | +                  if (!principal->IsSystemPrincipal())
 | 
					
						
							|  |  |  | +                    os->NotifyObservers(ToSupports(doc), "juggler-document-open-loaded", nullptr);
 | 
					
						
							|  |  |  | +                }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |                  // This is a very cut-down version of | 
					
						
							|  |  |  |                  // 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
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index a66f215e577d29eb1db88899136ccf4eff34a960..67ea697e80608a3d5a3836b01334efe3141e70a1 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/uriloader/exthandler/nsExternalHelperAppService.cpp
 | 
					
						
							|  |  |  | +++ b/uriloader/exthandler/nsExternalHelperAppService.cpp
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -113,6 +113,7 @@
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |  #include "mozilla/Components.h" | 
					
						
							|  |  |  |  #include "mozilla/ClearOnShutdown.h" | 
					
						
							|  |  |  | +#include "mozilla/ErrorNames.h"
 | 
					
						
							|  |  |  |  #include "mozilla/Preferences.h" | 
					
						
							|  |  |  |  #include "mozilla/ipc/URIUtils.h" | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -838,6 +839,12 @@ NS_IMETHODIMP nsExternalHelperAppService::ApplyDecodingForExtension(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    return NS_OK; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +NS_IMETHODIMP nsExternalHelperAppService::SetDownloadInterceptor(
 | 
					
						
							|  |  |  | +    nsIDownloadInterceptor* interceptor) {
 | 
					
						
							|  |  |  | +  mInterceptor = interceptor;
 | 
					
						
							|  |  |  | +  return NS_OK;
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  nsresult nsExternalHelperAppService::GetFileTokenForPath( | 
					
						
							|  |  |  |      const char16_t* aPlatformAppPath, nsIFile** aFile) { | 
					
						
							|  |  |  |    nsDependentString platformAppPath(aPlatformAppPath); | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1448,7 +1455,12 @@ nsresult nsExternalAppHandler::SetUpTempFile(nsIChannel* aChannel) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    // Strip off the ".part" from mTempLeafName | 
					
						
							|  |  |  |    mTempLeafName.Truncate(mTempLeafName.Length() - ArrayLength(".part") + 1); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  return CreateSaverForTempFile();
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +nsresult nsExternalAppHandler::CreateSaverForTempFile() {
 | 
					
						
							|  |  |  |    MOZ_ASSERT(!mSaver, "Output file initialization called more than once!"); | 
					
						
							|  |  |  | +  nsresult rv;
 | 
					
						
							|  |  |  |    mSaver = | 
					
						
							|  |  |  |        do_CreateInstance(NS_BACKGROUNDFILESAVERSTREAMLISTENER_CONTRACTID, &rv); | 
					
						
							|  |  |  |    NS_ENSURE_SUCCESS(rv, rv); | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1639,7 +1651,36 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      return NS_OK; | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | -  rv = SetUpTempFile(aChannel);
 | 
					
						
							|  |  |  | +  bool isIntercepted = false;
 | 
					
						
							|  |  |  | +  nsCOMPtr<nsIDownloadInterceptor> interceptor = mExtProtSvc->mInterceptor;
 | 
					
						
							|  |  |  | +  if (interceptor) {
 | 
					
						
							|  |  |  | +    nsCOMPtr<nsIFile> fileToUse;
 | 
					
						
							|  |  |  | +    rv = interceptor->InterceptDownloadRequest(this, request, mBrowsingContext, getter_AddRefs(fileToUse), &isIntercepted);
 | 
					
						
							|  |  |  | +    if (!NS_SUCCEEDED(rv)) {
 | 
					
						
							|  |  |  | +      LOG(("    failed to call nsIDowloadInterceptor.interceptDownloadRequest"));
 | 
					
						
							|  |  |  | +      return rv;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +    if (isIntercepted) {
 | 
					
						
							|  |  |  | +      LOG(("    request interceped by nsIDowloadInterceptor"));
 | 
					
						
							|  |  |  | +      if (fileToUse) {
 | 
					
						
							|  |  |  | +        mTempFile = fileToUse;
 | 
					
						
							|  |  |  | +        rv = mTempFile->GetLeafName(mTempLeafName);
 | 
					
						
							|  |  |  | +        NS_ENSURE_SUCCESS(rv, rv);
 | 
					
						
							|  |  |  | +      } else {
 | 
					
						
							|  |  |  | +        Cancel(NS_BINDING_ABORTED);
 | 
					
						
							|  |  |  | +        return NS_OK;
 | 
					
						
							|  |  |  | +      }
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  // Temp file is the final destination when download is intercepted. In that
 | 
					
						
							|  |  |  | +  // case we only need to create saver (and not create transfer later). Not creating
 | 
					
						
							|  |  |  | +  // mTransfer also cuts off all downloads handling logic in the js compoenents and
 | 
					
						
							|  |  |  | +  // browser UI.
 | 
					
						
							|  |  |  | +  if (isIntercepted)
 | 
					
						
							|  |  |  | +    rv = CreateSaverForTempFile();
 | 
					
						
							|  |  |  | +  else
 | 
					
						
							|  |  |  | +    rv = SetUpTempFile(aChannel);
 | 
					
						
							|  |  |  |    if (NS_FAILED(rv)) { | 
					
						
							|  |  |  |      nsresult transferError = rv; | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -1693,6 +1734,9 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2021-12-07 07:19:22 +08:00
										 |  |  |    bool alwaysAsk = true; | 
					
						
							|  |  |  |    mMimeInfo->GetAlwaysAskBeforeHandling(&alwaysAsk); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  if (isIntercepted) {
 | 
					
						
							|  |  |  | +    return NS_OK;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  |    if (alwaysAsk) { | 
					
						
							|  |  |  |      // But we *don't* ask if this mimeInfo didn't come from | 
					
						
							|  |  |  |      // our user configuration datastore and the user has said | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2259,6 +2303,16 @@ nsExternalAppHandler::OnSaveComplete(nsIBackgroundFileSaver* aSaver,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      NotifyTransfer(aStatus); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  if (!mCanceled) {
 | 
					
						
							|  |  |  | +    nsCOMPtr<nsIDownloadInterceptor> interceptor = mExtProtSvc->mInterceptor;
 | 
					
						
							|  |  |  | +    if (interceptor) {
 | 
					
						
							|  |  |  | +      nsCString noError;
 | 
					
						
							|  |  |  | +      nsresult rv = interceptor->OnDownloadComplete(this, noError);
 | 
					
						
							|  |  |  | +      MOZ_ASSERT(NS_SUCCEEDED(rv), "Failed to call nsIDowloadInterceptor.OnDownloadComplete");
 | 
					
						
							|  |  |  | +      Unused << rv;
 | 
					
						
							|  |  |  | +    }
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    return NS_OK; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -2744,6 +2798,15 @@ NS_IMETHODIMP nsExternalAppHandler::Cancel(nsresult aReason) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  nsCOMPtr<nsIDownloadInterceptor> interceptor = mExtProtSvc->mInterceptor;
 | 
					
						
							|  |  |  | +  if (interceptor) {
 | 
					
						
							|  |  |  | +    nsCString errorName;
 | 
					
						
							|  |  |  | +    GetErrorName(aReason, errorName);
 | 
					
						
							|  |  |  | +    nsresult rv = interceptor->OnDownloadComplete(this, errorName);
 | 
					
						
							|  |  |  | +    MOZ_ASSERT(NS_SUCCEEDED(rv), "Failed notify nsIDowloadInterceptor about cancel");
 | 
					
						
							|  |  |  | +    Unused << rv;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    // Break our reference cycle with the helper app dialog (set up in | 
					
						
							|  |  |  |    // OnStartRequest) | 
					
						
							|  |  |  |    mDialog = nullptr; | 
					
						
							|  |  |  | diff --git a/uriloader/exthandler/nsExternalHelperAppService.h b/uriloader/exthandler/nsExternalHelperAppService.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 2a1d67ffe2650d0d5f3e00bcb7f23deee8e76d0f..9e9731bc18de04fef382d0951a03793d83d14e14 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/uriloader/exthandler/nsExternalHelperAppService.h
 | 
					
						
							|  |  |  | +++ b/uriloader/exthandler/nsExternalHelperAppService.h
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -244,6 +244,8 @@ class nsExternalHelperAppService : public nsIExternalHelperAppService,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        mozilla::dom::BrowsingContext* aContentContext, bool aForceSave, | 
					
						
							|  |  |  |        nsIInterfaceRequestor* aWindowContext, | 
					
						
							|  |  |  |        nsIStreamListener** aStreamListener); | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  nsCOMPtr<nsIDownloadInterceptor> mInterceptor;
 | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  /** | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | @@ -446,6 +448,9 @@ class nsExternalAppHandler final : public nsIStreamListener,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |     * Upon successful return, both mTempFile and mSaver will be valid. | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |    nsresult SetUpTempFile(nsIChannel* aChannel); | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  nsresult CreateSaverForTempFile();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    /** | 
					
						
							|  |  |  |     * When we download a helper app, we are going to retarget all load | 
					
						
							|  |  |  |     * notifications into our own docloader and load group instead of | 
					
						
							|  |  |  | diff --git a/uriloader/exthandler/nsIExternalHelperAppService.idl b/uriloader/exthandler/nsIExternalHelperAppService.idl
 | 
					
						
							| 
									
										
										
										
											2022-08-11 06:34:01 +08:00
										 |  |  | index 307e6196a89df52d0bccc3ebd1359f58e32de75d..c3692d0f76178ac3aeb1c77a0e973bfa22359346 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/uriloader/exthandler/nsIExternalHelperAppService.idl
 | 
					
						
							|  |  |  | +++ b/uriloader/exthandler/nsIExternalHelperAppService.idl
 | 
					
						
							|  |  |  | @@ -6,6 +6,8 @@
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #include "nsICancelable.idl" | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +webidl BrowsingContext;
 | 
					
						
							|  |  |  | +interface nsIHelperAppLauncher;
 | 
					
						
							|  |  |  |  interface nsIURI; | 
					
						
							|  |  |  |  interface nsIRequest; | 
					
						
							|  |  |  |  interface nsIStreamListener; | 
					
						
							|  |  |  | @@ -15,6 +17,17 @@ interface nsIWebProgressListener2;
 | 
					
						
							|  |  |  |  interface nsIInterfaceRequestor; | 
					
						
							|  |  |  |  webidl BrowsingContext; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +/**
 | 
					
						
							|  |  |  | + * Interceptor interface used by Juggler.
 | 
					
						
							|  |  |  | + */
 | 
					
						
							|  |  |  | +[scriptable, uuid(9a20e9b0-75d0-11ea-bc55-0242ac130003)]
 | 
					
						
							|  |  |  | +interface nsIDownloadInterceptor : nsISupports
 | 
					
						
							|  |  |  | +{
 | 
					
						
							|  |  |  | +  bool interceptDownloadRequest(in nsIHelperAppLauncher aHandler, in nsIRequest aRequest, in BrowsingContext aBrowsingContext, out nsIFile file);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  void onDownloadComplete(in nsIHelperAppLauncher aHandler, in ACString aErrorName);
 | 
					
						
							|  |  |  | +};
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  /** | 
					
						
							|  |  |  |   * The external helper app service is used for finding and launching | 
					
						
							|  |  |  |   * platform specific external applications for a given mime content type. | 
					
						
							|  |  |  | @@ -76,6 +89,7 @@ interface nsIExternalHelperAppService : nsISupports
 | 
					
						
							|  |  |  |    boolean applyDecodingForExtension(in AUTF8String aExtension, | 
					
						
							|  |  |  |                                      in ACString aEncodingType); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  void setDownloadInterceptor(in nsIDownloadInterceptor interceptor);
 | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  /** | 
					
						
							|  |  |  | diff --git a/widget/InProcessCompositorWidget.cpp b/widget/InProcessCompositorWidget.cpp
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  | index 1c25e9d9a101233f71e92288a0f93125b81ac1c5..22cf67b0f6e3ddd2b3ed725a314ba6a9896abd1c 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/widget/InProcessCompositorWidget.cpp
 | 
					
						
							|  |  |  | +++ b/widget/InProcessCompositorWidget.cpp
 | 
					
						
							|  |  |  | @@ -4,7 +4,10 @@
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #include "InProcessCompositorWidget.h" | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +#include "HeadlessCompositorWidget.h"
 | 
					
						
							|  |  |  | +#include "HeadlessWidget.h"
 | 
					
						
							|  |  |  |  #include "mozilla/VsyncDispatcher.h" | 
					
						
							|  |  |  | +#include "mozilla/widget/PlatformWidgetTypes.h"
 | 
					
						
							|  |  |  |  #include "nsBaseWidget.h" | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |  namespace mozilla { | 
					
						
							|  |  |  | @@ -23,6 +26,12 @@ RefPtr<CompositorWidget> CompositorWidget::CreateLocal(
 | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  |    // do it after the static_cast. | 
					
						
							|  |  |  |    nsBaseWidget* widget = static_cast<nsBaseWidget*>(aWidget); | 
					
						
							|  |  |  |    MOZ_RELEASE_ASSERT(widget); | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  if (aInitData.type() ==
 | 
					
						
							|  |  |  | +      CompositorWidgetInitData::THeadlessCompositorWidgetInitData) {
 | 
					
						
							|  |  |  | +    return new HeadlessCompositorWidget(
 | 
					
						
							|  |  |  | +        aInitData.get_HeadlessCompositorWidgetInitData(), aOptions,
 | 
					
						
							|  |  |  | +        static_cast<HeadlessWidget*>(aWidget));
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							| 
									
										
										
										
											2021-12-15 15:24:25 +08:00
										 |  |  |    return new InProcessCompositorWidget(aOptions, widget); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |  #endif | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/widget/cocoa/NativeKeyBindings.mm b/widget/cocoa/NativeKeyBindings.mm
 | 
					
						
							| 
									
										
										
										
											2022-03-29 06:14:20 +08:00
										 |  |  | index d3e5983259053175584254e7ac01ca9ce024f33a..97f5b851c402fea5477c0ee57af451c62b016eec 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/widget/cocoa/NativeKeyBindings.mm
 | 
					
						
							|  |  |  | +++ b/widget/cocoa/NativeKeyBindings.mm
 | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | @@ -492,6 +492,13 @@ void NativeKeyBindings::GetEditCommandsForTests(NativeKeyBindingsType aType,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        break; | 
					
						
							|  |  |  |      case KEY_NAME_INDEX_ArrowLeft: | 
					
						
							|  |  |  |        if (aEvent.IsAlt()) { | 
					
						
							|  |  |  | +        if (aEvent.IsMeta() || aEvent.IsControl())
 | 
					
						
							|  |  |  | +          break;
 | 
					
						
							|  |  |  | +        instance->AppendEditCommandsForSelector(
 | 
					
						
							|  |  |  | +            !aEvent.IsShift()
 | 
					
						
							|  |  |  | +                ? ToObjcSelectorPtr(@selector(moveWordLeft:))
 | 
					
						
							|  |  |  | +                : ToObjcSelectorPtr(@selector(moveWordLeftAndModifySelection:)),
 | 
					
						
							|  |  |  | +            aCommands);
 | 
					
						
							|  |  |  |          break; | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |        if (aEvent.IsMeta() || (aEvent.IsControl() && aEvent.IsShift())) { | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | @@ -512,6 +519,13 @@ void NativeKeyBindings::GetEditCommandsForTests(NativeKeyBindingsType aType,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        break; | 
					
						
							|  |  |  |      case KEY_NAME_INDEX_ArrowRight: | 
					
						
							|  |  |  |        if (aEvent.IsAlt()) { | 
					
						
							|  |  |  | +        if (aEvent.IsMeta() || aEvent.IsControl())
 | 
					
						
							|  |  |  | +          break;
 | 
					
						
							|  |  |  | +        instance->AppendEditCommandsForSelector(
 | 
					
						
							|  |  |  | +            !aEvent.IsShift()
 | 
					
						
							|  |  |  | +                ? ToObjcSelectorPtr(@selector(moveWordRight:))
 | 
					
						
							|  |  |  | +                : ToObjcSelectorPtr(@selector(moveWordRightAndModifySelection:)),
 | 
					
						
							|  |  |  | +            aCommands);
 | 
					
						
							|  |  |  |          break; | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |        if (aEvent.IsMeta() || (aEvent.IsControl() && aEvent.IsShift())) { | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | @@ -532,6 +546,10 @@ void NativeKeyBindings::GetEditCommandsForTests(NativeKeyBindingsType aType,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        break; | 
					
						
							|  |  |  |      case KEY_NAME_INDEX_ArrowUp: | 
					
						
							|  |  |  |        if (aEvent.IsControl()) { | 
					
						
							|  |  |  | +        if (aEvent.IsMeta() || aEvent.IsAlt())
 | 
					
						
							|  |  |  | +          break;
 | 
					
						
							|  |  |  | +        instance->AppendEditCommandsForSelector(
 | 
					
						
							|  |  |  | +          ToObjcSelectorPtr(@selector(scrollPageUp:)), aCommands);
 | 
					
						
							|  |  |  |          break; | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |        if (aEvent.IsMeta()) { | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | @@ -541,7 +559,7 @@ void NativeKeyBindings::GetEditCommandsForTests(NativeKeyBindingsType aType,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |          instance->AppendEditCommandsForSelector( | 
					
						
							|  |  |  |              !aEvent.IsShift() | 
					
						
							|  |  |  |                  ? ToObjcSelectorPtr(@selector(moveToBeginningOfDocument:)) | 
					
						
							|  |  |  | -                : ToObjcSelectorPtr(@selector(moveToBegginingOfDocumentAndModifySelection:)),
 | 
					
						
							|  |  |  | +                : ToObjcSelectorPtr(@selector(moveToBeginningOfDocumentAndModifySelection:)),
 | 
					
						
							|  |  |  |              aCommands); | 
					
						
							|  |  |  |          break; | 
					
						
							|  |  |  |        } | 
					
						
							| 
									
										
										
										
											2022-08-11 20:13:27 +08:00
										 |  |  | @@ -564,6 +582,10 @@ void NativeKeyBindings::GetEditCommandsForTests(NativeKeyBindingsType aType,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |        break; | 
					
						
							|  |  |  |      case KEY_NAME_INDEX_ArrowDown: | 
					
						
							|  |  |  |        if (aEvent.IsControl()) { | 
					
						
							|  |  |  | +        if (aEvent.IsMeta() || aEvent.IsAlt())
 | 
					
						
							|  |  |  | +          break;
 | 
					
						
							|  |  |  | +        instance->AppendEditCommandsForSelector(
 | 
					
						
							|  |  |  | +          ToObjcSelectorPtr(@selector(scrollPageDown:)), aCommands);
 | 
					
						
							|  |  |  |          break; | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |        if (aEvent.IsMeta()) { | 
					
						
							|  |  |  | diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
 | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..52aed4f9fb51f3f58a440d7e57eaccd6dfcbc2ab 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/widget/headless/HeadlessCompositorWidget.cpp
 | 
					
						
							|  |  |  | +++ b/widget/headless/HeadlessCompositorWidget.cpp
 | 
					
						
							|  |  |  | @@ -3,6 +3,7 @@
 | 
					
						
							|  |  |  |   * License, v. 2.0. If a copy of the MPL was not distributed with this | 
					
						
							|  |  |  |   * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +#include "mozilla/layers/CompositorThread.h"
 | 
					
						
							|  |  |  |  #include "mozilla/widget/PlatformWidgetTypes.h" | 
					
						
							|  |  |  |  #include "HeadlessCompositorWidget.h" | 
					
						
							|  |  |  |  #include "VsyncDispatcher.h" | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | @@ -13,10 +14,32 @@ namespace widget {
 | 
					
						
							|  |  |  |  HeadlessCompositorWidget::HeadlessCompositorWidget( | 
					
						
							|  |  |  |      const HeadlessCompositorWidgetInitData& aInitData, | 
					
						
							|  |  |  |      const layers::CompositorOptions& aOptions, HeadlessWidget* aWindow) | 
					
						
							|  |  |  | -    : CompositorWidget(aOptions), mWidget(aWindow) {
 | 
					
						
							|  |  |  | +    : CompositorWidget(aOptions), mWidget(aWindow), mMon("snapshotListener") {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    mClientSize = aInitData.InitialClientSize(); | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +void HeadlessCompositorWidget::SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(NS_IsMainThread());
 | 
					
						
							|  |  |  | +
 | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | +  ReentrantMonitorAutoEnter lock(mMon);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  mSnapshotListener = std::move(listener);
 | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | +  layers::CompositorThread()->Dispatch(NewRunnableMethod(
 | 
					
						
							|  |  |  | +      "HeadlessCompositorWidget::PeriodicSnapshot", this,
 | 
					
						
							|  |  |  | +      &HeadlessCompositorWidget::PeriodicSnapshot
 | 
					
						
							|  |  |  | +  ));
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +already_AddRefed<gfx::DrawTarget> HeadlessCompositorWidget::StartRemoteDrawingInRegion(
 | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  | +    const LayoutDeviceIntRegion& aInvalidRegion,
 | 
					
						
							|  |  |  | +    layers::BufferMode* aBufferMode) {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  if (!mDrawTarget)
 | 
					
						
							|  |  |  | +    return nullptr;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  *aBufferMode = layers::BufferMode::BUFFER_NONE;
 | 
					
						
							|  |  |  | +  RefPtr<gfx::DrawTarget> result = mDrawTarget;
 | 
					
						
							|  |  |  | +  return result.forget();
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) { | 
					
						
							|  |  |  |    if (RefPtr<CompositorVsyncDispatcher> cvd = | 
					
						
							|  |  |  |            mWidget->GetCompositorVsyncDispatcher()) { | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | @@ -29,6 +52,59 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  void HeadlessCompositorWidget::NotifyClientSizeChanged( | 
					
						
							|  |  |  |      const LayoutDeviceIntSize& aClientSize) { | 
					
						
							|  |  |  |    mClientSize = aClientSize; | 
					
						
							|  |  |  | +  layers::CompositorThread()->Dispatch(NewRunnableMethod<LayoutDeviceIntSize>(
 | 
					
						
							|  |  |  | +      "HeadlessCompositorWidget::UpdateDrawTarget", this,
 | 
					
						
							|  |  |  | +      &HeadlessCompositorWidget::UpdateDrawTarget,
 | 
					
						
							|  |  |  | +      aClientSize));
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +void HeadlessCompositorWidget::UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize) {
 | 
					
						
							|  |  |  | +  MOZ_ASSERT(NS_IsInCompositorThread());
 | 
					
						
							|  |  |  | +  if (aClientSize.IsEmpty()) {
 | 
					
						
							|  |  |  | +    mDrawTarget = nullptr;
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  RefPtr<gfx::DrawTarget> old = std::move(mDrawTarget);
 | 
					
						
							|  |  |  | +  gfx::SurfaceFormat format = gfx::SurfaceFormat::B8G8R8A8;
 | 
					
						
							|  |  |  | +  gfx::IntSize size = aClientSize.ToUnknownSize();
 | 
					
						
							|  |  |  | +  mDrawTarget = mozilla::gfx::Factory::CreateDrawTarget(
 | 
					
						
							|  |  |  | +      mozilla::gfx::BackendType::SKIA, size, format);
 | 
					
						
							|  |  |  | +  if (old) {
 | 
					
						
							|  |  |  | +    RefPtr<gfx::SourceSurface> snapshot = old->Snapshot();
 | 
					
						
							|  |  |  | +    if (snapshot)
 | 
					
						
							|  |  |  | +      mDrawTarget->CopySurface(snapshot.get(), old->GetRect(), gfx::IntPoint(0, 0));
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +void HeadlessCompositorWidget::PeriodicSnapshot() {
 | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | +  ReentrantMonitorAutoEnter lock(mMon);
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | +  if (!mSnapshotListener)
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  TakeSnapshot();
 | 
					
						
							|  |  |  | +  NS_DelayedDispatchToCurrentThread(NewRunnableMethod(
 | 
					
						
							|  |  |  | +      "HeadlessCompositorWidget::PeriodicSnapshot", this,
 | 
					
						
							|  |  |  | +      &HeadlessCompositorWidget::PeriodicSnapshot), 40);
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +void HeadlessCompositorWidget::TakeSnapshot() {
 | 
					
						
							|  |  |  | +  if (!mDrawTarget)
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  RefPtr<gfx::SourceSurface> snapshot = mDrawTarget->Snapshot();
 | 
					
						
							|  |  |  | +  if (!snapshot) {
 | 
					
						
							|  |  |  | +    fprintf(stderr, "Failed to get snapshot of draw target\n");
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
 | 
					
						
							|  |  |  | +  if (!dataSurface) {
 | 
					
						
							|  |  |  | +    fprintf(stderr, "Failed to get data surface from snapshot\n");
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  mSnapshotListener(std::move(dataSurface));
 | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() { | 
					
						
							|  |  |  | diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
 | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..753b8902026626e8f0a190ea3130ba5e65c24835 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/widget/headless/HeadlessCompositorWidget.h
 | 
					
						
							|  |  |  | +++ b/widget/headless/HeadlessCompositorWidget.h
 | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | @@ -6,6 +6,7 @@
 | 
					
						
							|  |  |  |  #ifndef widget_headless_HeadlessCompositorWidget_h | 
					
						
							|  |  |  |  #define widget_headless_HeadlessCompositorWidget_h | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +#include "mozilla/ReentrantMonitor.h"
 | 
					
						
							|  |  |  |  #include "mozilla/widget/CompositorWidget.h" | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  #include "HeadlessWidget.h" | 
					
						
							|  |  |  | @@ -23,8 +24,12 @@ class HeadlessCompositorWidget final : public CompositorWidget,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |                             HeadlessWidget* aWindow); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize); | 
					
						
							|  |  |  | +  void SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener);
 | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    // CompositorWidget Overrides | 
					
						
							|  |  |  | +  already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion(
 | 
					
						
							| 
									
										
										
										
											2021-04-21 04:46:46 +08:00
										 |  |  | +      const LayoutDeviceIntRegion& aInvalidRegion,
 | 
					
						
							|  |  |  | +      layers::BufferMode* aBufferMode) override;
 | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    uintptr_t GetWidgetKey() override; | 
					
						
							|  |  |  |   | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | @@ -42,9 +47,17 @@ class HeadlessCompositorWidget final : public CompositorWidget,
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  | +  void UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize);
 | 
					
						
							|  |  |  | +  void PeriodicSnapshot();
 | 
					
						
							|  |  |  | +  void TakeSnapshot();
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    HeadlessWidget* mWidget; | 
					
						
							| 
									
										
										
										
											2021-12-14 13:23:25 +08:00
										 |  |  | +  mozilla::ReentrantMonitor mMon;
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  |    LayoutDeviceIntSize mClientSize; | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +  HeadlessWidget::SnapshotListener mSnapshotListener;
 | 
					
						
							|  |  |  | +  RefPtr<gfx::DrawTarget> mDrawTarget;
 | 
					
						
							|  |  |  |  }; | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  }  // namespace widget | 
					
						
							|  |  |  | diff --git a/widget/headless/HeadlessWidget.cpp b/widget/headless/HeadlessWidget.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index c1fbcccc93d9a6876aa82893cdf9c09b72087751..7a8073e3b746aec3a894957e87975189c06782d3 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/widget/headless/HeadlessWidget.cpp
 | 
					
						
							|  |  |  | +++ b/widget/headless/HeadlessWidget.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -109,6 +109,8 @@ void HeadlessWidget::Destroy() {
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |      } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | +  SetSnapshotListener(nullptr);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |    nsBaseWidget::OnDestroy(); | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |    nsBaseWidget::Destroy(); | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -564,5 +566,15 @@ nsresult HeadlessWidget::SynthesizeNativeTouchPadPinch(
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |    DispatchPinchGestureInput(inputToDispatch); | 
					
						
							|  |  |  |    return NS_OK; | 
					
						
							|  |  |  |  } | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  | +void HeadlessWidget::SetSnapshotListener(SnapshotListener&& listener) {
 | 
					
						
							|  |  |  | +  if (!mCompositorWidget) {
 | 
					
						
							|  |  |  | +    if (listener)
 | 
					
						
							|  |  |  | +      fprintf(stderr, "Trying to set SnapshotListener without compositor widget\n");
 | 
					
						
							|  |  |  | +    return;
 | 
					
						
							|  |  |  | +  }
 | 
					
						
							|  |  |  | +  mCompositorWidget->SetSnapshotListener(std::move(listener));
 | 
					
						
							|  |  |  | +}
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |  }  // namespace widget | 
					
						
							|  |  |  |  }  // namespace mozilla | 
					
						
							|  |  |  | diff --git a/widget/headless/HeadlessWidget.h b/widget/headless/HeadlessWidget.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 2b80eea70e58dd53c34edd9c5fa4415c42bcd632..72ecda7d8ddc7a9f87a954b547f8411e67ef1570 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/widget/headless/HeadlessWidget.h
 | 
					
						
							|  |  |  | +++ b/widget/headless/HeadlessWidget.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | @@ -135,6 +135,9 @@ class HeadlessWidget : public nsBaseWidget {
 | 
					
						
							| 
									
										
										
										
											2021-08-14 00:01:09 +08:00
										 |  |  |        TouchpadGesturePhase aEventPhase, float aScale, | 
					
						
							|  |  |  |        LayoutDeviceIntPoint aPoint, int32_t aModifierFlags) override; | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |   | 
					
						
							|  |  |  | +  using SnapshotListener = std::function<void(RefPtr<gfx::DataSourceSurface>&&)>;
 | 
					
						
							|  |  |  | +  void SetSnapshotListener(SnapshotListener&& listener);
 | 
					
						
							|  |  |  | +
 | 
					
						
							|  |  |  |   private: | 
					
						
							|  |  |  |    ~HeadlessWidget(); | 
					
						
							|  |  |  |    bool mEnabled; | 
					
						
							| 
									
										
										
										
											2022-04-27 03:03:35 +08:00
										 |  |  | diff --git a/widget/windows/nsAppShell.cpp b/widget/windows/nsAppShell.cpp
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index e2cf83f3d6ee0b120bb22f46aa873d3bd6436cd0..8ea269c8de520d3a9eed42f99f66ad28f5e63fbc 100644
 | 
					
						
							| 
									
										
										
										
											2022-04-27 03:03:35 +08:00
										 |  |  | --- a/widget/windows/nsAppShell.cpp
 | 
					
						
							|  |  |  | +++ b/widget/windows/nsAppShell.cpp
 | 
					
						
							|  |  |  | @@ -17,7 +17,9 @@
 | 
					
						
							|  |  |  |  #include "WinIMEHandler.h" | 
					
						
							|  |  |  |  #include "mozilla/widget/AudioSession.h" | 
					
						
							|  |  |  |  #include "mozilla/BackgroundHangMonitor.h" | 
					
						
							|  |  |  | -#include "mozilla/BackgroundTasks.h"
 | 
					
						
							|  |  |  | +#ifdef MOZ_BACKGROUNDTASKS
 | 
					
						
							|  |  |  | +#  include "mozilla/BackgroundTasks.h"
 | 
					
						
							|  |  |  | +#endif
 | 
					
						
							|  |  |  |  #include "mozilla/Hal.h" | 
					
						
							|  |  |  |  #include "nsIDOMWakeLockListener.h" | 
					
						
							|  |  |  |  #include "nsIPowerManagerService.h" | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | diff --git a/xpcom/reflect/xptinfo/xptinfo.h b/xpcom/reflect/xptinfo/xptinfo.h
 | 
					
						
							| 
									
										
										
										
											2022-07-06 06:47:35 +08:00
										 |  |  | index 2456c2c2b58b27cd595880b547ed20fb687a1835..e967c089b2331c7cd36d34e511543fbc84320b7d 100644
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  | --- a/xpcom/reflect/xptinfo/xptinfo.h
 | 
					
						
							|  |  |  | +++ b/xpcom/reflect/xptinfo/xptinfo.h
 | 
					
						
							| 
									
										
										
										
											2021-06-08 15:03:16 +08:00
										 |  |  | @@ -514,7 +514,7 @@ static_assert(sizeof(nsXPTMethodInfo) == 8, "wrong size");
 | 
					
						
							| 
									
										
										
										
											2021-04-10 13:13:19 +08:00
										 |  |  |  #if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE) | 
					
						
							|  |  |  |  #  define PARAM_BUFFER_COUNT 18 | 
					
						
							|  |  |  |  #else | 
					
						
							|  |  |  | -#  define PARAM_BUFFER_COUNT 14
 | 
					
						
							|  |  |  | +#  define PARAM_BUFFER_COUNT 15
 | 
					
						
							|  |  |  |  #endif | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  |  /** |