2020-01-29 18:56:11 -08:00
|
|
|
diff --git a/accessible/base/NotificationController.h b/accessible/base/NotificationController.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 137963f1170927ae0262e0dc26ef721d496376f4..41fa27bc4a3da41814a7f326792990df3424e81f 100644
|
2020-01-29 18:56:11 -08:00
|
|
|
--- a/accessible/base/NotificationController.h
|
|
|
|
+++ b/accessible/base/NotificationController.h
|
2023-07-06 12:22:45 -07:00
|
|
|
@@ -244,6 +244,8 @@ class NotificationController final : public EventQueue,
|
2020-01-29 18:56:11 -08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+ bool IsUpdatePendingForJugglerAccessibility() { return IsUpdatePending(); }
|
|
|
|
+
|
|
|
|
protected:
|
|
|
|
virtual ~NotificationController();
|
|
|
|
|
|
|
|
diff --git a/accessible/interfaces/nsIAccessibleDocument.idl b/accessible/interfaces/nsIAccessibleDocument.idl
|
2023-10-10 16:10:40 -07:00
|
|
|
index 1886621c373fe1fd5ff54092afc4c64e9ca9a8fd..a0febf72885410b45227171c63e823eca118cb37 100644
|
2020-01-29 18:56:11 -08:00
|
|
|
--- a/accessible/interfaces/nsIAccessibleDocument.idl
|
|
|
|
+++ b/accessible/interfaces/nsIAccessibleDocument.idl
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -67,4 +67,9 @@ interface nsIAccessibleDocument : nsISupports
|
2020-01-29 18:56:11 -08:00
|
|
|
* 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
|
2023-11-14 10:18:18 -08:00
|
|
|
index d616e476b2149de5703077563680905e40db0459..7a8a48d5e7303a298a3e2e9fdf64558b3cdbe654 100644
|
2020-01-29 18:56:11 -08:00
|
|
|
--- a/accessible/xpcom/xpcAccessibleDocument.cpp
|
|
|
|
+++ b/accessible/xpcom/xpcAccessibleDocument.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -131,6 +131,13 @@ xpcAccessibleDocument::GetChildDocumentAt(uint32_t aIndex,
|
2023-10-10 16:10:40 -07:00
|
|
|
return *aDocument ? NS_OK : NS_ERROR_INVALID_ARG;
|
2020-01-29 18:56:11 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
+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
|
2023-10-10 16:10:40 -07:00
|
|
|
index 8e9bf2b413585b5a3db9370eee5d57fb6c6716ed..5a3b194b54e3813c89989f13a214c989a409f0f6 100644
|
2020-01-29 18:56:11 -08:00
|
|
|
--- a/accessible/xpcom/xpcAccessibleDocument.h
|
|
|
|
+++ b/accessible/xpcom/xpcAccessibleDocument.h
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -47,6 +47,8 @@ class xpcAccessibleDocument : public xpcAccessibleHyperText,
|
|
|
|
NS_IMETHOD GetChildDocumentAt(uint32_t aIndex,
|
2020-01-29 18:56:11 -08:00
|
|
|
nsIAccessibleDocument** aDocument) final;
|
|
|
|
|
|
|
|
+ NS_IMETHOD GetIsUpdatePendingForJugglerAccessibility(bool* aUpdating) final;
|
|
|
|
+
|
|
|
|
/**
|
|
|
|
* Return XPCOM wrapper for the internal accessible.
|
|
|
|
*/
|
2020-10-05 10:58:56 -07:00
|
|
|
diff --git a/browser/app/winlauncher/LauncherProcessWin.cpp b/browser/app/winlauncher/LauncherProcessWin.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index b40e0fceb567c0d217adf284e13f434e49cc8467..2c4e6d5fbf8da40954ad6a5b15e412493e43b14e 100644
|
2020-10-05 10:58:56 -07:00
|
|
|
--- a/browser/app/winlauncher/LauncherProcessWin.cpp
|
|
|
|
+++ b/browser/app/winlauncher/LauncherProcessWin.cpp
|
2023-08-10 14:41:33 -07:00
|
|
|
@@ -22,6 +22,7 @@
|
2020-10-05 10:58:56 -07:00
|
|
|
#include "mozilla/WinHeaderOnlyUtils.h"
|
|
|
|
#include "nsWindowsHelpers.h"
|
|
|
|
|
|
|
|
+#include <io.h>
|
|
|
|
#include <windows.h>
|
|
|
|
#include <processthreadsapi.h>
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -421,8 +422,18 @@ Maybe<int> LauncherMain(int& argc, wchar_t* argv[],
|
2020-10-05 10:58:56 -07:00
|
|
|
HANDLE stdHandles[] = {::GetStdHandle(STD_INPUT_HANDLE),
|
|
|
|
::GetStdHandle(STD_OUTPUT_HANDLE),
|
|
|
|
::GetStdHandle(STD_ERROR_HANDLE)};
|
|
|
|
-
|
|
|
|
attrs.AddInheritableHandles(stdHandles);
|
|
|
|
+ // Playwright pipe installation.
|
|
|
|
+ bool hasJugglerPipe =
|
2023-01-23 11:29:48 -08:00
|
|
|
+ mozilla::CheckArg(argc, argv, "juggler-pipe", nullptr,
|
2020-10-05 10:58:56 -07:00
|
|
|
+ mozilla::CheckArgFlag::None) == mozilla::ARG_FOUND;
|
browser(firefox): properly initialize debugging pipe on windows (#5514)
browser(firefox): properly initialize debugging pipe on windows
Firefox on Windows has 2 launch modes:
- default: a special "launcher process" is used to start browser as a
sub-process
- non-default: browser process starts right away
Firefox has a logic to detect how successful was the use of the
launcher process to do self-recovery when things go wrong. Namely:
- when attempting to use launcher process, firefox records a timestamp
of the attempt beginning
- once the launcher process successfully launches browser sub-process,
firefox records another timestamp of the completion
On a new launch, firefox checks what timestamps are present. If there's
a timestamp that signifies start of launcher process, but no successful
timestamp, it decides that last "launcher process" use was not
successful and falls back to launching browser right away.
When launching 2 firefox processes right away, the first process
uses attempts to use launcher process and records the first timestamp.
At the same time, the second instance sees the first timestamp and
doesn't see the second timestamp, and falls back to launching browser
right away. Our debugging pipe code, however, does not support
non-launcher-process code path.
This patch adds support for remote debugging pipe in case of
non-launcher-process startup.
Drive-by:
- disable crashreporter altogether
- remove stray dcheck that breaks firefox debug compilation
- disable compilation of firefox update agent
- do not use WIN32_DISTRIB flag unless doing full builds since
it kills incremental compilation
References #4660
2021-02-19 10:32:47 -08:00
|
|
|
+ if (hasJugglerPipe) {
|
2020-10-05 10:58:56 -07:00
|
|
|
+ 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;
|
|
|
|
|
2019-11-18 18:18:28 -08:00
|
|
|
diff --git a/browser/installer/allowed-dupes.mn b/browser/installer/allowed-dupes.mn
|
2024-02-22 13:17:33 -08:00
|
|
|
index 24a6f228c617c034ccc4926c238aa15e32c964f6..38c4ed9936f5033abe7a4ac7997aea2d92747733 100644
|
2019-11-18 18:18:28 -08:00
|
|
|
--- a/browser/installer/allowed-dupes.mn
|
|
|
|
+++ b/browser/installer/allowed-dupes.mn
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -71,6 +71,12 @@ browser/features/webcompat@mozilla.org/shims/empty-shim.txt
|
2021-08-11 03:37:57 +03:00
|
|
|
removed-files
|
|
|
|
#endif
|
2020-04-15 17:31:59 -07:00
|
|
|
|
2019-11-18 18:18:28 -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
|
2020-04-15 17:31:59 -07:00
|
|
|
+
|
2024-01-13 00:19:49 +01:00
|
|
|
# Bug 1496075 - Switch searchplugins to Web Extensions
|
|
|
|
browser/chrome/browser/search-extensions/amazon/favicon.ico
|
|
|
|
browser/chrome/browser/search-extensions/amazondotcn/favicon.ico
|
2019-11-18 18:18:28 -08:00
|
|
|
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
|
2024-02-22 13:17:33 -08:00
|
|
|
index b3213b8c4498b0467d7863d53c5fc4240e4609be..5ca6b68c6c7aaebd41a81999974f69810876f82b 100644
|
2019-11-18 18:18:28 -08:00
|
|
|
--- a/browser/installer/package-manifest.in
|
|
|
|
+++ b/browser/installer/package-manifest.in
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -195,6 +195,9 @@
|
2021-07-14 08:26:43 -08:00
|
|
|
@RESPATH@/chrome/remote.manifest
|
2019-11-18 18:18:28 -08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
+@RESPATH@/chrome/juggler@JAREXT@
|
|
|
|
+@RESPATH@/chrome/juggler.manifest
|
|
|
|
+
|
2022-08-23 15:13:06 -07:00
|
|
|
; [Extensions]
|
|
|
|
@RESPATH@/components/extensions-toolkit.manifest
|
|
|
|
@RESPATH@/browser/components/extensions-browser.manifest
|
2020-01-28 14:03:19 -08:00
|
|
|
diff --git a/devtools/server/socket/websocket-server.js b/devtools/server/socket/websocket-server.js
|
2023-09-11 18:16:33 -07:00
|
|
|
index 4236ec2921bd57c58cfffdf1cdcf509d76fca3db..23d0cb1f06bb8c7a1cac8fcec94a99fba5bfe3f2 100644
|
2020-01-28 14:03:19 -08:00
|
|
|
--- a/devtools/server/socket/websocket-server.js
|
|
|
|
+++ b/devtools/server/socket/websocket-server.js
|
2023-01-23 11:29:48 -08:00
|
|
|
@@ -134,13 +134,12 @@ function writeHttpResponse(output, response) {
|
2020-01-28 14:03:19 -08:00
|
|
|
* 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");
|
|
|
|
}
|
|
|
|
|
2023-01-23 11:29:48 -08:00
|
|
|
@@ -190,13 +189,13 @@ function computeKey(key) {
|
2020-01-28 14:03:19 -08:00
|
|
|
/**
|
|
|
|
* Perform the server part of a WebSocket opening handshake on an incoming connection.
|
|
|
|
*/
|
2023-09-11 18:16:33 -07:00
|
|
|
-const serverHandshake = async function (input, output) {
|
|
|
|
+const serverHandshake = async function (input, output, expectedPath) {
|
2020-01-28 14:03:19 -08:00
|
|
|
// 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, [
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -218,8 +217,8 @@ const serverHandshake = async function (input, output) {
|
2020-01-28 14:03:19 -08:00
|
|
|
* Performs the WebSocket handshake and waits for the WebSocket to open.
|
|
|
|
* Returns Promise with a WebSocket ready to send and receive messages.
|
|
|
|
*/
|
2023-09-11 18:16:33 -07:00
|
|
|
-const accept = async function (transport, input, output) {
|
2020-01-28 14:03:19 -08:00
|
|
|
- await serverHandshake(input, output);
|
2023-09-11 18:16:33 -07:00
|
|
|
+const accept = async function (transport, input, output, expectedPath) {
|
2020-01-28 14:03:19 -08:00
|
|
|
+ await serverHandshake(input, output, expectedPath || "/");
|
|
|
|
|
|
|
|
const transportProvider = {
|
|
|
|
setListener(upgradeListener) {
|
2021-05-18 21:23:12 +02:00
|
|
|
diff --git a/docshell/base/BrowsingContext.cpp b/docshell/base/BrowsingContext.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 211f83a476caa08281b3a0158da42cb08b01a374..47d78411e67d3f9b67c48ff10379e117b8631ab6 100644
|
2021-05-18 21:23:12 +02:00
|
|
|
--- a/docshell/base/BrowsingContext.cpp
|
|
|
|
+++ b/docshell/base/BrowsingContext.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -114,6 +114,20 @@ struct ParamTraits<mozilla::dom::PrefersColorSchemeOverride>
|
2021-05-18 21:23:12 +02: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-08 16:00:15 -07:00
|
|
|
+
|
|
|
|
+template <>
|
|
|
|
+struct ParamTraits<mozilla::dom::ForcedColorsOverride>
|
|
|
|
+ : public ContiguousEnumSerializer<
|
|
|
|
+ mozilla::dom::ForcedColorsOverride,
|
|
|
|
+ mozilla::dom::ForcedColorsOverride::None,
|
|
|
|
+ mozilla::dom::ForcedColorsOverride::EndGuard_> {};
|
2021-05-18 21:23:12 +02:00
|
|
|
+
|
|
|
|
template <>
|
|
|
|
struct ParamTraits<mozilla::dom::ExplicitActiveStatus>
|
|
|
|
: public ContiguousEnumSerializer<
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -2781,6 +2795,40 @@ void BrowsingContext::DidSet(FieldIndex<IDX_PrefersColorSchemeOverride>,
|
2022-06-29 04:46:49 -07:00
|
|
|
PresContextAffectingFieldChanged();
|
2021-05-18 21:23:12 +02: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-08 16:00:15 -07: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-18 21:23:12 +02:00
|
|
|
+
|
|
|
|
void BrowsingContext::DidSet(FieldIndex<IDX_MediumOverride>,
|
|
|
|
nsString&& aOldValue) {
|
|
|
|
MOZ_ASSERT(IsTop());
|
|
|
|
diff --git a/docshell/base/BrowsingContext.h b/docshell/base/BrowsingContext.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 84532563e1db1941abca5afa74a7d68473d391ef..84d6f605d5f70d11b355ba76b0f5af868864ac18 100644
|
2021-05-18 21:23:12 +02:00
|
|
|
--- a/docshell/base/BrowsingContext.h
|
|
|
|
+++ b/docshell/base/BrowsingContext.h
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -200,10 +200,10 @@ struct EmbedderColorSchemes {
|
2022-06-29 04:46:49 -07:00
|
|
|
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) \
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -241,6 +241,10 @@ struct EmbedderColorSchemes {
|
2022-06-29 04:46:49 -07:00
|
|
|
* <browser> embedder element. */ \
|
2023-01-23 11:29:48 -08:00
|
|
|
FIELD(EmbedderColorSchemes, EmbedderColorSchemes) \
|
2022-06-29 04:46:49 -07:00
|
|
|
FIELD(DisplayMode, dom::DisplayMode) \
|
|
|
|
+ /* playwright addition */ \
|
|
|
|
+ FIELD(PrefersReducedMotionOverride, dom::PrefersReducedMotionOverride) \
|
|
|
|
+ /* playwright addition */ \
|
|
|
|
+ FIELD(ForcedColorsOverride, dom::ForcedColorsOverride) \
|
2021-09-08 16:47:26 +03:00
|
|
|
/* The number of entries added to the session history because of this \
|
|
|
|
* browsing context. */ \
|
2022-06-29 04:46:49 -07:00
|
|
|
FIELD(HistoryEntryCount, uint32_t) \
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -923,6 +927,14 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
|
2021-05-18 21:23:12 +02:00
|
|
|
return GetPrefersColorSchemeOverride();
|
|
|
|
}
|
|
|
|
|
|
|
|
+ dom::PrefersReducedMotionOverride PrefersReducedMotionOverride() const {
|
|
|
|
+ return GetPrefersReducedMotionOverride();
|
|
|
|
+ }
|
2021-06-08 16:00:15 -07:00
|
|
|
+
|
|
|
|
+ dom::ForcedColorsOverride ForcedColorsOverride() const {
|
|
|
|
+ return GetForcedColorsOverride();
|
|
|
|
+ }
|
2021-05-18 21:23:12 +02:00
|
|
|
+
|
2021-10-13 15:49:41 -07:00
|
|
|
bool IsInBFCache() const;
|
2022-06-29 04:46:49 -07:00
|
|
|
|
|
|
|
bool AllowJavascript() const { return GetAllowJavascript(); }
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1087,6 +1099,23 @@ class BrowsingContext : public nsILoadContext, public nsWrapperCache {
|
2023-06-06 15:08:23 -07:00
|
|
|
void WalkPresContexts(Callback&&);
|
2022-06-29 04:46:49 -07:00
|
|
|
void PresContextAffectingFieldChanged();
|
2021-05-18 21:23:12 +02:00
|
|
|
|
|
|
|
+ bool CanSet(FieldIndex<IDX_PrefersReducedMotionOverride>,
|
|
|
|
+ dom::PrefersReducedMotionOverride, ContentParent*) {
|
|
|
|
+ return IsTop();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void DidSet(FieldIndex<IDX_PrefersReducedMotionOverride>,
|
|
|
|
+ dom::PrefersReducedMotionOverride aOldValue);
|
2021-06-08 16:00:15 -07:00
|
|
|
+
|
|
|
|
+
|
|
|
|
+ bool CanSet(FieldIndex<IDX_ForcedColorsOverride>,
|
|
|
|
+ dom::ForcedColorsOverride, ContentParent*) {
|
|
|
|
+ return IsTop();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ void DidSet(FieldIndex<IDX_ForcedColorsOverride>,
|
|
|
|
+ dom::ForcedColorsOverride aOldValue);
|
2021-05-18 21:23:12 +02:00
|
|
|
+
|
|
|
|
void DidSet(FieldIndex<IDX_MediumOverride>, nsString&& aOldValue);
|
|
|
|
|
|
|
|
bool CanSet(FieldIndex<IDX_SuspendMediaWhenInactive>, bool, ContentParent*) {
|
2023-03-21 01:23:12 +00:00
|
|
|
diff --git a/docshell/base/CanonicalBrowsingContext.cpp b/docshell/base/CanonicalBrowsingContext.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 044df3a801ed55e08347464397821261bb6761c0..8aa8e4844e4ba5364cbb0547c5397ce695798861 100644
|
2023-03-21 01:23:12 +00:00
|
|
|
--- a/docshell/base/CanonicalBrowsingContext.cpp
|
|
|
|
+++ b/docshell/base/CanonicalBrowsingContext.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1466,6 +1466,12 @@ void CanonicalBrowsingContext::LoadURI(nsIURI* aURI,
|
2023-03-21 01:23:12 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ {
|
|
|
|
+ nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
|
|
|
+ if (observerService) {
|
2023-06-06 15:08:23 -07:00
|
|
|
+ observerService->NotifyObservers(ToSupports(this), "juggler-navigation-started-browser", NS_ConvertASCIItoUTF16(nsPrintfCString("%" PRIu64, loadState->GetLoadIdentifier())).get());
|
2023-03-21 01:23:12 +00:00
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
LoadURI(loadState, true);
|
|
|
|
}
|
|
|
|
|
2019-11-18 18:18:28 -08:00
|
|
|
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index f4d8843e2df614b0037d2bfa47f02e328c7dff6c..596208d570d6625fa6b99fd75e7a037e8aa888bf 100644
|
2019-11-18 18:18:28 -08:00
|
|
|
--- a/docshell/base/nsDocShell.cpp
|
|
|
|
+++ b/docshell/base/nsDocShell.cpp
|
2020-04-01 14:10:30 -07:00
|
|
|
@@ -15,6 +15,12 @@
|
2020-03-26 16:33:07 -07:00
|
|
|
# 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"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -64,6 +70,7 @@
|
2020-03-20 11:14:42 -07: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"
|
2020-08-06 10:32:50 -07:00
|
|
|
#include "mozilla/dom/HTMLIFrameElement.h"
|
2020-03-20 11:14:42 -07:00
|
|
|
#include "mozilla/dom/PerformanceNavigation.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -88,6 +95,7 @@
|
2020-03-26 16:33:07 -07:00
|
|
|
#include "mozilla/dom/JSWindowActorChild.h"
|
2022-03-29 02:16:04 -06:00
|
|
|
#include "mozilla/dom/DocumentBinding.h"
|
2020-06-09 22:48:10 -07:00
|
|
|
#include "mozilla/ipc/ProtocolUtils.h"
|
2020-03-26 16:33:07 -07:00
|
|
|
+#include "mozilla/dom/WorkerCommon.h"
|
2020-05-07 18:37:15 -07:00
|
|
|
#include "mozilla/net/DocumentChannel.h"
|
2021-07-14 08:26:43 -08:00
|
|
|
#include "mozilla/net/DocumentChannelChild.h"
|
2020-08-12 10:09:20 -07:00
|
|
|
#include "mozilla/net/ParentChannelWrapper.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -111,6 +119,7 @@
|
2019-11-25 13:56:39 -08:00
|
|
|
#include "nsIDocShellTreeOwner.h"
|
|
|
|
#include "mozilla/dom/Document.h"
|
2022-05-31 01:54:36 -06:00
|
|
|
#include "nsHTMLDocument.h"
|
2019-11-25 13:56:39 -08:00
|
|
|
+#include "mozilla/dom/Element.h"
|
|
|
|
#include "nsIDocumentLoaderFactory.h"
|
|
|
|
#include "nsIDOMWindow.h"
|
|
|
|
#include "nsIEditingSession.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -206,6 +215,7 @@
|
2023-11-14 10:18:18 -08:00
|
|
|
#include "nsGlobalWindowInner.h"
|
|
|
|
#include "nsGlobalWindowOuter.h"
|
2020-03-30 15:05:46 -07:00
|
|
|
#include "nsJSEnvironment.h"
|
|
|
|
+#include "nsJSUtils.h"
|
|
|
|
#include "nsNetCID.h"
|
|
|
|
#include "nsNetUtil.h"
|
|
|
|
#include "nsObjectLoadingContent.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -346,6 +356,13 @@ nsDocShell::nsDocShell(BrowsingContext* aBrowsingContext,
|
2020-08-12 10:09:20 -07:00
|
|
|
mAllowDNSPrefetch(true),
|
2020-05-07 18:37:15 -07:00
|
|
|
mAllowWindowControl(true),
|
2019-11-25 13:56:39 -08:00
|
|
|
mCSSErrorReportingEnabled(false),
|
|
|
|
+ mFileInputInterceptionEnabled(false),
|
2020-04-15 14:41:18 -07:00
|
|
|
+ mOverrideHasFocus(false),
|
2019-11-25 15:26:03 -08:00
|
|
|
+ mBypassCSPEnabled(false),
|
2020-11-05 17:53:22 -08:00
|
|
|
+ mForceActiveState(false),
|
2023-01-23 11:29:48 -08:00
|
|
|
+ mDisallowBFCache(false),
|
2021-05-18 21:23:12 +02:00
|
|
|
+ mReducedMotionOverride(REDUCED_MOTION_OVERRIDE_NONE),
|
2021-06-08 16:00:15 -07:00
|
|
|
+ mForcedColorsOverride(FORCED_COLORS_OVERRIDE_NO_OVERRIDE),
|
2019-11-25 13:56:39 -08:00
|
|
|
mAllowAuth(mItemType == typeContent),
|
|
|
|
mAllowKeywordFixup(false),
|
2021-04-01 18:49:01 -05:00
|
|
|
mDisableMetaRefreshWhenInactive(false),
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -3147,6 +3164,214 @@ nsDocShell::GetMessageManager(ContentFrameMessageManager** aMessageManager) {
|
2019-11-25 13:56:39 -08:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2020-03-22 13:51:49 -07:00
|
|
|
+// =============== Juggler Begin =======================
|
|
|
|
+
|
2019-11-25 13:56:39 -08:00
|
|
|
+nsDocShell* nsDocShell::GetRootDocShell() {
|
|
|
|
+ nsCOMPtr<nsIDocShellTreeItem> rootAsItem;
|
|
|
|
+ GetInProcessSameTypeRootTreeItem(getter_AddRefs(rootAsItem));
|
|
|
|
+ nsCOMPtr<nsIDocShell> rootShell = do_QueryInterface(rootAsItem);
|
|
|
|
+ return nsDocShell::Cast(rootShell);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
2019-11-25 15:26:03 -08:00
|
|
|
+nsDocShell::GetBypassCSPEnabled(bool* aEnabled) {
|
|
|
|
+ MOZ_ASSERT(aEnabled);
|
|
|
|
+ *aEnabled = mBypassCSPEnabled;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::SetBypassCSPEnabled(bool aEnabled) {
|
|
|
|
+ mBypassCSPEnabled = aEnabled;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
2020-11-05 17:53:22 -08:00
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::GetForceActiveState(bool* aEnabled) {
|
|
|
|
+ MOZ_ASSERT(aEnabled);
|
|
|
|
+ *aEnabled = mForceActiveState;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::SetForceActiveState(bool aEnabled) {
|
|
|
|
+ mForceActiveState = aEnabled;
|
2020-12-14 15:28:48 -08:00
|
|
|
+ ActivenessMaybeChanged();
|
2020-11-05 17:53:22 -08:00
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
2023-01-23 11:29:48 -08:00
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::GetDisallowBFCache(bool* aEnabled) {
|
|
|
|
+ MOZ_ASSERT(aEnabled);
|
|
|
|
+ *aEnabled = mDisallowBFCache;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::SetDisallowBFCache(bool aEnabled) {
|
|
|
|
+ mDisallowBFCache = aEnabled;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
2019-11-25 15:26:03 -08:00
|
|
|
+bool nsDocShell::IsBypassCSPEnabled() {
|
|
|
|
+ return GetRootDocShell()->mBypassCSPEnabled;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
2020-04-15 14:41:18 -07:00
|
|
|
+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
|
2020-03-20 17:03:20 -07:00
|
|
|
+nsDocShell::GetLanguageOverride(nsAString& aLanguageOverride) {
|
2020-03-22 13:51:49 -07:00
|
|
|
+ aLanguageOverride = GetRootDocShell()->mLanguageOverride;
|
2020-03-20 17:03:20 -07:00
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
2020-03-26 16:33:07 -07:00
|
|
|
+
|
|
|
|
+static void SetIcuLocale(const nsAString& aLanguageOverride) {
|
|
|
|
+ icu::Locale locale(NS_LossyConvertUTF16toASCII(aLanguageOverride).get());
|
2024-01-13 00:19:49 +01:00
|
|
|
+ if (icu::Locale::getDefault() != locale) {
|
|
|
|
+ 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());
|
|
|
|
+ }
|
2020-03-26 16:33:07 -07:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ AutoJSAPI jsapi;
|
|
|
|
+ jsapi.Init();
|
|
|
|
+ JSContext* cx = jsapi.cx();
|
|
|
|
+ JS_ResetDefaultLocale(JS_GetRuntime(cx));
|
|
|
|
+
|
|
|
|
+ ResetDefaultLocaleInAllWorkers();
|
|
|
|
+}
|
|
|
|
+
|
2020-03-20 17:03:20 -07:00
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::SetLanguageOverride(const nsAString& aLanguageOverride) {
|
|
|
|
+ mLanguageOverride = aLanguageOverride;
|
2020-03-26 16:33:07 -07:00
|
|
|
+ SetIcuLocale(aLanguageOverride);
|
2020-03-20 17:03:20 -07:00
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
2020-04-01 14:10:30 -07:00
|
|
|
+nsDocShell::OverrideTimezone(const nsAString& aTimezoneOverride,
|
|
|
|
+ bool* aSuccess) {
|
2020-03-30 15:05:46 -07:00
|
|
|
+ NS_ENSURE_ARG(aSuccess);
|
2020-04-01 14:10:30 -07:00
|
|
|
+ NS_LossyConvertUTF16toASCII timeZoneId(aTimezoneOverride);
|
|
|
|
+ *aSuccess = nsJSUtils::SetTimeZoneOverride(timeZoneId.get());
|
2020-03-30 15:05:46 -07:00
|
|
|
+
|
2020-04-01 14:10:30 -07:00
|
|
|
+ // Set TZ which affects localtime_s().
|
2020-03-30 15:05:46 -07:00
|
|
|
+ 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) {
|
2020-04-01 14:10:30 -07:00
|
|
|
+ *aSuccess = setTimeZoneEnv(timeZoneId.get());
|
|
|
|
+ if (!*aSuccess) {
|
|
|
|
+ fprintf(stderr, "Failed to set 'TZ' to '%s'\n", timeZoneId.get());
|
|
|
|
+ }
|
2020-03-30 15:05:46 -07:00
|
|
|
+ }
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
2019-11-25 13:56:39 -08:00
|
|
|
+nsDocShell::GetFileInputInterceptionEnabled(bool* aEnabled) {
|
|
|
|
+ MOZ_ASSERT(aEnabled);
|
2020-03-22 13:51:49 -07:00
|
|
|
+ *aEnabled = GetRootDocShell()->mFileInputInterceptionEnabled;
|
2019-11-25 13:56:39 -08:00
|
|
|
+ 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);
|
|
|
|
+}
|
2020-03-20 11:14:42 -07:00
|
|
|
+
|
2020-03-22 13:51:49 -07:00
|
|
|
+RefPtr<nsGeolocationService> nsDocShell::GetGeolocationServiceOverride() {
|
|
|
|
+ return GetRootDocShell()->mGeolocationServiceOverride;
|
2020-03-20 11:14:42 -07:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDocShell::SetGeolocationOverride(nsIDOMGeoPosition* aGeolocationOverride) {
|
|
|
|
+ if (aGeolocationOverride) {
|
2020-03-22 13:51:49 -07:00
|
|
|
+ if (!mGeolocationServiceOverride) {
|
|
|
|
+ mGeolocationServiceOverride = new nsGeolocationService();
|
|
|
|
+ mGeolocationServiceOverride->Init();
|
2020-03-20 11:14:42 -07:00
|
|
|
+ }
|
2020-03-22 13:51:49 -07:00
|
|
|
+ mGeolocationServiceOverride->Update(aGeolocationOverride);
|
2020-03-20 11:14:42 -07:00
|
|
|
+ } else {
|
2020-03-22 13:51:49 -07:00
|
|
|
+ mGeolocationServiceOverride = nullptr;
|
2020-03-20 11:14:42 -07:00
|
|
|
+ }
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
2020-03-22 13:51:49 -07:00
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
2021-05-18 21:23:12 +02: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-08 16:00:15 -07: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;
|
|
|
|
+}
|
|
|
|
+
|
2020-03-22 13:51:49 -07:00
|
|
|
+// =============== Juggler End =======================
|
2019-11-25 13:56:39 -08:00
|
|
|
+
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDocShell::GetIsNavigating(bool* aOut) {
|
|
|
|
*aOut = mIsNavigating;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -4835,7 +5060,7 @@ nsDocShell::GetVisibility(bool* aVisibility) {
|
2020-12-14 15:28:48 -08:00
|
|
|
}
|
2020-11-05 17:53:22 -08:00
|
|
|
|
2020-12-14 15:28:48 -08:00
|
|
|
void nsDocShell::ActivenessMaybeChanged() {
|
2021-08-11 03:37:57 +03:00
|
|
|
- const bool isActive = mBrowsingContext->IsActive();
|
|
|
|
+ const bool isActive = mForceActiveState || mBrowsingContext->IsActive();
|
2020-12-14 15:28:48 -08:00
|
|
|
if (RefPtr<PresShell> presShell = GetPresShell()) {
|
2021-08-11 03:37:57 +03:00
|
|
|
presShell->ActivenessMaybeChanged();
|
2020-12-14 15:28:48 -08:00
|
|
|
}
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -6753,6 +6978,10 @@ bool nsDocShell::CanSavePresentation(uint32_t aLoadType,
|
2023-01-23 11:29:48 -08:00
|
|
|
return false; // no entry to save into
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (mDisallowBFCache) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
MOZ_ASSERT(!mozilla::SessionHistoryInParent(),
|
|
|
|
"mOSHE cannot be non-null with SHIP");
|
|
|
|
nsCOMPtr<nsIContentViewer> viewer = mOSHE->GetContentViewer();
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -8536,6 +8765,12 @@ nsresult nsDocShell::PerformRetargeting(nsDocShellLoadState* aLoadState) {
|
2020-04-15 12:02:08 -07: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;
|
|
|
|
}
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -9611,6 +9846,16 @@ nsresult nsDocShell::InternalLoad(nsDocShellLoadState* aLoadState,
|
2023-03-21 01:23:12 +00:00
|
|
|
nsINetworkPredictor::PREDICT_LOAD, attrs, nullptr);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIRequest> req;
|
|
|
|
+
|
|
|
|
+ // Juggler: report navigation started for non-same-document and non-javascript
|
|
|
|
+ // navigations.
|
|
|
|
+ if (!isJavaScript && !sameDocument) {
|
|
|
|
+ nsCOMPtr<nsIObserverService> observerService =
|
|
|
|
+ mozilla::services::GetObserverService();
|
|
|
|
+ if (observerService) {
|
2023-06-06 15:08:23 -07:00
|
|
|
+ observerService->NotifyObservers(GetAsSupports(this), "juggler-navigation-started-renderer", NS_ConvertASCIItoUTF16(nsPrintfCString("%" PRIu64, aLoadState->GetLoadIdentifier())).get());
|
2023-03-21 01:23:12 +00:00
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
rv = DoURILoad(aLoadState, aCacheKey, getter_AddRefs(req));
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -12768,6 +13013,9 @@ class OnLinkClickEvent : public Runnable {
|
2020-08-06 10:32:50 -07:00
|
|
|
mHandler->OnLinkClickSync(mContent, mLoadState, mNoOpenerImplied,
|
|
|
|
mTriggeringPrincipal);
|
2020-03-05 11:59:29 -08:00
|
|
|
}
|
|
|
|
+ nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
|
|
|
+ observerService->NotifyObservers(ToSupports(mContent), "juggler-link-click-sync", nullptr);
|
|
|
|
+
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -12852,6 +13100,8 @@ nsresult nsDocShell::OnLinkClick(
|
2020-08-06 10:32:50 -07:00
|
|
|
nsCOMPtr<nsIRunnable> ev =
|
|
|
|
new OnLinkClickEvent(this, aContent, loadState, noOpenerImplied,
|
|
|
|
aIsTrusted, aTriggeringPrincipal);
|
2020-03-05 11:59:29 -08:00
|
|
|
+ nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService();
|
|
|
|
+ observerService->NotifyObservers(ToSupports(aContent), "juggler-link-click", nullptr);
|
2024-02-22 13:17:33 -08:00
|
|
|
return Dispatch(ev.forget());
|
2020-03-05 11:59:29 -08:00
|
|
|
}
|
|
|
|
|
2019-11-25 13:56:39 -08:00
|
|
|
diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 237cf8dc1a54ed8d0523272aaaebfd6f10f9213f..73c096a2850850921aff97037457cde598ffef2a 100644
|
2019-11-25 13:56:39 -08:00
|
|
|
--- a/docshell/base/nsDocShell.h
|
|
|
|
+++ b/docshell/base/nsDocShell.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -15,6 +15,7 @@
|
2020-03-06 18:25:27 -08:00
|
|
|
#include "mozilla/UniquePtr.h"
|
2019-11-25 13:56:39 -08:00
|
|
|
#include "mozilla/WeakPtr.h"
|
|
|
|
#include "mozilla/dom/BrowsingContext.h"
|
|
|
|
+#include "mozilla/dom/Element.h"
|
2020-03-06 18:25:27 -08:00
|
|
|
#include "mozilla/dom/WindowProxyHolder.h"
|
2020-12-14 15:28:48 -08:00
|
|
|
#include "nsCOMPtr.h"
|
|
|
|
#include "nsCharsetSource.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -76,6 +77,7 @@ class nsCommandManager;
|
2020-12-14 15:28:48 -08:00
|
|
|
class nsDocShellEditorData;
|
|
|
|
class nsDOMNavigationTiming;
|
|
|
|
class nsDSURIContentListener;
|
|
|
|
+class nsGeolocationService;
|
|
|
|
class nsGlobalWindowOuter;
|
|
|
|
|
|
|
|
class FramingChecker;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -408,6 +410,15 @@ class nsDocShell final : public nsDocLoader,
|
2020-03-24 23:25:17 -07:00
|
|
|
void SetWillChangeProcess() { mWillChangeProcess = true; }
|
2020-10-07 14:12:19 -07:00
|
|
|
bool WillChangeProcess() { return mWillChangeProcess; }
|
2019-11-25 13:56:39 -08:00
|
|
|
|
|
|
|
+ bool IsFileInputInterceptionEnabled();
|
|
|
|
+ void FilePickerShown(mozilla::dom::Element* element);
|
2019-11-25 15:26:03 -08:00
|
|
|
+
|
2020-04-15 14:41:18 -07:00
|
|
|
+ bool ShouldOverrideHasFocus() const;
|
|
|
|
+
|
2019-11-25 15:26:03 -08:00
|
|
|
+ bool IsBypassCSPEnabled();
|
2020-03-20 11:14:42 -07:00
|
|
|
+
|
2020-03-22 13:51:49 -07:00
|
|
|
+ RefPtr<nsGeolocationService> GetGeolocationServiceOverride();
|
2019-11-25 13:56:39 -08:00
|
|
|
+
|
|
|
|
// Create a content viewer within this nsDocShell for the given
|
|
|
|
// `WindowGlobalChild` actor.
|
|
|
|
nsresult CreateContentViewerForActor(
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1010,6 +1021,8 @@ class nsDocShell final : public nsDocLoader,
|
2019-11-25 13:56:39 -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
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1300,6 +1313,16 @@ class nsDocShell final : public nsDocLoader,
|
2020-08-12 10:09:20 -07:00
|
|
|
bool mAllowDNSPrefetch : 1;
|
2020-05-07 18:37:15 -07:00
|
|
|
bool mAllowWindowControl : 1;
|
2019-11-25 13:56:39 -08:00
|
|
|
bool mCSSErrorReportingEnabled : 1;
|
|
|
|
+ bool mFileInputInterceptionEnabled: 1;
|
2020-04-15 14:41:18 -07:00
|
|
|
+ bool mOverrideHasFocus : 1;
|
2019-11-25 15:26:03 -08:00
|
|
|
+ bool mBypassCSPEnabled : 1;
|
2020-11-05 17:53:22 -08:00
|
|
|
+ bool mForceActiveState : 1;
|
2023-01-23 11:29:48 -08:00
|
|
|
+ bool mDisallowBFCache : 1;
|
2020-03-20 17:03:20 -07:00
|
|
|
+ nsString mLanguageOverride;
|
2020-03-22 13:51:49 -07:00
|
|
|
+ RefPtr<nsGeolocationService> mGeolocationServiceOverride;
|
2021-05-18 21:23:12 +02:00
|
|
|
+ ReducedMotionOverride mReducedMotionOverride;
|
2021-06-08 16:00:15 -07:00
|
|
|
+ ForcedColorsOverride mForcedColorsOverride;
|
2020-03-22 13:51:49 -07:00
|
|
|
+
|
2019-11-25 13:56:39 -08:00
|
|
|
bool mAllowAuth : 1;
|
|
|
|
bool mAllowKeywordFixup : 1;
|
2021-04-01 18:49:01 -05:00
|
|
|
bool mDisableMetaRefreshWhenInactive : 1;
|
2019-11-25 13:56:39 -08:00
|
|
|
diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl
|
2024-02-22 13:17:33 -08:00
|
|
|
index a3ee2c3944018c64c93c02c5658c527ec5f9d2cb..272e5147568b95bf313ac7a940619382a0c42763 100644
|
2019-11-25 13:56:39 -08:00
|
|
|
--- a/docshell/base/nsIDocShell.idl
|
|
|
|
+++ b/docshell/base/nsIDocShell.idl
|
2020-03-20 11:14:42 -07:00
|
|
|
@@ -44,6 +44,7 @@ interface nsIURI;
|
|
|
|
interface nsIChannel;
|
|
|
|
interface nsIContentViewer;
|
|
|
|
interface nsIContentSecurityPolicy;
|
|
|
|
+interface nsIDOMGeoPosition;
|
|
|
|
interface nsIEditor;
|
|
|
|
interface nsIEditingSession;
|
2021-04-01 18:49:01 -05:00
|
|
|
interface nsIInputStream;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -760,6 +761,36 @@ interface nsIDocShell : nsIDocShellTreeItem
|
2019-11-25 13:56:39 -08:00
|
|
|
*/
|
2020-01-11 01:20:39 +01:00
|
|
|
void synchronizeLayoutHistoryState();
|
2020-05-07 18:37:15 -07:00
|
|
|
|
2019-11-25 13:56:39 -08:00
|
|
|
+ attribute boolean fileInputInterceptionEnabled;
|
2019-11-25 15:26:03 -08:00
|
|
|
+
|
2020-04-15 14:41:18 -07:00
|
|
|
+ attribute boolean overrideHasFocus;
|
|
|
|
+
|
2019-11-25 15:26:03 -08:00
|
|
|
+ attribute boolean bypassCSPEnabled;
|
2020-03-20 11:14:42 -07:00
|
|
|
+
|
2020-11-05 17:53:22 -08:00
|
|
|
+ attribute boolean forceActiveState;
|
|
|
|
+
|
2023-01-23 11:29:48 -08:00
|
|
|
+ attribute boolean disallowBFCache;
|
|
|
|
+
|
2020-03-20 17:03:20 -07:00
|
|
|
+ attribute AString languageOverride;
|
|
|
|
+
|
2020-03-30 15:05:46 -07:00
|
|
|
+ boolean overrideTimezone(in AString timezoneId);
|
|
|
|
+
|
2021-05-18 21:23:12 +02: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-08 16:00:15 -07: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;
|
|
|
|
+
|
2020-03-20 11:14:42 -07:00
|
|
|
+ void setGeolocationOverride(in nsIDOMGeoPosition position);
|
2020-05-07 18:37:15 -07:00
|
|
|
+
|
|
|
|
/**
|
|
|
|
* This attempts to save any applicable layout history state (like
|
|
|
|
* scroll position) in the nsISHEntry. This is normally done
|
2019-11-25 15:26:03 -08:00
|
|
|
diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index ff78b31699fe28e60915703b7642a72d540f6f99..dd8f4dd0283e3d0ce1b5ae8745312fcb64126c75 100644
|
2019-11-25 15:26:03 -08:00
|
|
|
--- a/dom/base/Document.cpp
|
|
|
|
+++ b/dom/base/Document.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -3682,6 +3682,9 @@ void Document::SendToConsole(nsCOMArray<nsISecurityConsoleMessage>& aMessages) {
|
2019-11-25 15:26:03 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void Document::ApplySettingsFromCSP(bool aSpeculative) {
|
|
|
|
+ if (mDocumentContainer && mDocumentContainer->IsBypassCSPEnabled())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
nsresult rv = NS_OK;
|
|
|
|
if (!aSpeculative) {
|
|
|
|
// 1) apply settings from regular CSP
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -3739,6 +3742,11 @@ nsresult Document::InitCSP(nsIChannel* aChannel) {
|
2022-05-02 21:46:05 -06:00
|
|
|
MOZ_ASSERT(!mScriptGlobalObject,
|
|
|
|
"CSP must be initialized before mScriptGlobalObject is set!");
|
2019-11-25 15:26:03 -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;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -4534,6 +4542,10 @@ bool Document::HasFocus(ErrorResult& rv) const {
|
2020-04-15 14:41:18 -07:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (IsActive() && mDocumentContainer->ShouldOverrideHasFocus()) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
2021-08-11 03:37:57 +03:00
|
|
|
if (!fm->IsInActiveWindow(bc)) {
|
|
|
|
return false;
|
|
|
|
}
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -18736,6 +18748,68 @@ ColorScheme Document::PreferredColorScheme(IgnoreRFP aIgnoreRFP) const {
|
|
|
|
return PreferenceSheet::PrefsFor(*this).mColorScheme;
|
2021-05-18 21:23:12 +02: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;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return LookAndFeel::GetInt(LookAndFeel::IntID::PrefersReducedMotion, 0) == 1;
|
|
|
|
+}
|
2021-06-08 16:00:15 -07: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-18 21:23:12 +02:00
|
|
|
+
|
2021-12-07 11:53:17 -08:00
|
|
|
bool Document::HasRecentlyStartedForegroundLoads() {
|
|
|
|
if (!sLoadingForegroundTopLevelContentDocument) {
|
|
|
|
return false;
|
2021-05-18 21:23:12 +02:00
|
|
|
diff --git a/dom/base/Document.h b/dom/base/Document.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 55e4f71d5b33cca55454ac0d4e16d4a96137a616..8ad7117047ee6d0b5de2538cd086d60ae9837594 100644
|
2021-05-18 21:23:12 +02:00
|
|
|
--- a/dom/base/Document.h
|
|
|
|
+++ b/dom/base/Document.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -4030,6 +4030,9 @@ class Document : public nsINode,
|
2021-12-07 11:53:17 -08:00
|
|
|
// color-scheme meta tag.
|
|
|
|
ColorScheme DefaultColorScheme() const;
|
2021-05-18 21:23:12 +02:00
|
|
|
|
|
|
|
+ bool PrefersReducedMotion() const;
|
2021-06-08 16:00:15 -07:00
|
|
|
+ bool ForcedColors() const;
|
2021-05-18 21:23:12 +02:00
|
|
|
+
|
2021-12-07 11:53:17 -08:00
|
|
|
static bool HasRecentlyStartedForegroundLoads();
|
|
|
|
|
|
|
|
static bool AutomaticStorageAccessPermissionCanBeGranted(
|
2020-03-20 17:03:20 -07:00
|
|
|
diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 7e54ac18ad9a646e981e7bc356e75de273c75845..1e673db0fd8adc9a4096a826184425e939d5e926 100644
|
2020-03-20 17:03:20 -07:00
|
|
|
--- a/dom/base/Navigator.cpp
|
|
|
|
+++ b/dom/base/Navigator.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -331,14 +331,18 @@ void Navigator::GetAppName(nsAString& aAppName) const {
|
2020-05-07 18:37:15 -07:00
|
|
|
* for more detail.
|
2020-03-20 17:03:20 -07:00
|
|
|
*/
|
|
|
|
/* 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.
|
2021-02-01 15:50:11 -08:00
|
|
|
for (nsDependentSubstring lang :
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -390,7 +394,13 @@ void Navigator::GetLanguage(nsAString& aLanguage) {
|
2020-03-20 17:03:20 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void Navigator::GetLanguages(nsTArray<nsString>& aLanguages) {
|
|
|
|
- GetAcceptLanguages(aLanguages);
|
2022-06-29 13:47:45 -07:00
|
|
|
+ if (mWindow && mWindow->GetDocShell()) {
|
|
|
|
+ nsString languageOverride;
|
|
|
|
+ mWindow->GetDocShell()->GetLanguageOverride(languageOverride);
|
|
|
|
+ GetAcceptLanguages(&languageOverride, aLanguages);
|
|
|
|
+ } else {
|
|
|
|
+ GetAcceptLanguages(nullptr, aLanguages);
|
|
|
|
+ }
|
2020-03-20 17:03:20 -07:00
|
|
|
|
2020-05-07 18:37:15 -07:00
|
|
|
// The returned value is cached by the binding code. The window listens to the
|
2020-03-20 17:03:20 -07:00
|
|
|
// accept languages change and will clear the cache when needed. It has to
|
|
|
|
diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 851b681570e35ba86341f56912684bc8ec7001f3..2fd4d6fd9deafaa42604428dc17798142ce77e19 100644
|
2020-03-20 17:03:20 -07:00
|
|
|
--- a/dom/base/Navigator.h
|
|
|
|
+++ b/dom/base/Navigator.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -214,7 +214,7 @@ class Navigator final : public nsISupports, public nsWrapperCache {
|
2020-03-20 17:03:20 -07:00
|
|
|
|
|
|
|
StorageManager* Storage();
|
|
|
|
|
|
|
|
- static void GetAcceptLanguages(nsTArray<nsString>& aLanguages);
|
|
|
|
+ static void GetAcceptLanguages(const nsString* aLanguageOverride, nsTArray<nsString>& aLanguages);
|
|
|
|
|
|
|
|
dom::MediaCapabilities* MediaCapabilities();
|
|
|
|
dom::MediaSession* MediaSession();
|
2020-10-13 12:24:11 -07:00
|
|
|
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index a5fee753ce551826e5b974ca01aff1f541754f6b..f1a80d1bb25175c12345acbc27b82d96793e061d 100644
|
2020-10-13 12:24:11 -07:00
|
|
|
--- a/dom/base/nsContentUtils.cpp
|
|
|
|
+++ b/dom/base/nsContentUtils.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -8598,7 +8598,8 @@ nsresult nsContentUtils::SendMouseEvent(
|
2020-10-13 12:24:11 -07:00
|
|
|
bool aIgnoreRootScrollFrame, float aPressure,
|
|
|
|
unsigned short aInputSourceArg, uint32_t aIdentifier, bool aToWindow,
|
2021-08-11 03:37:57 +03:00
|
|
|
PreventDefaultResult* aPreventDefault, bool aIsDOMEventSynthesized,
|
2020-10-13 12:24:11 -07:00
|
|
|
- bool aIsWidgetEventSynthesized) {
|
|
|
|
+ bool aIsWidgetEventSynthesized,
|
2023-06-06 15:08:23 -07:00
|
|
|
+ bool convertToPointer, uint32_t aJugglerEventId) {
|
2020-10-13 12:24:11 -07:00
|
|
|
nsPoint offset;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget(aPresShell, &offset);
|
|
|
|
if (!widget) return NS_ERROR_FAILURE;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -8606,6 +8607,7 @@ nsresult nsContentUtils::SendMouseEvent(
|
2023-01-23 11:29:48 -08:00
|
|
|
EventMessage msg;
|
|
|
|
Maybe<WidgetMouseEvent::ExitFrom> exitFrom;
|
|
|
|
bool contextMenuKey = false;
|
|
|
|
+ bool isDragEvent = false;
|
|
|
|
if (aType.EqualsLiteral("mousedown")) {
|
|
|
|
msg = eMouseDown;
|
|
|
|
} else if (aType.EqualsLiteral("mouseup")) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -8630,6 +8632,12 @@ nsresult nsContentUtils::SendMouseEvent(
|
2023-01-23 11:29:48 -08:00
|
|
|
msg = eMouseHitTest;
|
|
|
|
} else if (aType.EqualsLiteral("MozMouseExploreByTouch")) {
|
|
|
|
msg = eMouseExploreByTouch;
|
|
|
|
+ } else if (aType.EqualsLiteral("dragover")) {
|
|
|
|
+ msg = eDragOver;
|
|
|
|
+ isDragEvent = true;
|
|
|
|
+ } else if (aType.EqualsLiteral("drop")) {
|
|
|
|
+ msg = eDrop;
|
|
|
|
+ isDragEvent = true;
|
|
|
|
} else {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -8638,12 +8646,21 @@ nsresult nsContentUtils::SendMouseEvent(
|
2023-01-23 11:29:48 -08:00
|
|
|
aInputSourceArg = MouseEvent_Binding::MOZ_SOURCE_MOUSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
- WidgetMouseEvent event(true, msg, widget,
|
|
|
|
+ std::unique_ptr<WidgetMouseEvent> eventOwner;
|
|
|
|
+ if (isDragEvent) {
|
|
|
|
+ eventOwner.reset(new WidgetDragEvent(true, msg, widget));
|
|
|
|
+ eventOwner->mReason = aIsWidgetEventSynthesized
|
|
|
|
+ ? WidgetMouseEvent::eSynthesized
|
|
|
|
+ : WidgetMouseEvent::eReal;
|
|
|
|
+ } else {
|
|
|
|
+ eventOwner.reset(new WidgetMouseEvent(true, msg, widget,
|
|
|
|
aIsWidgetEventSynthesized
|
|
|
|
? WidgetMouseEvent::eSynthesized
|
|
|
|
: WidgetMouseEvent::eReal,
|
|
|
|
contextMenuKey ? WidgetMouseEvent::eContextMenuKey
|
|
|
|
- : WidgetMouseEvent::eNormal);
|
|
|
|
+ : WidgetMouseEvent::eNormal));
|
|
|
|
+ }
|
|
|
|
+ WidgetMouseEvent& event = *eventOwner.get();
|
|
|
|
event.pointerId = aIdentifier;
|
|
|
|
event.mModifiers = GetWidgetModifiers(aModifiers);
|
|
|
|
event.mButton = aButton;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -8654,8 +8671,10 @@ nsresult nsContentUtils::SendMouseEvent(
|
2023-06-06 15:08:23 -07:00
|
|
|
event.mPressure = aPressure;
|
|
|
|
event.mInputSource = aInputSourceArg;
|
2023-04-24 21:28:08 +00:00
|
|
|
event.mClickCount = aClickCount;
|
2023-06-06 15:08:23 -07:00
|
|
|
+ event.mJugglerEventId = aJugglerEventId;
|
2020-10-13 12:24:11 -07:00
|
|
|
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
|
2024-02-22 13:17:33 -08:00
|
|
|
index 36c1a4f4eeba0fa75d79715f79de0d705719e5c5..6ad5426612ef37d7326bafd771a4c2d6d9142cb5 100644
|
2020-10-13 12:24:11 -07:00
|
|
|
--- a/dom/base/nsContentUtils.h
|
|
|
|
+++ b/dom/base/nsContentUtils.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -2963,7 +2963,8 @@ class nsContentUtils {
|
2020-10-13 12:24:11 -07:00
|
|
|
int32_t aModifiers, bool aIgnoreRootScrollFrame, float aPressure,
|
|
|
|
unsigned short aInputSourceArg, uint32_t aIdentifier, bool aToWindow,
|
2021-08-11 03:37:57 +03:00
|
|
|
mozilla::PreventDefaultResult* aPreventDefault,
|
|
|
|
- bool aIsDOMEventSynthesized, bool aIsWidgetEventSynthesized);
|
|
|
|
+ bool aIsDOMEventSynthesized, bool aIsWidgetEventSynthesized,
|
2023-06-06 15:08:23 -07:00
|
|
|
+ bool convertToPointer = true, uint32_t aJugglerEventId = 0);
|
2020-10-13 12:24:11 -07:00
|
|
|
|
|
|
|
static void FirePageShowEventForFrameLoaderSwap(
|
|
|
|
nsIDocShellTreeItem* aItem,
|
|
|
|
diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp
|
2024-01-13 00:19:49 +01:00
|
|
|
index e6762018cce8e4c8691703ed15ea29e709f31cf2..4d0b679c4700e8fe18408a186b7e4d512a71dc30 100644
|
2020-10-13 12:24:11 -07:00
|
|
|
--- a/dom/base/nsDOMWindowUtils.cpp
|
|
|
|
+++ b/dom/base/nsDOMWindowUtils.cpp
|
2023-08-10 14:41:33 -07:00
|
|
|
@@ -684,6 +684,26 @@ nsDOMWindowUtils::GetPresShellId(uint32_t* aPresShellId) {
|
2023-06-06 15:08:23 -07:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static uint32_t sJugglerEventId = 1000;
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+nsDOMWindowUtils::JugglerSendMouseEvent(
|
|
|
|
+ const nsAString& aType, float aX, float aY, int32_t aButton,
|
|
|
|
+ int32_t aClickCount, int32_t aModifiers, bool aIgnoreRootScrollFrame,
|
|
|
|
+ float aPressure, unsigned short aInputSourceArg,
|
|
|
|
+ bool aIsDOMEventSynthesized, bool aIsWidgetEventSynthesized,
|
|
|
|
+ int32_t aButtons, uint32_t aIdentifier, bool aDisablePointerEvent,
|
|
|
|
+ uint32_t* aJugglerEventId) {
|
|
|
|
+ *aJugglerEventId = ++sJugglerEventId;
|
|
|
|
+ return SendMouseEventCommon(
|
|
|
|
+ aType, aX, aY, aButton, aClickCount, aModifiers, aIgnoreRootScrollFrame,
|
|
|
|
+ aPressure, aInputSourceArg,
|
|
|
|
+ aIdentifier, false,
|
|
|
|
+ nullptr, aIsDOMEventSynthesized,
|
|
|
|
+ aIsWidgetEventSynthesized,
|
|
|
|
+ aButtons, !aDisablePointerEvent, *aJugglerEventId);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendMouseEvent(
|
|
|
|
const nsAString& aType, float aX, float aY, int32_t aButton,
|
2023-08-10 14:41:33 -07:00
|
|
|
@@ -698,7 +718,7 @@ nsDOMWindowUtils::SendMouseEvent(
|
2020-10-13 12:24:11 -07: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);
|
2023-06-06 15:08:23 -07:00
|
|
|
+ aOptionalArgCount >= 6 ? aButtons : MOUSE_BUTTONS_NOT_SPECIFIED, true, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2023-08-10 14:41:33 -07:00
|
|
|
@@ -716,7 +736,7 @@ nsDOMWindowUtils::SendMouseEventToWindow(
|
2023-06-06 15:08:23 -07:00
|
|
|
aOptionalArgCount >= 7 ? aIdentifier : DEFAULT_MOUSE_POINTER_ID, true,
|
|
|
|
nullptr, aOptionalArgCount >= 4 ? aIsDOMEventSynthesized : true,
|
|
|
|
aOptionalArgCount >= 5 ? aIsWidgetEventSynthesized : false,
|
|
|
|
- aOptionalArgCount >= 6 ? aButtons : MOUSE_BUTTONS_NOT_SPECIFIED);
|
|
|
|
+ aOptionalArgCount >= 6 ? aButtons : MOUSE_BUTTONS_NOT_SPECIFIED, 0);
|
2020-10-13 12:24:11 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2023-08-10 14:41:33 -07:00
|
|
|
@@ -725,13 +745,13 @@ nsDOMWindowUtils::SendMouseEventCommon(
|
2020-10-13 12:24:11 -07: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) {
|
2023-06-06 15:08:23 -07:00
|
|
|
+ bool aIsWidgetEventSynthesized, int32_t aButtons, bool aConvertToPointer, uint32_t aJugglerEventId) {
|
2020-10-13 12:24:11 -07:00
|
|
|
RefPtr<PresShell> presShell = GetPresShell();
|
2021-08-11 03:37:57 +03:00
|
|
|
PreventDefaultResult preventDefaultResult;
|
|
|
|
nsresult rv = nsContentUtils::SendMouseEvent(
|
2020-10-13 12:24:11 -07:00
|
|
|
presShell, aType, aX, aY, aButton, aButtons, aClickCount, aModifiers,
|
|
|
|
aIgnoreRootScrollFrame, aPressure, aInputSourceArg, aPointerId, aToWindow,
|
2021-08-11 03:37:57 +03:00
|
|
|
- &preventDefaultResult, aIsDOMEventSynthesized, aIsWidgetEventSynthesized);
|
2023-06-06 15:08:23 -07:00
|
|
|
+ &preventDefaultResult, aIsDOMEventSynthesized, aIsWidgetEventSynthesized, aConvertToPointer, aJugglerEventId);
|
2020-10-13 12:24:11 -07:00
|
|
|
|
2021-08-11 03:37:57 +03:00
|
|
|
if (aPreventDefault) {
|
|
|
|
*aPreventDefault = preventDefaultResult != PreventDefaultResult::No;
|
2020-10-13 12:24:11 -07:00
|
|
|
diff --git a/dom/base/nsDOMWindowUtils.h b/dom/base/nsDOMWindowUtils.h
|
2023-06-06 15:08:23 -07:00
|
|
|
index 63968c9b7a4e418e4c0de6e7a75fa215a36a9105..decf3ea3833ccdffd49a7aded2d600f9416e8306 100644
|
2020-10-13 12:24:11 -07: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);
|
2023-06-06 15:08:23 -07:00
|
|
|
+ bool aIsWidgetEventSynthesized, int32_t aButtons, bool aConvertToPointer = true, uint32_t aJugglerEventId = 0);
|
2020-10-13 12:24:11 -07:00
|
|
|
|
|
|
|
MOZ_CAN_RUN_SCRIPT
|
|
|
|
nsresult SendTouchEventCommon(
|
2020-07-20 16:47:27 -07:00
|
|
|
diff --git a/dom/base/nsFocusManager.cpp b/dom/base/nsFocusManager.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 0d9e4df42f7efcbb0068bc162dfbb17003cd3802..55c0e9e8cfa434c5b8c7dbd27651bf94d5b9a2d1 100644
|
2020-07-20 16:47:27 -07:00
|
|
|
--- a/dom/base/nsFocusManager.cpp
|
|
|
|
+++ b/dom/base/nsFocusManager.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1673,6 +1673,10 @@ Maybe<uint64_t> nsFocusManager::SetFocusInner(Element* aNewContent,
|
2020-10-16 01:28:13 -07: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() &&
|
2023-06-06 15:08:23 -07:00
|
|
|
!isElementInActiveWindow && (aFlags & FLAG_RAISE)) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -2946,7 +2950,9 @@ void nsFocusManager::RaiseWindow(nsPIDOMWindowOuter* aWindow,
|
2020-07-20 16:47:27 -07: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
|
2020-03-26 18:42:21 -07:00
|
|
|
diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 97d967175822e4f62079c21152f96e5540dbb98f..c5bf0d155649e6715aa3af6ca29c237b1dab6ead 100644
|
2020-03-26 18:42:21 -07:00
|
|
|
--- a/dom/base/nsGlobalWindowOuter.cpp
|
|
|
|
+++ b/dom/base/nsGlobalWindowOuter.cpp
|
2024-01-13 00:19:49 +01:00
|
|
|
@@ -2509,10 +2509,16 @@ nsresult nsGlobalWindowOuter::SetNewDocument(Document* aDocument,
|
2020-07-01 13:28:13 -07: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));
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -2632,6 +2638,19 @@ void nsGlobalWindowOuter::DispatchDOMWindowCreated() {
|
2020-07-01 13:28:13 -07: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);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
2020-10-28 14:47:14 -07:00
|
|
|
void nsGlobalWindowOuter::ClearStatus() { SetStatusOuter(u""_ns); }
|
2020-07-01 13:28:13 -07:00
|
|
|
|
|
|
|
void nsGlobalWindowOuter::SetDocShell(nsDocShell* aDocShell) {
|
|
|
|
diff --git a/dom/base/nsGlobalWindowOuter.h b/dom/base/nsGlobalWindowOuter.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 8337a7353fb8e97372f0b57bd0fd867506a9129f..e7dedd6d26125e481e1145337a0be6ab864c1e1b 100644
|
2020-07-01 13:28:13 -07:00
|
|
|
--- a/dom/base/nsGlobalWindowOuter.h
|
|
|
|
+++ b/dom/base/nsGlobalWindowOuter.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -315,6 +315,7 @@ class nsGlobalWindowOuter final : public mozilla::dom::EventTarget,
|
2020-07-01 13:28:13 -07:00
|
|
|
|
|
|
|
// Outer windows only.
|
|
|
|
void DispatchDOMWindowCreated();
|
|
|
|
+ void JugglerDispatchDOMWindowReused();
|
|
|
|
|
|
|
|
// Outer windows only.
|
|
|
|
virtual void EnsureSizeAndPositionUpToDate() override;
|
2020-04-13 11:31:02 -07:00
|
|
|
diff --git a/dom/base/nsINode.cpp b/dom/base/nsINode.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 369bb41fe459c8ef4c10c61c1530f52d51b3f6de..15ef3c6824cc70e756777612f0fd148e5678c795 100644
|
2020-04-13 11:31:02 -07:00
|
|
|
--- a/dom/base/nsINode.cpp
|
|
|
|
+++ b/dom/base/nsINode.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1359,6 +1359,61 @@ void nsINode::GetBoxQuadsFromWindowOrigin(const BoxQuadOptions& aOptions,
|
2020-04-13 11:31:02 -07:00
|
|
|
mozilla::GetBoxQuadsFromWindowOrigin(this, aOptions, aResult, aRv);
|
|
|
|
}
|
|
|
|
|
2022-08-01 14:40:23 -07: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;
|
|
|
|
+}
|
|
|
|
+
|
2020-04-13 11:31:02 -07: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) {
|
2020-06-16 21:38:32 -07:00
|
|
|
+ return aRv.ThrowNotFoundError("Node is detached from document");
|
2020-04-13 11:31:02 -07:00
|
|
|
+ }
|
|
|
|
+ PresShell* presShell = document->GetPresShell();
|
|
|
|
+ if (!presShell) {
|
2020-06-16 21:38:32 -07:00
|
|
|
+ return aRv.ThrowNotFoundError("Node is detached from document");
|
2020-04-13 11:31:02 -07:00
|
|
|
+ }
|
2022-08-01 14:40:23 -07:00
|
|
|
+ nsIFrame* primaryFrame = GetFirstFrame(this);
|
2020-06-16 21:38:32 -07:00
|
|
|
+ if (!primaryFrame) {
|
|
|
|
+ return aRv.ThrowNotFoundError("Node does not have a layout object");
|
2020-04-13 11:31:02 -07:00
|
|
|
+ }
|
2022-08-01 14:40:23 -07:00
|
|
|
+ aRv = NS_OK;
|
2020-04-13 11:31:02 -07: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));
|
|
|
|
+ }
|
2023-03-21 01:23:12 +00:00
|
|
|
+ presShell->ScrollFrameIntoView(
|
|
|
|
+ primaryFrame, Some(rect),
|
2023-06-06 15:08:23 -07:00
|
|
|
+ ScrollAxis(WhereToScroll::Center, WhenToScroll::IfNotFullyVisible),
|
|
|
|
+ ScrollAxis(WhereToScroll::Center, WhenToScroll::IfNotFullyVisible),
|
2020-04-13 11:31:02 -07:00
|
|
|
+ ScrollFlags::ScrollOverflowHidden);
|
2020-04-14 16:24:36 -07:00
|
|
|
+ // 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();
|
|
|
|
+ }
|
2020-04-13 11:31:02 -07:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
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
|
2024-02-22 13:17:33 -08:00
|
|
|
index 807deebaad78f531c59d18aac2c2833e38d13946..3754b573ef119854e2c41b51b0dd0a43d7c53315 100644
|
2020-04-13 11:31:02 -07:00
|
|
|
--- a/dom/base/nsINode.h
|
|
|
|
+++ b/dom/base/nsINode.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -2229,6 +2229,10 @@ class nsINode : public mozilla::dom::EventTarget {
|
2020-04-13 11:31:02 -07: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,
|
2020-04-01 14:10:30 -07:00
|
|
|
diff --git a/dom/base/nsJSUtils.cpp b/dom/base/nsJSUtils.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index bb280d9a15aed8b7d82a93214e82222e9b5a14ae..d64cd52877c1643148ce5912eec26bd1569acdac 100644
|
2020-04-01 14:10:30 -07:00
|
|
|
--- a/dom/base/nsJSUtils.cpp
|
|
|
|
+++ b/dom/base/nsJSUtils.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -177,6 +177,11 @@ bool nsJSUtils::GetScopeChainForElement(
|
2020-04-01 14:10:30 -07: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
|
2023-11-14 10:18:18 -08:00
|
|
|
index 36e906061588aab50dee129cc46dd2e4d3e153f8..c3591f98d4df19b166fc5c99332e559b1d499049 100644
|
2020-04-01 14:10:30 -07:00
|
|
|
--- a/dom/base/nsJSUtils.h
|
|
|
|
+++ b/dom/base/nsJSUtils.h
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -79,6 +79,7 @@ class nsJSUtils {
|
2020-04-01 14:10:30 -07: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-18 21:23:12 +02:00
|
|
|
diff --git a/dom/chrome-webidl/BrowsingContext.webidl b/dom/chrome-webidl/BrowsingContext.webidl
|
2024-02-22 13:17:33 -08:00
|
|
|
index 2e8abd50793dd1392a876e53e99ad806a256f755..695b9e8ffff846d663b645e3ca6fc83a39f6f126 100644
|
2021-05-18 21:23:12 +02:00
|
|
|
--- a/dom/chrome-webidl/BrowsingContext.webidl
|
|
|
|
+++ b/dom/chrome-webidl/BrowsingContext.webidl
|
2023-07-06 12:22:45 -07:00
|
|
|
@@ -53,6 +53,24 @@ enum PrefersColorSchemeOverride {
|
2021-05-18 21:23:12 +02:00
|
|
|
"dark",
|
|
|
|
};
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * CSS prefers-reduced-motion values.
|
|
|
|
+ */
|
|
|
|
+enum PrefersReducedMotionOverride {
|
|
|
|
+ "none",
|
|
|
|
+ "reduce",
|
|
|
|
+ "no-preference",
|
|
|
|
+};
|
2021-06-08 16:00:15 -07:00
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * CSS forced-colors values.
|
|
|
|
+ */
|
|
|
|
+enum ForcedColorsOverride {
|
|
|
|
+ "none",
|
|
|
|
+ "active",
|
|
|
|
+ "no-override", /* This clears the override. */
|
|
|
|
+};
|
2021-05-18 21:23:12 +02:00
|
|
|
+
|
|
|
|
/**
|
|
|
|
* Allowed overrides of platform/pref default behaviour for touch events.
|
|
|
|
*/
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -205,6 +223,12 @@ interface BrowsingContext {
|
2021-05-18 21:23:12 +02:00
|
|
|
// Color-scheme simulation, for DevTools.
|
|
|
|
[SetterThrows] attribute PrefersColorSchemeOverride prefersColorSchemeOverride;
|
|
|
|
|
|
|
|
+ // Reduced-Motion simulation, for DevTools.
|
|
|
|
+ [SetterThrows] attribute PrefersReducedMotionOverride prefersReducedMotionOverride;
|
2021-06-08 16:00:15 -07:00
|
|
|
+
|
|
|
|
+ // Forced-Colors simulation, for DevTools.
|
|
|
|
+ [SetterThrows] attribute ForcedColorsOverride forcedColorsOverride;
|
2021-05-18 21:23:12 +02:00
|
|
|
+
|
|
|
|
/**
|
|
|
|
* A unique identifier for the browser element that is hosting this
|
|
|
|
* BrowsingContext tree. Every BrowsingContext in the element's tree will
|
2020-03-20 11:14:42 -07:00
|
|
|
diff --git a/dom/geolocation/Geolocation.cpp b/dom/geolocation/Geolocation.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index cb9107deb1acfc6f9f3efe87144fcd9bbccd9231..5034c066db8e13dbd01b9bbe79ac2447135f3360 100644
|
2020-03-20 11:14:42 -07:00
|
|
|
--- a/dom/geolocation/Geolocation.cpp
|
|
|
|
+++ b/dom/geolocation/Geolocation.cpp
|
2020-03-24 23:25:17 -07:00
|
|
|
@@ -23,6 +23,7 @@
|
|
|
|
#include "nsComponentManagerUtils.h"
|
|
|
|
#include "nsContentPermissionHelper.h"
|
|
|
|
#include "nsContentUtils.h"
|
|
|
|
+#include "nsDocShell.h"
|
2023-11-14 10:18:18 -08:00
|
|
|
#include "nsGlobalWindowInner.h"
|
2020-03-24 23:25:17 -07:00
|
|
|
#include "mozilla/dom/Document.h"
|
|
|
|
#include "nsINamed.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -256,10 +257,8 @@ nsGeolocationRequest::Allow(JS::Handle<JS::Value> aChoices) {
|
2020-03-20 11:14:42 -07: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) {
|
2022-01-18 04:16:04 -07:00
|
|
|
EpochTimeStamp cachedPositionTime_ms;
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -437,8 +436,7 @@ void nsGeolocationRequest::Shutdown() {
|
2020-03-20 11:14:42 -07: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();
|
|
|
|
}
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -727,8 +725,14 @@ void nsGeolocationService::StopDevice() {
|
2020-03-20 11:14:42 -07:00
|
|
|
StaticRefPtr<nsGeolocationService> nsGeolocationService::sService;
|
|
|
|
|
|
|
|
already_AddRefed<nsGeolocationService>
|
|
|
|
-nsGeolocationService::GetGeolocationService() {
|
|
|
|
+nsGeolocationService::GetGeolocationService(nsDocShell* docShell) {
|
|
|
|
RefPtr<nsGeolocationService> result;
|
|
|
|
+ if (docShell) {
|
2020-03-22 13:51:49 -07:00
|
|
|
+ result = docShell->GetGeolocationServiceOverride();
|
2020-03-20 11:14:42 -07:00
|
|
|
+ if (result)
|
|
|
|
+ return result.forget();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
if (nsGeolocationService::sService) {
|
|
|
|
result = nsGeolocationService::sService;
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -820,7 +824,9 @@ nsresult Geolocation::Init(nsPIDOMWindowInner* aContentDom) {
|
2020-03-20 11:14:42 -07: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
|
2023-01-23 11:29:48 -08:00
|
|
|
index 7e1af00d05fbafa2d828e2c7e4dcc5c82d115f5b..e85af9718d064e4d2865bc944e9d4ba1efb9a5d7 100644
|
2020-03-20 11:14:42 -07:00
|
|
|
--- a/dom/geolocation/Geolocation.h
|
|
|
|
+++ b/dom/geolocation/Geolocation.h
|
2020-12-14 15:28:48 -08:00
|
|
|
@@ -31,6 +31,7 @@
|
|
|
|
|
|
|
|
#include "nsIGeolocationProvider.h"
|
|
|
|
#include "mozilla/Attributes.h"
|
|
|
|
+#include "nsDocShell.h"
|
|
|
|
|
|
|
|
class nsGeolocationService;
|
|
|
|
class nsGeolocationRequest;
|
2022-07-05 08:20:01 -07:00
|
|
|
@@ -48,13 +49,14 @@ struct CachedPositionAndAccuracy {
|
2020-12-14 15:28:48 -08:00
|
|
|
bool isHighAccuracy;
|
|
|
|
};
|
|
|
|
|
|
|
|
+
|
|
|
|
/**
|
|
|
|
* Singleton that manages the geolocation provider
|
|
|
|
*/
|
2020-03-20 11:14:42 -07:00
|
|
|
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-05 08:20:01 -07:00
|
|
|
@@ -179,6 +181,8 @@ class Geolocation final : public nsIGeolocationUpdate, public nsWrapperCache {
|
2020-03-20 11:14:42 -07:00
|
|
|
// null.
|
|
|
|
static already_AddRefed<Geolocation> NonWindowSingleton();
|
|
|
|
|
|
|
|
+ nsGeolocationService* GetGeolocationService() { return mService; };
|
|
|
|
+
|
|
|
|
private:
|
|
|
|
~Geolocation();
|
|
|
|
|
2019-11-25 13:56:39 -08:00
|
|
|
diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 09d57823aa37f596ac04261025862975f414bd7c..8cee0ae86ae1ed3aeda879cbf55f381a772dfa8b 100644
|
2019-11-25 13:56:39 -08:00
|
|
|
--- a/dom/html/HTMLInputElement.cpp
|
|
|
|
+++ b/dom/html/HTMLInputElement.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -58,6 +58,7 @@
|
2019-11-25 13:56:39 -08:00
|
|
|
#include "mozilla/dom/Document.h"
|
2023-04-24 21:28:08 +00:00
|
|
|
#include "mozilla/dom/HTMLDataListElement.h"
|
|
|
|
#include "mozilla/dom/HTMLOptionElement.h"
|
2019-11-25 13:56:39 -08:00
|
|
|
+#include "nsDocShell.h"
|
|
|
|
#include "nsIFormControlFrame.h"
|
|
|
|
#include "nsITextControlFrame.h"
|
|
|
|
#include "nsIFrame.h"
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -783,6 +784,12 @@ nsresult HTMLInputElement::InitFilePicker(FilePickerType aType) {
|
2019-11-25 13:56:39 -08:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ nsDocShell* docShell = static_cast<nsDocShell*>(win->GetDocShell());
|
|
|
|
+ if (docShell && docShell->IsFileInputInterceptionEnabled()) {
|
|
|
|
+ docShell->FilePickerShown(this);
|
|
|
|
+ return NS_OK;
|
|
|
|
+ }
|
|
|
|
+
|
2020-12-14 15:28:48 -08:00
|
|
|
if (IsPopupBlocked(doc)) {
|
2019-11-25 13:56:39 -08:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2020-10-13 12:24:11 -07:00
|
|
|
diff --git a/dom/interfaces/base/nsIDOMWindowUtils.idl b/dom/interfaces/base/nsIDOMWindowUtils.idl
|
2023-11-14 10:18:18 -08:00
|
|
|
index 4170a79023a2503831d080a6e65d5e143f34f241..3af08d6ea5f1cfbdc373774764a0c45fe3aa0e27 100644
|
2020-10-13 12:24:11 -07:00
|
|
|
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl
|
|
|
|
+++ b/dom/interfaces/base/nsIDOMWindowUtils.idl
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -373,6 +373,26 @@ interface nsIDOMWindowUtils : nsISupports {
|
2020-10-13 12:24:11 -07:00
|
|
|
[optional] in long aButtons,
|
2023-06-06 15:08:23 -07:00
|
|
|
[optional] in unsigned long aIdentifier);
|
2020-10-13 12:24:11 -07:00
|
|
|
|
2023-06-06 15:08:23 -07:00
|
|
|
+ /**
|
|
|
|
+ * Playwright: a separate method to dispatch mouse event with a
|
|
|
|
+ * specific `jugglerEventId`.
|
|
|
|
+ */
|
|
|
|
+ [can_run_script]
|
|
|
|
+ unsigned long jugglerSendMouseEvent(in AString aType,
|
|
|
|
+ in float aX,
|
|
|
|
+ in float aY,
|
|
|
|
+ in long aButton,
|
|
|
|
+ in long aClickCount,
|
|
|
|
+ in long aModifiers,
|
|
|
|
+ in boolean aIgnoreRootScrollFrame,
|
|
|
|
+ in float aPressure,
|
|
|
|
+ in unsigned short aInputSourceArg,
|
|
|
|
+ in boolean aIsDOMEventSynthesized,
|
|
|
|
+ in boolean aIsWidgetEventSynthesized,
|
|
|
|
+ in long aButtons,
|
|
|
|
+ in unsigned long aIdentifier,
|
|
|
|
+ in boolean aDisablePointerEvent);
|
|
|
|
+
|
2020-10-13 12:24:11 -07:00
|
|
|
/** Synthesize a touch event. The event types supported are:
|
|
|
|
* touchstart, touchend, touchmove, and touchcancel
|
2023-06-06 15:08:23 -07:00
|
|
|
*
|
|
|
|
diff --git a/dom/ipc/BrowserChild.cpp b/dom/ipc/BrowserChild.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 2e69547612aa1ef91d726ee54475a5f8e638e214..2b7aae36d1b4b7a7a7a7a6117104d3455e1768e3 100644
|
2023-06-06 15:08:23 -07:00
|
|
|
--- a/dom/ipc/BrowserChild.cpp
|
|
|
|
+++ b/dom/ipc/BrowserChild.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1647,6 +1647,21 @@ void BrowserChild::HandleRealMouseButtonEvent(const WidgetMouseEvent& aEvent,
|
2023-06-06 15:08:23 -07:00
|
|
|
if (postLayerization) {
|
|
|
|
postLayerization->Register();
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ // Playwright: notify content that mouse event has been received and handled.
|
|
|
|
+ nsCOMPtr<nsIObserverService> observerService =
|
|
|
|
+ mozilla::services::GetObserverService();
|
|
|
|
+ if (observerService && aEvent.mJugglerEventId) {
|
|
|
|
+ if (aEvent.mMessage == eMouseUp) {
|
|
|
|
+ observerService->NotifyObservers(nullptr, "juggler-mouse-event-hit-renderer", NS_ConvertASCIItoUTF16(nsPrintfCString("mouseup %" PRIu32, aEvent.mJugglerEventId)).get());
|
|
|
|
+ } else if (aEvent.mMessage == eMouseDown) {
|
|
|
|
+ observerService->NotifyObservers(nullptr, "juggler-mouse-event-hit-renderer", NS_ConvertASCIItoUTF16(nsPrintfCString("mousedown %" PRIu32, aEvent.mJugglerEventId)).get());
|
|
|
|
+ } else if (aEvent.mMessage == eMouseMove) {
|
|
|
|
+ observerService->NotifyObservers(nullptr, "juggler-mouse-event-hit-renderer", NS_ConvertASCIItoUTF16(nsPrintfCString("mousemove %" PRIu32, aEvent.mJugglerEventId)).get());
|
|
|
|
+ } else if (aEvent.mMessage == eContextMenu) {
|
|
|
|
+ observerService->NotifyObservers(nullptr, "juggler-mouse-event-hit-renderer", NS_ConvertASCIItoUTF16(nsPrintfCString("contextmenu %" PRIu32, aEvent.mJugglerEventId)).get());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
mozilla::ipc::IPCResult BrowserChild::RecvNormalPriorityRealMouseButtonEvent(
|
|
|
|
diff --git a/dom/ipc/CoalescedMouseData.cpp b/dom/ipc/CoalescedMouseData.cpp
|
|
|
|
index 5aa445d2e0a6169e57c44569974d557b3baf7064..671f71979b407f0ca17c66f13805e851ba30479e 100644
|
|
|
|
--- a/dom/ipc/CoalescedMouseData.cpp
|
|
|
|
+++ b/dom/ipc/CoalescedMouseData.cpp
|
|
|
|
@@ -67,6 +67,9 @@ bool CoalescedMouseData::CanCoalesce(const WidgetMouseEvent& aEvent,
|
|
|
|
mCoalescedInputEvent->pointerId == aEvent.pointerId &&
|
|
|
|
mCoalescedInputEvent->mButton == aEvent.mButton &&
|
|
|
|
mCoalescedInputEvent->mButtons == aEvent.mButtons && mGuid == aGuid &&
|
|
|
|
+ // `mJugglerEventId` is 0 for non-juggler events and a unique number for
|
|
|
|
+ // juggler-emitted events.
|
|
|
|
+ mCoalescedInputEvent->mJugglerEventId == aEvent.mJugglerEventId &&
|
|
|
|
mInputBlockId == aInputBlockId);
|
|
|
|
}
|
|
|
|
|
2020-07-27 16:22:02 -07:00
|
|
|
diff --git a/dom/media/systemservices/video_engine/desktop_capture_impl.cc b/dom/media/systemservices/video_engine/desktop_capture_impl.cc
|
2024-02-22 13:17:33 -08:00
|
|
|
index 532605b813d4e4a7693e6c82f6792075ef2565de..d225ffaf3439739d989b21f858c1763942beee9e 100644
|
2020-07-27 16:22:02 -07:00
|
|
|
--- a/dom/media/systemservices/video_engine/desktop_capture_impl.cc
|
|
|
|
+++ b/dom/media/systemservices/video_engine/desktop_capture_impl.cc
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -135,11 +135,12 @@ int32_t ScreenDeviceInfoImpl::GetOrientation(const char* aDeviceUniqueIdUTF8,
|
2021-05-06 19:11:42 -07:00
|
|
|
return 0;
|
|
|
|
}
|
2020-07-27 16:22:02 -07:00
|
|
|
|
2023-05-18 00:50:43 +00:00
|
|
|
-VideoCaptureModule* DesktopCaptureImpl::Create(const int32_t aModuleId,
|
|
|
|
+VideoCaptureModuleEx* DesktopCaptureImpl::Create(const int32_t aModuleId,
|
|
|
|
const char* aUniqueId,
|
|
|
|
- const CaptureDeviceType aType) {
|
|
|
|
+ const CaptureDeviceType aType,
|
|
|
|
+ bool aCaptureCursor) {
|
|
|
|
return new rtc::RefCountedObject<DesktopCaptureImpl>(aModuleId, aUniqueId,
|
|
|
|
- aType);
|
|
|
|
+ aType, aCaptureCursor);
|
2020-07-27 16:22:02 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
int32_t WindowDeviceInfoImpl::Init() {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -412,7 +413,7 @@ static bool UsePipewire() {
|
2023-09-11 18:16:33 -07:00
|
|
|
|
|
|
|
static std::unique_ptr<DesktopCapturer> CreateDesktopCapturerAndThread(
|
|
|
|
CaptureDeviceType aDeviceType, DesktopCapturer::SourceId aSourceId,
|
|
|
|
- nsIThread** aOutThread) {
|
|
|
|
+ nsIThread** aOutThread, bool aCaptureCursor) {
|
|
|
|
DesktopCaptureOptions options = CreateDesktopCaptureOptions();
|
|
|
|
std::unique_ptr<DesktopCapturer> capturer;
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -462,8 +463,10 @@ static std::unique_ptr<DesktopCapturer> CreateDesktopCapturerAndThread(
|
2023-09-11 18:16:33 -07:00
|
|
|
|
|
|
|
capturer->SelectSource(aSourceId);
|
|
|
|
|
|
|
|
- capturer = std::make_unique<DesktopAndCursorComposer>(std::move(capturer),
|
|
|
|
- options);
|
|
|
|
+ if (aCaptureCursor) {
|
|
|
|
+ capturer = std::make_unique<DesktopAndCursorComposer>(
|
|
|
|
+ std::move(capturer), options);
|
2020-07-27 16:22:02 -07:00
|
|
|
+ }
|
2023-09-11 18:16:33 -07:00
|
|
|
} else if (aDeviceType == CaptureDeviceType::Browser) {
|
2020-08-12 10:09:20 -07:00
|
|
|
// XXX We don't capture cursors, so avoid the extra indirection layer. We
|
|
|
|
// could also pass null for the pMouseCursorMonitor.
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -480,7 +483,8 @@ static std::unique_ptr<DesktopCapturer> CreateDesktopCapturerAndThread(
|
2020-07-27 16:22:02 -07:00
|
|
|
}
|
|
|
|
|
2023-05-18 00:50:43 +00:00
|
|
|
DesktopCaptureImpl::DesktopCaptureImpl(const int32_t aId, const char* aUniqueId,
|
|
|
|
- const CaptureDeviceType aType)
|
|
|
|
+ const CaptureDeviceType aType,
|
|
|
|
+ bool aCaptureCursor)
|
|
|
|
: mModuleId(aId),
|
|
|
|
mTrackingId(mozilla::TrackingId(CaptureEngineToTrackingSourceStr([&] {
|
|
|
|
switch (aType) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -497,6 +501,7 @@ DesktopCaptureImpl::DesktopCaptureImpl(const int32_t aId, const char* aUniqueId,
|
2023-09-11 18:16:33 -07:00
|
|
|
aId)),
|
2023-08-10 14:41:33 -07:00
|
|
|
mDeviceUniqueId(aUniqueId),
|
2023-05-18 00:50:43 +00:00
|
|
|
mDeviceType(aType),
|
|
|
|
+ capture_cursor_(aCaptureCursor),
|
2023-09-11 18:16:33 -07:00
|
|
|
mControlThread(mozilla::GetCurrentSerialEventTarget()),
|
2023-08-10 14:41:33 -07:00
|
|
|
mNextFrameMinimumTime(Timestamp::Zero()),
|
2023-06-06 15:08:23 -07:00
|
|
|
mCallbacks("DesktopCaptureImpl::mCallbacks") {}
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -521,6 +526,19 @@ void DesktopCaptureImpl::DeRegisterCaptureDataCallback(
|
2021-05-06 19:11:42 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+void DesktopCaptureImpl::RegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) {
|
2023-05-18 00:50:43 +00:00
|
|
|
+ rtc::CritScope lock(&mApiCs);
|
2021-05-06 19:11:42 -07:00
|
|
|
+ _rawFrameCallbacks.insert(rawFrameCallback);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void DesktopCaptureImpl::DeRegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) {
|
2023-05-18 00:50:43 +00:00
|
|
|
+ rtc::CritScope lock(&mApiCs);
|
2021-05-06 19:11:42 -07:00
|
|
|
+ auto it = _rawFrameCallbacks.find(rawFrameCallback);
|
|
|
|
+ if (it != _rawFrameCallbacks.end()) {
|
|
|
|
+ _rawFrameCallbacks.erase(it);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
int32_t DesktopCaptureImpl::StopCaptureIfAllClientsClose() {
|
2023-05-18 00:50:43 +00:00
|
|
|
{
|
|
|
|
auto callbacks = mCallbacks.Lock();
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -553,7 +571,7 @@ int32_t DesktopCaptureImpl::StartCapture(
|
2023-09-11 18:16:33 -07:00
|
|
|
|
|
|
|
DesktopCapturer::SourceId sourceId = std::stoi(mDeviceUniqueId);
|
|
|
|
std::unique_ptr capturer = CreateDesktopCapturerAndThread(
|
|
|
|
- mDeviceType, sourceId, getter_AddRefs(mCaptureThread));
|
|
|
|
+ mDeviceType, sourceId, getter_AddRefs(mCaptureThread), capture_cursor_);
|
|
|
|
|
|
|
|
MOZ_ASSERT(!capturer == !mCaptureThread);
|
|
|
|
if (!capturer) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -654,6 +672,15 @@ void DesktopCaptureImpl::OnCaptureResult(DesktopCapturer::Result aResult,
|
2023-05-18 00:50:43 +00:00
|
|
|
frameInfo.height = aFrame->size().height();
|
2021-05-06 19:11:42 -07:00
|
|
|
frameInfo.videoType = VideoType::kARGB;
|
|
|
|
|
|
|
|
+ size_t videoFrameStride =
|
|
|
|
+ frameInfo.width * DesktopFrame::kBytesPerPixel;
|
2022-08-04 18:52:30 -07:00
|
|
|
+ {
|
2023-05-18 00:50:43 +00:00
|
|
|
+ rtc::CritScope cs(&mApiCs);
|
2022-08-04 18:52:30 -07:00
|
|
|
+ for (auto rawFrameCallback : _rawFrameCallbacks) {
|
|
|
|
+ rawFrameCallback->OnRawFrame(videoFrame, videoFrameStride, frameInfo);
|
|
|
|
+ }
|
2021-05-06 19:11:42 -07:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
size_t videoFrameLength =
|
|
|
|
frameInfo.width * frameInfo.height * DesktopFrame::kBytesPerPixel;
|
2023-06-06 15:08:23 -07:00
|
|
|
|
2020-07-27 16:22:02 -07:00
|
|
|
diff --git a/dom/media/systemservices/video_engine/desktop_capture_impl.h b/dom/media/systemservices/video_engine/desktop_capture_impl.h
|
2023-09-11 18:16:33 -07:00
|
|
|
index 64eadb140131ea807db8b55431630523342a88ce..371e093fef6e225302da6aaf6e1ede05b93efd74 100644
|
2020-07-27 16:22:02 -07:00
|
|
|
--- a/dom/media/systemservices/video_engine/desktop_capture_impl.h
|
|
|
|
+++ b/dom/media/systemservices/video_engine/desktop_capture_impl.h
|
2023-06-06 15:08:23 -07:00
|
|
|
@@ -24,6 +24,7 @@
|
|
|
|
#include "api/video/video_sink_interface.h"
|
|
|
|
#include "modules/desktop_capture/desktop_capturer.h"
|
|
|
|
#include "modules/video_capture/video_capture.h"
|
|
|
|
+#include "rtc_base/deprecated/recursive_critical_section.h"
|
|
|
|
|
|
|
|
#include "desktop_device_info.h"
|
|
|
|
#include "mozilla/DataMutex.h"
|
|
|
|
@@ -43,6 +44,21 @@ namespace webrtc {
|
2021-05-06 19:11:42 -07: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
|
|
|
|
|
2023-06-06 15:08:23 -07:00
|
|
|
@@ -155,13 +171,13 @@ class BrowserDeviceInfoImpl : public VideoCaptureModule::DeviceInfo {
|
2021-05-06 19:11:42 -07:00
|
|
|
// As with video, DesktopCaptureImpl is a proxy for screen sharing
|
|
|
|
// and follows the video pipeline design
|
|
|
|
class DesktopCaptureImpl : public DesktopCapturer::Callback,
|
2022-01-18 04:16:04 -07:00
|
|
|
- public VideoCaptureModule {
|
|
|
|
+ public VideoCaptureModuleEx {
|
2021-05-06 19:11:42 -07:00
|
|
|
public:
|
2020-07-27 16:22:02 -07:00
|
|
|
/* Create a screen capture modules object
|
|
|
|
*/
|
2023-05-18 00:50:43 +00:00
|
|
|
- static VideoCaptureModule* Create(
|
|
|
|
+ static VideoCaptureModuleEx* Create(
|
|
|
|
const int32_t aModuleId, const char* aUniqueId,
|
|
|
|
- const mozilla::camera::CaptureDeviceType aType);
|
|
|
|
+ const mozilla::camera::CaptureDeviceType aType, bool aCaptureCursor = true);
|
|
|
|
|
|
|
|
[[nodiscard]] static std::shared_ptr<VideoCaptureModule::DeviceInfo>
|
|
|
|
CreateDeviceInfo(const int32_t aId,
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -175,6 +191,8 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
|
2021-05-06 19:11:42 -07:00
|
|
|
void DeRegisterCaptureDataCallback(
|
2023-05-18 00:50:43 +00:00
|
|
|
rtc::VideoSinkInterface<VideoFrame>* aCallback) override;
|
2021-05-06 19:11:42 -07:00
|
|
|
int32_t StopCaptureIfAllClientsClose() override;
|
|
|
|
+ void RegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) override;
|
|
|
|
+ void DeRegisterRawFrameCallback(RawFrameCallback* rawFrameCallback) override;
|
|
|
|
|
2023-05-18 00:50:43 +00:00
|
|
|
int32_t SetCaptureRotation(VideoRotation aRotation) override;
|
|
|
|
bool SetApplyRotation(bool aEnable) override;
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -197,7 +215,8 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
|
2020-07-27 16:22:02 -07:00
|
|
|
|
|
|
|
protected:
|
2023-05-18 00:50:43 +00:00
|
|
|
DesktopCaptureImpl(const int32_t aId, const char* aUniqueId,
|
|
|
|
- const mozilla::camera::CaptureDeviceType aType);
|
|
|
|
+ const mozilla::camera::CaptureDeviceType aType,
|
|
|
|
+ bool aCaptureCusor);
|
2020-07-27 16:22:02 -07:00
|
|
|
virtual ~DesktopCaptureImpl();
|
2021-05-06 19:11:42 -07:00
|
|
|
|
2023-06-06 15:08:23 -07:00
|
|
|
private:
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -205,6 +224,9 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
|
|
|
|
static constexpr uint32_t kMaxDesktopCaptureCpuUsage = 50;
|
|
|
|
void InitOnThread(std::unique_ptr<DesktopCapturer> aCapturer, int aFramerate);
|
2023-06-06 15:08:23 -07:00
|
|
|
void ShutdownOnThread();
|
2023-05-18 00:50:43 +00:00
|
|
|
+
|
2023-06-06 15:08:23 -07:00
|
|
|
+ rtc::RecursiveCriticalSection mApiCs;
|
|
|
|
+ std::set<RawFrameCallback*> _rawFrameCallbacks;
|
2023-05-18 00:50:43 +00:00
|
|
|
// DesktopCapturer::Callback interface.
|
2023-06-06 15:08:23 -07:00
|
|
|
void OnCaptureResult(DesktopCapturer::Result aResult,
|
|
|
|
std::unique_ptr<DesktopFrame> aFrame) override;
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -212,6 +234,8 @@ class DesktopCaptureImpl : public DesktopCapturer::Callback,
|
|
|
|
// Notifies all mCallbacks of OnFrame(). mCaptureThread only.
|
|
|
|
void NotifyOnFrame(const VideoFrame& aFrame);
|
|
|
|
|
2020-07-27 16:22:02 -07:00
|
|
|
+ bool capture_cursor_ = true;
|
2023-09-11 18:16:33 -07:00
|
|
|
+
|
|
|
|
// Control thread on which the public API is called.
|
|
|
|
const nsCOMPtr<nsISerialEventTarget> mControlThread;
|
|
|
|
// Set in StartCapture.
|
2020-01-16 11:52:23 -08:00
|
|
|
diff --git a/dom/script/ScriptSettings.cpp b/dom/script/ScriptSettings.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 3b39538e51840cd9b1685b2efd2ff2e9ec83608a..c7bf4f2d53b58bbacb22b3ebebf6f3fc9b5e445f 100644
|
2020-01-16 11:52:23 -08:00
|
|
|
--- a/dom/script/ScriptSettings.cpp
|
|
|
|
+++ b/dom/script/ScriptSettings.cpp
|
2022-06-29 04:46:49 -07:00
|
|
|
@@ -150,6 +150,30 @@ ScriptSettingsStackEntry::~ScriptSettingsStackEntry() {
|
2020-01-16 11:52:23 -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-06-29 04:46:49 -07:00
|
|
|
@@ -177,7 +201,7 @@ static nsIGlobalObject* ClampToSubject(nsIGlobalObject* aGlobalOrNull) {
|
2020-01-16 11:52:23 -08:00
|
|
|
NS_ENSURE_TRUE(globalPrin, GetCurrentGlobal());
|
|
|
|
if (!nsContentUtils::SubjectPrincipalOrSystemIfNativeCaller()
|
|
|
|
->SubsumesConsideringDomain(globalPrin)) {
|
|
|
|
- return GetCurrentGlobal();
|
|
|
|
+ return UnwrapSandboxGlobal(GetCurrentGlobal());
|
|
|
|
}
|
|
|
|
|
|
|
|
return aGlobalOrNull;
|
2019-11-25 15:26:03 -08:00
|
|
|
diff --git a/dom/security/nsCSPUtils.cpp b/dom/security/nsCSPUtils.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
index d1bd1d060d749de3ac16bd6e9fd3383383e4dd9a..e6262c210accf12c3d071d42031b432b2a6332b5 100644
|
2019-11-25 15:26:03 -08:00
|
|
|
--- a/dom/security/nsCSPUtils.cpp
|
|
|
|
+++ b/dom/security/nsCSPUtils.cpp
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -22,6 +22,7 @@
|
|
|
|
#include "nsSandboxFlags.h"
|
|
|
|
#include "nsServiceManagerUtils.h"
|
|
|
|
#include "nsWhitespaceTokenizer.h"
|
|
|
|
+#include "nsDocShell.h"
|
|
|
|
|
|
|
|
#include "mozilla/Components.h"
|
|
|
|
#include "mozilla/dom/CSPDictionariesBinding.h"
|
|
|
|
@@ -132,6 +133,11 @@ void CSP_ApplyMetaCSPToDoc(mozilla::dom::Document& aDoc,
|
2019-11-25 15:26:03 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if (aDoc.GetDocShell() &&
|
|
|
|
+ nsDocShell::Cast(aDoc.GetDocShell())->IsBypassCSPEnabled()) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
nsAutoString policyStr(
|
|
|
|
nsContentUtils::TrimWhitespace<nsContentUtils::IsHTMLWhitespace>(
|
|
|
|
aPolicyStr));
|
2020-04-13 11:31:02 -07:00
|
|
|
diff --git a/dom/webidl/GeometryUtils.webidl b/dom/webidl/GeometryUtils.webidl
|
2023-01-23 11:29:48 -08:00
|
|
|
index 2f71b284ee5f7e11f117c447834b48355784448c..2640bd57123c2b03bf4b06a2419cd020ba95f155 100644
|
2020-04-13 11:31:02 -07:00
|
|
|
--- a/dom/webidl/GeometryUtils.webidl
|
|
|
|
+++ b/dom/webidl/GeometryUtils.webidl
|
2022-08-01 14:40:23 -07: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 {
|
2020-04-13 11:31:02 -07:00
|
|
|
[Throws, Func="nsINode::HasBoxQuadsSupport", NeedsCallerType]
|
|
|
|
sequence<DOMQuad> getBoxQuads(optional BoxQuadOptions options = {});
|
|
|
|
|
|
|
|
+ [ChromeOnly, Throws, Func="nsINode::HasBoxQuadsSupport"]
|
2023-01-23 11:29:48 -08:00
|
|
|
+ undefined scrollRectIntoViewIfNeeded(long x, long y, long w, long h);
|
2020-04-13 11:31:02 -07:00
|
|
|
+
|
|
|
|
/* 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
|
2020-03-20 17:03:20 -07:00
|
|
|
diff --git a/dom/workers/RuntimeService.cpp b/dom/workers/RuntimeService.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 4fc3db17b202f768cadc7fa3921badc4374a9f7a..be58abf2b7906e7307dd8f106f5f8bd2206793bc 100644
|
2020-03-20 17:03:20 -07:00
|
|
|
--- a/dom/workers/RuntimeService.cpp
|
|
|
|
+++ b/dom/workers/RuntimeService.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -985,7 +985,7 @@ void PrefLanguagesChanged(const char* /* aPrefName */, void* /* aClosure */) {
|
2020-03-20 17:03:20 -07:00
|
|
|
AssertIsOnMainThread();
|
|
|
|
|
|
|
|
nsTArray<nsString> languages;
|
|
|
|
- Navigator::GetAcceptLanguages(languages);
|
|
|
|
+ Navigator::GetAcceptLanguages(nullptr, languages);
|
|
|
|
|
|
|
|
RuntimeService* runtime = RuntimeService::GetService();
|
|
|
|
if (runtime) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1172,8 +1172,7 @@ bool RuntimeService::RegisterWorker(WorkerPrivate& aWorkerPrivate) {
|
2020-03-20 17:03:20 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// The navigator overridden properties should have already been read.
|
|
|
|
-
|
|
|
|
- Navigator::GetAcceptLanguages(mNavigatorProperties.mLanguages);
|
|
|
|
+ Navigator::GetAcceptLanguages(nullptr, mNavigatorProperties.mLanguages);
|
|
|
|
mNavigatorPropertiesLoaded = true;
|
|
|
|
}
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1772,6 +1771,13 @@ void RuntimeService::PropagateStorageAccessPermissionGranted(
|
2020-03-26 16:33:07 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+void RuntimeService::ResetDefaultLocaleInAllWorkers() {
|
|
|
|
+ AssertIsOnMainThread();
|
2020-08-12 10:09:20 -07:00
|
|
|
+ BroadcastAllWorkers([](auto& worker) {
|
|
|
|
+ worker.ResetDefaultLocale();
|
|
|
|
+ });
|
2020-03-26 16:33:07 -07:00
|
|
|
+}
|
|
|
|
+
|
2022-06-29 04:46:49 -07:00
|
|
|
template <typename Func>
|
|
|
|
void RuntimeService::BroadcastAllWorkers(const Func& aFunc) {
|
2020-03-26 16:33:07 -07:00
|
|
|
AssertIsOnMainThread();
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -2287,6 +2293,14 @@ void PropagateStorageAccessPermissionGrantedToWorkers(
|
2020-03-26 16:33:07 -07: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
|
2023-11-14 10:18:18 -08:00
|
|
|
index e6deb81f357043a937d032bb4b6c38207203f4d9..ff16582af9fbf550dfb7b5639658c34199524c45 100644
|
2020-03-26 16:33:07 -07:00
|
|
|
--- a/dom/workers/RuntimeService.h
|
|
|
|
+++ b/dom/workers/RuntimeService.h
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -108,6 +108,8 @@ class RuntimeService final : public nsIObserver {
|
2020-08-06 10:32:50 -07:00
|
|
|
void PropagateStorageAccessPermissionGranted(
|
|
|
|
const nsPIDOMWindowInner& aWindow);
|
2020-03-26 16:33:07 -07:00
|
|
|
|
|
|
|
+ void ResetDefaultLocaleInAllWorkers();
|
|
|
|
+
|
|
|
|
const NavigatorProperties& GetNavigatorProperties() const {
|
|
|
|
return mNavigatorProperties;
|
|
|
|
}
|
|
|
|
diff --git a/dom/workers/WorkerCommon.h b/dom/workers/WorkerCommon.h
|
2022-07-05 08:20:01 -07:00
|
|
|
index d10dabb5c5ff8e17851edf2bd2efc08e74584d8e..53c4070c5fde43b27fb8fbfdcf4c23d8af57fba3 100644
|
2020-03-26 16:33:07 -07:00
|
|
|
--- a/dom/workers/WorkerCommon.h
|
|
|
|
+++ b/dom/workers/WorkerCommon.h
|
2022-07-05 08:20:01 -07:00
|
|
|
@@ -44,6 +44,8 @@ void ResumeWorkersForWindow(const nsPIDOMWindowInner& aWindow);
|
2020-08-06 10:32:50 -07:00
|
|
|
void PropagateStorageAccessPermissionGrantedToWorkers(
|
|
|
|
const nsPIDOMWindowInner& aWindow);
|
2020-03-26 16:33:07 -07:00
|
|
|
|
|
|
|
+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
|
2024-02-22 13:17:33 -08:00
|
|
|
index ed8a07bcdc25f77a93079c8b9f113c59b9befaf9..2f09a961603f28a658f2d29321a389b7623482b9 100644
|
2020-03-26 16:33:07 -07:00
|
|
|
--- a/dom/workers/WorkerPrivate.cpp
|
|
|
|
+++ b/dom/workers/WorkerPrivate.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -679,6 +679,18 @@ class UpdateContextOptionsRunnable final : public WorkerControlRunnable {
|
2020-03-26 16:33:07 -07:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
+class ResetDefaultLocaleRunnable final : public WorkerControlRunnable {
|
|
|
|
+ public:
|
|
|
|
+ explicit ResetDefaultLocaleRunnable(WorkerPrivate* aWorkerPrivate)
|
2024-02-22 13:17:33 -08:00
|
|
|
+ : WorkerControlRunnable(aWorkerPrivate, WorkerThread) {}
|
2020-03-26 16:33:07 -07:00
|
|
|
+
|
|
|
|
+ virtual bool WorkerRun(JSContext* aCx,
|
|
|
|
+ WorkerPrivate* aWorkerPrivate) override {
|
|
|
|
+ aWorkerPrivate->ResetDefaultLocaleInternal(aCx);
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
class UpdateLanguagesRunnable final : public WorkerRunnable {
|
|
|
|
nsTArray<nsString> mLanguages;
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1949,6 +1961,16 @@ void WorkerPrivate::UpdateContextOptions(
|
2020-03-26 16:33:07 -07: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();
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -5450,6 +5472,15 @@ void WorkerPrivate::UpdateContextOptionsInternal(
|
2020-03-26 16:33:07 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+void WorkerPrivate::ResetDefaultLocaleInternal(JSContext* aCx) {
|
|
|
|
+ JS_ResetDefaultLocale(JS_GetRuntime(aCx));
|
2020-08-12 10:09:20 -07:00
|
|
|
+ auto data = mWorkerThreadAccessible.Access();
|
2020-03-26 16:33:07 -07:00
|
|
|
+
|
|
|
|
+ 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
|
2024-02-22 13:17:33 -08:00
|
|
|
index a134d4846f9ad0f273f61fe2c2daa10af7b3c7a6..38bb391cb542a560f93a0c302a1d942aad8135a6 100644
|
2020-03-26 16:33:07 -07:00
|
|
|
--- a/dom/workers/WorkerPrivate.h
|
|
|
|
+++ b/dom/workers/WorkerPrivate.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -417,6 +417,8 @@ class WorkerPrivate final
|
2020-03-26 16:33:07 -07: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,
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1036,6 +1038,8 @@ class WorkerPrivate final
|
2020-03-26 16:33:07 -07:00
|
|
|
|
|
|
|
void UpdateContextOptions(const JS::ContextOptions& aContextOptions);
|
|
|
|
|
|
|
|
+ void ResetDefaultLocale();
|
|
|
|
+
|
|
|
|
void UpdateLanguages(const nsTArray<nsString>& aLanguages);
|
|
|
|
|
2020-05-07 18:37:15 -07:00
|
|
|
void UpdateJSWorkerMemoryParameter(JSGCParamKey key, Maybe<uint32_t> value);
|
2021-11-04 11:26:20 -07:00
|
|
|
diff --git a/intl/components/src/TimeZone.cpp b/intl/components/src/TimeZone.cpp
|
2023-10-10 16:10:40 -07:00
|
|
|
index 7a069ef0c59895cf1f8dc35d612f1494c9c9f1ef..5b09dfdcc5323def65c35b0696141b44eef9dcda 100644
|
2021-11-04 11:26:20 -07: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) {
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -318,6 +319,13 @@ static ICUResult SetDefaultTimeZone(TimeZoneIdentifierVector& timeZone) {
|
2021-11-04 11:26:20 -07: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
|
2023-10-10 16:10:40 -07:00
|
|
|
index 9d0423ef13958d5c443cc3531269603c4801c338..f0c4ba7c528d2be466e0f7669a1e37e876f9091e 100644
|
2021-11-04 11:26:20 -07:00
|
|
|
--- a/intl/components/src/TimeZone.h
|
|
|
|
+++ b/intl/components/src/TimeZone.h
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -190,6 +190,8 @@ class TimeZone final {
|
2021-11-04 11:26:20 -07:00
|
|
|
return FillBufferWithICUCall(aBuffer, ucal_getHostTimeZone);
|
|
|
|
}
|
|
|
|
|
|
|
|
+ static bool IsValidTimeZoneId(const char* timeZoneId);
|
|
|
|
+
|
|
|
|
/**
|
|
|
|
* Set the default time zone.
|
|
|
|
*/
|
2020-04-01 14:10:30 -07:00
|
|
|
diff --git a/js/public/Date.h b/js/public/Date.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 422ea0b2c0daafd4447d0d83500ea73545c99b76..7f03adc302112e0de3d842d7ce6bc0909b50f76a 100644
|
2020-04-01 14:10:30 -07:00
|
|
|
--- a/js/public/Date.h
|
|
|
|
+++ b/js/public/Date.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -54,6 +54,8 @@ namespace JS {
|
2020-04-01 14:10:30 -07:00
|
|
|
*/
|
|
|
|
extern JS_PUBLIC_API void ResetTimeZone();
|
|
|
|
|
|
|
|
+extern JS_PUBLIC_API bool SetTimeZoneOverride(const char* timezoneId);
|
|
|
|
+
|
|
|
|
class ClippedTime;
|
|
|
|
inline ClippedTime TimeClip(double time);
|
|
|
|
|
2020-03-25 16:28:33 -07:00
|
|
|
diff --git a/js/src/debugger/Object.cpp b/js/src/debugger/Object.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 2cb72597fdf2a10fdc53bf03d6cc98d9bc16af58..b3ce8a99c37fc8c503206ea2b47b7e000fc4bf3b 100644
|
2020-03-25 16:28:33 -07:00
|
|
|
--- a/js/src/debugger/Object.cpp
|
|
|
|
+++ b/js/src/debugger/Object.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -2446,7 +2446,11 @@ Maybe<Completion> DebuggerObject::call(JSContext* cx,
|
2020-03-25 16:28:33 -07: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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-01 14:10:30 -07:00
|
|
|
diff --git a/js/src/vm/DateTime.cpp b/js/src/vm/DateTime.cpp
|
2023-10-10 16:10:40 -07:00
|
|
|
index 21ecc2e9f50a16357ace3320335d31a4929fc146..c4b1444ce53b20a700d2ff9f18521bd67623e7d2 100644
|
2020-04-01 14:10:30 -07:00
|
|
|
--- a/js/src/vm/DateTime.cpp
|
|
|
|
+++ b/js/src/vm/DateTime.cpp
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -186,6 +186,11 @@ void js::DateTimeInfo::internalResetTimeZone(ResetTimeZoneMode mode) {
|
2020-04-01 14:10:30 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-04 11:26:20 -07:00
|
|
|
+void js::DateTimeInfo::internalSetTimeZoneOverride(std::string timeZone) {
|
2020-04-01 14:10:30 -07:00
|
|
|
+ timeZoneOverride_ = std::move(timeZone);
|
|
|
|
+ internalResetTimeZone(ResetTimeZoneMode::ResetEvenIfOffsetUnchanged);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
void js::DateTimeInfo::updateTimeZone() {
|
|
|
|
MOZ_ASSERT(timeZoneStatus_ != TimeZoneStatus::Valid);
|
|
|
|
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -527,10 +532,24 @@ void js::ResetTimeZoneInternal(ResetTimeZoneMode mode) {
|
2020-04-01 14:10:30 -07:00
|
|
|
js::DateTimeInfo::resetTimeZone(mode);
|
|
|
|
}
|
|
|
|
|
2021-11-04 11:26:20 -07:00
|
|
|
+void js::SetTimeZoneOverrideInternal(std::string timeZone) {
|
2020-04-01 14:10:30 -07:00
|
|
|
+ auto guard = js::DateTimeInfo::instance->lock();
|
2021-11-04 11:26:20 -07:00
|
|
|
+ guard->internalSetTimeZoneOverride(timeZone);
|
2020-04-01 14:10:30 -07:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
JS_PUBLIC_API void JS::ResetTimeZone() {
|
|
|
|
js::ResetTimeZoneInternal(js::ResetTimeZoneMode::ResetEvenIfOffsetUnchanged);
|
|
|
|
}
|
|
|
|
|
|
|
|
+JS_PUBLIC_API bool JS::SetTimeZoneOverride(const char* timeZoneId) {
|
2021-11-04 11:26:20 -07:00
|
|
|
+ if (!mozilla::intl::TimeZone::IsValidTimeZoneId(timeZoneId)) {
|
2020-04-01 14:10:30 -07:00
|
|
|
+ fprintf(stderr, "Invalid timezone id: %s\n", timeZoneId);
|
|
|
|
+ return false;
|
|
|
|
+ }
|
2021-11-04 11:26:20 -07:00
|
|
|
+ js::SetTimeZoneOverrideInternal(std::string(timeZoneId));
|
2020-04-01 14:10:30 -07:00
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
2021-11-04 11:26:20 -07:00
|
|
|
#if JS_HAS_INTL_API
|
|
|
|
# if defined(XP_WIN)
|
|
|
|
static bool IsOlsonCompatibleWindowsTimeZoneId(std::string_view tz) {
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -748,6 +767,15 @@ static bool ReadTimeZoneLink(std::string_view tz,
|
2020-04-01 14:10:30 -07:00
|
|
|
|
|
|
|
void js::DateTimeInfo::internalResyncICUDefaultTimeZone() {
|
2021-11-04 11:26:20 -07:00
|
|
|
#if JS_HAS_INTL_API
|
|
|
|
+ if (!timeZoneOverride_.empty()) {
|
|
|
|
+ mozilla::Span<const char> tzid = mozilla::Span(timeZoneOverride_.data(), timeZoneOverride_.length());
|
2021-12-15 08:31:33 -08:00
|
|
|
+ auto result = mozilla::intl::TimeZone::SetDefaultTimeZone(tzid);
|
|
|
|
+ if (result.isErr()) {
|
|
|
|
+ fprintf(stderr, "ERROR: failed to setup default time zone\n");
|
|
|
|
+ }
|
2020-04-01 14:10:30 -07:00
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
2023-07-06 12:22:45 -07:00
|
|
|
// In the future we should not be setting a default ICU time zone at all,
|
|
|
|
// instead all accesses should go through the appropriate DateTimeInfo
|
|
|
|
// instance depending on the resist fingerprinting status. For now we return
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -759,7 +787,6 @@ void js::DateTimeInfo::internalResyncICUDefaultTimeZone() {
|
2023-07-06 12:22:45 -07:00
|
|
|
|
2021-11-04 11:26:20 -07:00
|
|
|
if (const char* tzenv = std::getenv("TZ")) {
|
|
|
|
std::string_view tz(tzenv);
|
|
|
|
-
|
|
|
|
mozilla::Span<const char> tzid;
|
2020-04-01 14:10:30 -07:00
|
|
|
|
2021-11-04 11:26:20 -07:00
|
|
|
# if defined(XP_WIN)
|
2020-04-01 14:10:30 -07:00
|
|
|
diff --git a/js/src/vm/DateTime.h b/js/src/vm/DateTime.h
|
2023-10-10 16:10:40 -07:00
|
|
|
index fd6d7ae078b8f6b3cc46a4a993a1e044a7128c90..4743094e489122dd9ee8ab9a7a175dd7e928859d 100644
|
2020-04-01 14:10:30 -07:00
|
|
|
--- a/js/src/vm/DateTime.h
|
|
|
|
+++ b/js/src/vm/DateTime.h
|
2023-07-06 12:22:45 -07:00
|
|
|
@@ -65,6 +65,8 @@ enum class ResetTimeZoneMode : bool {
|
2020-04-01 14:10:30 -07:00
|
|
|
*/
|
|
|
|
extern void ResetTimeZoneInternal(ResetTimeZoneMode mode);
|
|
|
|
|
2021-11-04 11:26:20 -07:00
|
|
|
+extern void SetTimeZoneOverrideInternal(std::string timeZone);
|
2020-04-01 14:10:30 -07:00
|
|
|
+
|
|
|
|
/**
|
2023-07-06 12:22:45 -07:00
|
|
|
* Stores date/time information, particularly concerning the current local
|
|
|
|
* time zone, and implements a small cache for daylight saving time offset
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -225,6 +227,7 @@ class DateTimeInfo {
|
2023-07-06 12:22:45 -07:00
|
|
|
private:
|
|
|
|
// The method below should only be called via js::ResetTimeZoneInternal().
|
2020-04-01 14:10:30 -07:00
|
|
|
friend void js::ResetTimeZoneInternal(ResetTimeZoneMode);
|
2021-11-04 11:26:20 -07:00
|
|
|
+ friend void js::SetTimeZoneOverrideInternal(std::string);
|
2020-04-01 14:10:30 -07:00
|
|
|
|
|
|
|
static void resetTimeZone(ResetTimeZoneMode mode) {
|
2023-07-06 12:22:45 -07:00
|
|
|
{
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -321,6 +324,8 @@ class DateTimeInfo {
|
2020-04-01 14:10:30 -07:00
|
|
|
JS::UniqueChars locale_;
|
|
|
|
JS::UniqueTwoByteChars standardName_;
|
|
|
|
JS::UniqueTwoByteChars daylightSavingsName_;
|
|
|
|
+
|
2021-11-04 11:26:20 -07:00
|
|
|
+ std::string timeZoneOverride_;
|
2020-04-01 14:10:30 -07: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
|
2023-10-10 16:10:40 -07:00
|
|
|
@@ -336,6 +341,8 @@ class DateTimeInfo {
|
2020-04-01 14:10:30 -07:00
|
|
|
|
|
|
|
void internalResetTimeZone(ResetTimeZoneMode mode);
|
|
|
|
|
2021-11-04 11:26:20 -07:00
|
|
|
+ void internalSetTimeZoneOverride(std::string timeZone);
|
2020-04-01 14:10:30 -07:00
|
|
|
+
|
|
|
|
void updateTimeZone();
|
|
|
|
|
|
|
|
void internalResyncICUDefaultTimeZone();
|
2022-08-01 14:40:23 -07: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-02 09:04:04 -07:00
|
|
|
diff --git a/layout/base/PresShell.cpp b/layout/base/PresShell.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 6e27e39f432d678376cec3bfd8491e5f20ebd893..a69211527a0a2411b6ef4a69de0183428114139d 100644
|
2022-06-02 09:04:04 -07:00
|
|
|
--- a/layout/base/PresShell.cpp
|
|
|
|
+++ b/layout/base/PresShell.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -10906,7 +10906,9 @@ bool PresShell::ComputeActiveness() const {
|
2022-06-02 09:04:04 -07:00
|
|
|
if (!browserChild->IsVisible()) {
|
|
|
|
MOZ_LOG(gLog, LogLevel::Debug,
|
|
|
|
(" > BrowserChild %p is not visible", browserChild));
|
2024-01-13 00:19:49 +01:00
|
|
|
- return false;
|
2022-06-02 09:04:04 -07:00
|
|
|
+ bool isActive;
|
|
|
|
+ root->GetDocShell()->GetForceActiveState(&isActive);
|
2024-01-13 00:19:49 +01:00
|
|
|
+ return isActive;
|
2022-06-02 09:04:04 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// If the browser is visible but just due to be preserving layers
|
2021-06-08 16:00:15 -07:00
|
|
|
diff --git a/layout/style/GeckoBindings.h b/layout/style/GeckoBindings.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 327b3d587844c0ad81f5b9c2c622bf52315380bf..d5eefde23dfa3d5666f04af90b7dda1ffa38f6bd 100644
|
2021-06-08 16:00:15 -07:00
|
|
|
--- a/layout/style/GeckoBindings.h
|
|
|
|
+++ b/layout/style/GeckoBindings.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -632,6 +632,7 @@ float Gecko_MediaFeatures_GetResolution(const mozilla::dom::Document*);
|
2021-06-08 16:00:15 -07:00
|
|
|
bool Gecko_MediaFeatures_PrefersReducedMotion(const mozilla::dom::Document*);
|
2023-07-06 12:22:45 -07:00
|
|
|
bool Gecko_MediaFeatures_PrefersReducedTransparency(
|
|
|
|
const mozilla::dom::Document*);
|
2021-06-08 16:00:15 -07:00
|
|
|
+bool Gecko_MediaFeatures_ForcedColors(const mozilla::dom::Document*);
|
|
|
|
mozilla::StylePrefersContrast Gecko_MediaFeatures_PrefersContrast(
|
|
|
|
const mozilla::dom::Document*);
|
|
|
|
mozilla::StylePrefersColorScheme Gecko_MediaFeatures_PrefersColorScheme(
|
2021-05-18 21:23:12 +02:00
|
|
|
diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index f10c779512c8d6a778ccd2fe98f069745a58adab..8534639ff3c256820846c6e014185783bb317efe 100644
|
2021-05-18 21:23:12 +02:00
|
|
|
--- a/layout/style/nsMediaFeatures.cpp
|
|
|
|
+++ b/layout/style/nsMediaFeatures.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -261,11 +261,11 @@ bool Gecko_MediaFeatures_MatchesPlatform(StylePlatform aPlatform) {
|
2021-05-18 21:23:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Gecko_MediaFeatures_PrefersReducedMotion(const Document* aDocument) {
|
2023-08-10 14:41:33 -07:00
|
|
|
- if (aDocument->ShouldResistFingerprinting(
|
|
|
|
- RFPTarget::CSSPrefersReducedMotion)) {
|
2021-05-18 21:23:12 +02:00
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- return LookAndFeel::GetInt(LookAndFeel::IntID::PrefersReducedMotion, 0) == 1;
|
|
|
|
+ return aDocument->PrefersReducedMotion();
|
2021-06-08 16:00:15 -07:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool Gecko_MediaFeatures_ForcedColors(const Document* aDocument) {
|
|
|
|
+ return aDocument->ForcedColors();
|
2021-05-18 21:23:12 +02:00
|
|
|
}
|
|
|
|
|
2023-07-06 12:22:45 -07:00
|
|
|
bool Gecko_MediaFeatures_PrefersReducedTransparency(const Document* aDocument) {
|
2023-09-11 18:16:33 -07:00
|
|
|
diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 7e8b75f0156b059c19c9a2322087c2d79d28f961..d8899ca4ec66a1d1cafba5cb09205fa3b7d41384 100644
|
2023-09-11 18:16:33 -07:00
|
|
|
--- a/netwerk/base/LoadInfo.cpp
|
|
|
|
+++ b/netwerk/base/LoadInfo.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -647,7 +647,8 @@ LoadInfo::LoadInfo(const LoadInfo& rhs)
|
2023-09-11 18:16:33 -07:00
|
|
|
mInterceptionInfo(rhs.mInterceptionInfo),
|
|
|
|
mHasInjectedCookieForCookieBannerHandling(
|
2024-02-22 13:17:33 -08:00
|
|
|
rhs.mHasInjectedCookieForCookieBannerHandling),
|
|
|
|
- mWasSchemelessInput(rhs.mWasSchemelessInput) {
|
|
|
|
+ mWasSchemelessInput(rhs.mWasSchemelessInput),
|
|
|
|
+ mJugglerLoadIdentifier(rhs.mJugglerLoadIdentifier) {
|
|
|
|
}
|
2023-09-11 18:16:33 -07:00
|
|
|
|
|
|
|
LoadInfo::LoadInfo(
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -2363,4 +2364,16 @@ LoadInfo::SetWasSchemelessInput(bool aWasSchemelessInput) {
|
2023-09-11 18:16:33 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+LoadInfo::GetJugglerLoadIdentifier(uint64_t* aResult) {
|
|
|
|
+ *aResult = mJugglerLoadIdentifier;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+LoadInfo::SetJugglerLoadIdentifier(uint64_t aID) {
|
|
|
|
+ mJugglerLoadIdentifier = aID;
|
|
|
|
+ return NS_OK;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
} // namespace mozilla::net
|
|
|
|
diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index a8631b09b26708ca10f683f1a9dd6b8467d3fe8e..a0bd72113e3539d815d32382946581ee62f39b6c 100644
|
2023-09-11 18:16:33 -07:00
|
|
|
--- a/netwerk/base/LoadInfo.h
|
|
|
|
+++ b/netwerk/base/LoadInfo.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -401,6 +401,8 @@ class LoadInfo final : public nsILoadInfo {
|
2023-09-11 18:16:33 -07:00
|
|
|
|
|
|
|
bool mHasInjectedCookieForCookieBannerHandling = false;
|
2024-02-22 13:17:33 -08:00
|
|
|
bool mWasSchemelessInput = false;
|
2023-09-11 18:16:33 -07:00
|
|
|
+
|
|
|
|
+ uint64_t mJugglerLoadIdentifier = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
// This is exposed solely for testing purposes and should not be used outside of
|
|
|
|
diff --git a/netwerk/base/TRRLoadInfo.cpp b/netwerk/base/TRRLoadInfo.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 920e7623a7f912296fc23361f66ab35a30c35f1e..dfea0d0f7a72da9699615d7ff778e429e7ae40fb 100644
|
2023-09-11 18:16:33 -07:00
|
|
|
--- a/netwerk/base/TRRLoadInfo.cpp
|
|
|
|
+++ b/netwerk/base/TRRLoadInfo.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -861,5 +861,15 @@ TRRLoadInfo::SetWasSchemelessInput(bool aWasSchemelessInput) {
|
2023-09-11 18:16:33 -07:00
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+TRRLoadInfo::GetJugglerLoadIdentifier(uint64_t* aResult) {
|
|
|
|
+ return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+TRRLoadInfo::SetJugglerLoadIdentifier(uint64_t aResult) {
|
|
|
|
+ return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
} // namespace net
|
|
|
|
} // namespace mozilla
|
|
|
|
diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl
|
2024-02-22 13:17:33 -08:00
|
|
|
index ccceadc42ce12bec8e9878124904f0ba3914a030..56ec55af399e7b831558ca5d2a71513d9c919839 100644
|
2023-09-11 18:16:33 -07:00
|
|
|
--- a/netwerk/base/nsILoadInfo.idl
|
|
|
|
+++ b/netwerk/base/nsILoadInfo.idl
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1531,4 +1531,6 @@ interface nsILoadInfo : nsISupports
|
|
|
|
* Whether the load has gone through the URL bar, where the fixup had to add * the protocol scheme.
|
2023-09-11 18:16:33 -07:00
|
|
|
*/
|
2024-02-22 13:17:33 -08:00
|
|
|
[infallible] attribute boolean wasSchemelessInput;
|
2023-09-11 18:16:33 -07:00
|
|
|
+
|
|
|
|
+ [infallible] attribute unsigned long long jugglerLoadIdentifier;
|
|
|
|
};
|
2020-11-13 14:56:27 -08:00
|
|
|
diff --git a/netwerk/base/nsINetworkInterceptController.idl b/netwerk/base/nsINetworkInterceptController.idl
|
2023-05-18 00:50:43 +00:00
|
|
|
index d72dc570dc82ff9d576942b9e7c23d8a74d68049..a5fcddc4b0e53a862e5a77120b4ccff8a27cfbab 100644
|
2020-11-13 14:56:27 -08:00
|
|
|
--- a/netwerk/base/nsINetworkInterceptController.idl
|
|
|
|
+++ b/netwerk/base/nsINetworkInterceptController.idl
|
2021-08-11 03:37:57 +03:00
|
|
|
@@ -59,6 +59,7 @@ interface nsIInterceptedChannel : nsISupports
|
|
|
|
* results in the resulting client not being controlled.
|
2020-11-13 14:56:27 -08:00
|
|
|
*/
|
2021-08-11 03:37:57 +03:00
|
|
|
void resetInterception(in boolean bypass);
|
2020-11-13 14:56:27 -08:00
|
|
|
+ void resetInterceptionWithURI(in nsIURI aURI);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the status and reason for the forthcoming synthesized response.
|
2023-09-11 18:16:33 -07:00
|
|
|
diff --git a/netwerk/ipc/DocumentLoadListener.cpp b/netwerk/ipc/DocumentLoadListener.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 995560e4818c69f89959e36164fa9eba39925037..3d92280cfd73c5b09926151aac36857775f48e30 100644
|
2023-09-11 18:16:33 -07:00
|
|
|
--- a/netwerk/ipc/DocumentLoadListener.cpp
|
|
|
|
+++ b/netwerk/ipc/DocumentLoadListener.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -167,6 +167,7 @@ static auto CreateDocumentLoadInfo(CanonicalBrowsingContext* aBrowsingContext,
|
2023-09-11 18:16:33 -07:00
|
|
|
loadInfo->SetHasValidUserGestureActivation(
|
|
|
|
aLoadState->HasValidUserGestureActivation());
|
|
|
|
loadInfo->SetIsMetaRefresh(aLoadState->IsMetaRefresh());
|
|
|
|
+ loadInfo->SetJugglerLoadIdentifier(aLoadState->GetLoadIdentifier());
|
|
|
|
|
|
|
|
return loadInfo.forget();
|
|
|
|
}
|
2020-11-13 14:56:27 -08:00
|
|
|
diff --git a/netwerk/protocol/http/InterceptedHttpChannel.cpp b/netwerk/protocol/http/InterceptedHttpChannel.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 4bee70faf21db77daf381f40a562840470f788f4..93986ccb252bca67f2a0b291c915d523f5dad9eb 100644
|
2020-11-13 14:56:27 -08:00
|
|
|
--- a/netwerk/protocol/http/InterceptedHttpChannel.cpp
|
|
|
|
+++ b/netwerk/protocol/http/InterceptedHttpChannel.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -727,6 +727,14 @@ NS_IMPL_ISUPPORTS(ResetInterceptionHeaderVisitor, nsIHttpHeaderVisitor)
|
2023-01-23 11:29:48 -08:00
|
|
|
|
|
|
|
} // anonymous namespace
|
2020-11-13 14:56:27 -08:00
|
|
|
|
|
|
|
+NS_IMETHODIMP
|
|
|
|
+InterceptedHttpChannel::ResetInterceptionWithURI(nsIURI* aURI) {
|
|
|
|
+ if (aURI) {
|
|
|
|
+ mURI = aURI;
|
|
|
|
+ }
|
2021-08-11 03:37:57 +03:00
|
|
|
+ return ResetInterception(true);
|
2020-11-13 14:56:27 -08:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
NS_IMETHODIMP
|
2021-08-11 03:37:57 +03:00
|
|
|
InterceptedHttpChannel::ResetInterception(bool aBypass) {
|
2023-01-23 11:29:48 -08:00
|
|
|
INTERCEPTED_LOG(("InterceptedHttpChannel::ResetInterception [%p] bypass: %s",
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1070,11 +1078,18 @@ InterceptedHttpChannel::OnStartRequest(nsIRequest* aRequest) {
|
2023-03-21 01:23:12 +00:00
|
|
|
GetCallback(mProgressSink);
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Playwright: main requests in firefox do not have loading principal.
|
|
|
|
+ // As they are intercepted by Playwright, they don't have
|
|
|
|
+ // serviceWorkerTainting as well.
|
|
|
|
+ // Thus these asserts are wrong for Playwright world.
|
|
|
|
+ // Note: these checks were added in https://github.com/mozilla/gecko-dev/commit/92e2cdde79c11510c3e4192e1b6264d00398ed95
|
|
|
|
+ /*
|
|
|
|
MOZ_ASSERT_IF(!mLoadInfo->GetServiceWorkerTaintingSynthesized(),
|
|
|
|
mLoadInfo->GetLoadingPrincipal());
|
|
|
|
// No need to do ORB checks if these conditions hold.
|
|
|
|
MOZ_DIAGNOSTIC_ASSERT(mLoadInfo->GetServiceWorkerTaintingSynthesized() ||
|
|
|
|
mLoadInfo->GetLoadingPrincipal()->IsSystemPrincipal());
|
|
|
|
+ */
|
|
|
|
|
|
|
|
if (mPump && mLoadFlags & LOAD_CALL_CONTENT_SNIFFERS) {
|
|
|
|
mPump->PeekStream(CallTypeSniffers, static_cast<nsIChannel*>(this));
|
2020-03-05 17:20:07 -08:00
|
|
|
diff --git a/parser/html/nsHtml5TreeOpExecutor.cpp b/parser/html/nsHtml5TreeOpExecutor.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 125728fa73180bbe57bfc1f53379ec637f108eb7..5fd60bebebbfa0f2de99cb14762cf0d52dbdb0cb 100644
|
2020-03-05 17:20:07 -08:00
|
|
|
--- a/parser/html/nsHtml5TreeOpExecutor.cpp
|
|
|
|
+++ b/parser/html/nsHtml5TreeOpExecutor.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1376,6 +1376,10 @@ void nsHtml5TreeOpExecutor::UpdateReferrerInfoFromMeta(
|
2022-05-02 21:46:05 -06:00
|
|
|
void nsHtml5TreeOpExecutor::AddSpeculationCSP(const nsAString& aCSP) {
|
2020-03-05 17:20:07 -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
|
2023-09-11 18:16:33 -07:00
|
|
|
index b8d0bbc3a12f74c19284b26eadada361abeb7946..a50379c57158748684e2ea5065550af81c1e9b86 100644
|
2020-03-05 17:20:07 -08:00
|
|
|
--- a/security/manager/ssl/nsCertOverrideService.cpp
|
|
|
|
+++ b/security/manager/ssl/nsCertOverrideService.cpp
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -438,7 +438,12 @@ nsCertOverrideService::HasMatchingOverride(
|
2020-03-31 17:32:50 -07:00
|
|
|
bool disableAllSecurityCheck = false;
|
|
|
|
{
|
|
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
- disableAllSecurityCheck = mDisableAllSecurityCheck;
|
2021-08-11 03:37:57 +03:00
|
|
|
+ if (aOriginAttributes.mUserContextId) {
|
2020-03-31 17:32:50 -07:00
|
|
|
+ disableAllSecurityCheck = mUserContextIdsWithDisabledSecurityChecks.has(
|
2021-08-11 03:37:57 +03:00
|
|
|
+ aOriginAttributes.mUserContextId);
|
2020-03-31 17:32:50 -07:00
|
|
|
+ } else {
|
|
|
|
+ disableAllSecurityCheck = mDisableAllSecurityCheck;
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
if (disableAllSecurityCheck) {
|
2023-01-23 11:29:48 -08:00
|
|
|
*aIsTemporary = false;
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -650,14 +655,24 @@ static bool IsDebugger() {
|
2020-03-31 17:32:50 -07:00
|
|
|
|
2020-03-05 17:20:07 -08:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsCertOverrideService::
|
2020-03-31 17:32:50 -07:00
|
|
|
- SetDisableAllSecurityChecksAndLetAttackersInterceptMyData(bool aDisable) {
|
2020-03-05 17:20:07 -08:00
|
|
|
- if (!(PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR") || IsDebugger())) {
|
2020-03-31 17:32:50 -07:00
|
|
|
+ SetDisableAllSecurityChecksAndLetAttackersInterceptMyData(
|
|
|
|
+ bool aDisable, uint32_t aUserContextId) {
|
2020-03-05 17:20:07 -08:00
|
|
|
+ if (false /* juggler hacks */ && !(PR_GetEnv("XPCSHELL_TEST_PROFILE_DIR") || IsDebugger())) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
2021-08-11 03:37:57 +03:00
|
|
|
{
|
|
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
- mDisableAllSecurityCheck = aDisable;
|
|
|
|
+ if (aUserContextId) {
|
|
|
|
+ if (aDisable) {
|
|
|
|
+ mozilla::Unused << mUserContextIdsWithDisabledSecurityChecks.put(aUserContextId);
|
|
|
|
+ } else {
|
|
|
|
+ mUserContextIdsWithDisabledSecurityChecks.remove(aUserContextId);
|
|
|
|
+ }
|
|
|
|
+ return NS_OK;
|
2020-03-31 17:32:50 -07:00
|
|
|
+ } else {
|
2021-08-11 03:37:57 +03:00
|
|
|
+ mDisableAllSecurityCheck = aDisable;
|
2020-03-31 17:32:50 -07:00
|
|
|
+ }
|
2021-08-11 03:37:57 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsINSSComponent> nss(do_GetService(PSM_COMPONENT_CONTRACTID));
|
2020-03-31 17:32:50 -07:00
|
|
|
diff --git a/security/manager/ssl/nsCertOverrideService.h b/security/manager/ssl/nsCertOverrideService.h
|
2023-09-11 18:16:33 -07:00
|
|
|
index 21cff56300db6490cf9649aa62099cb5525749b3..ce9a7fc16c2d5980be166e0f4ab9a25df300ca2f 100644
|
2020-03-31 17:32:50 -07:00
|
|
|
--- a/security/manager/ssl/nsCertOverrideService.h
|
|
|
|
+++ b/security/manager/ssl/nsCertOverrideService.h
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -118,6 +118,7 @@ class nsCertOverrideService final : public nsICertOverrideService,
|
2022-07-05 08:20:01 -07:00
|
|
|
|
|
|
|
mozilla::Mutex mMutex;
|
2023-01-23 11:29:48 -08:00
|
|
|
bool mDisableAllSecurityCheck MOZ_GUARDED_BY(mMutex);
|
|
|
|
+ mozilla::HashSet<uint32_t> mUserContextIdsWithDisabledSecurityChecks MOZ_GUARDED_BY(mMutex);
|
|
|
|
nsCOMPtr<nsIFile> mSettingsFile MOZ_GUARDED_BY(mMutex);
|
|
|
|
nsTHashtable<nsCertOverrideEntry> mSettingsTable MOZ_GUARDED_BY(mMutex);
|
2022-07-05 08:20:01 -07:00
|
|
|
|
2020-03-31 17:32:50 -07:00
|
|
|
diff --git a/security/manager/ssl/nsICertOverrideService.idl b/security/manager/ssl/nsICertOverrideService.idl
|
2023-09-11 18:16:33 -07:00
|
|
|
index 6dfd07d6b676a99993408921de8dea9d561f201d..e3c6794363cd6336effbeac83a179f3796dd71b0 100644
|
2020-03-31 17:32:50 -07:00
|
|
|
--- a/security/manager/ssl/nsICertOverrideService.idl
|
|
|
|
+++ b/security/manager/ssl/nsICertOverrideService.idl
|
2023-09-11 18:16:33 -07:00
|
|
|
@@ -137,7 +137,9 @@ interface nsICertOverrideService : nsISupports {
|
2020-03-31 17:32:50 -07: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-11 03:37:57 +03:00
|
|
|
|
|
|
|
readonly attribute boolean securityCheckDisabled;
|
2020-03-31 17:32:50 -07:00
|
|
|
};
|
2023-08-10 14:41:33 -07:00
|
|
|
diff --git a/services/settings/Utils.sys.mjs b/services/settings/Utils.sys.mjs
|
2024-02-22 13:17:33 -08:00
|
|
|
index 73c83e526be1a3a252f995d0718e3975d50bffa7..4b05141c8ab8b084d977341127f36ea6d226aa9a 100644
|
2023-08-10 14:41:33 -07:00
|
|
|
--- a/services/settings/Utils.sys.mjs
|
|
|
|
+++ b/services/settings/Utils.sys.mjs
|
|
|
|
@@ -95,7 +95,7 @@ function _isUndefined(value) {
|
2022-05-02 21:46:05 -06:00
|
|
|
|
2023-08-10 14:41:33 -07:00
|
|
|
export var Utils = {
|
2022-05-02 21:46:05 -06:00
|
|
|
get SERVER_URL() {
|
2022-07-29 05:47:00 -07:00
|
|
|
- return lazy.allowServerURLOverride
|
|
|
|
+ return true || lazy.allowServerURLOverride
|
|
|
|
? lazy.gServerURL
|
2022-07-05 08:20:01 -07:00
|
|
|
: AppConstants.REMOTE_SETTINGS_SERVER_URL;
|
2022-05-02 21:46:05 -06:00
|
|
|
},
|
2021-06-08 16:00:15 -07:00
|
|
|
diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs
|
2024-02-22 13:17:33 -08:00
|
|
|
index 014248a26f7b070850edf1d7db0990fd8ef26a10..9846ae282d959c406f15052791aae3ec9351326f 100644
|
2021-06-08 16:00:15 -07:00
|
|
|
--- a/servo/components/style/gecko/media_features.rs
|
|
|
|
+++ b/servo/components/style/gecko/media_features.rs
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -293,10 +293,15 @@ pub enum ForcedColors {
|
2021-06-08 16:00:15 -07:00
|
|
|
|
|
|
|
/// https://drafts.csswg.org/mediaqueries-5/#forced-colors
|
2022-06-29 04:46:49 -07:00
|
|
|
fn eval_forced_colors(context: &Context, query_value: Option<ForcedColors>) -> bool {
|
|
|
|
- let forced = !context.device().use_document_colors();
|
2021-06-08 16:00:15 -07:00
|
|
|
+ let prefers_forced_colors =
|
2022-06-29 04:46:49 -07:00
|
|
|
+ unsafe { bindings::Gecko_MediaFeatures_ForcedColors(context.device().document()) };
|
2021-06-08 16:00:15 -07: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,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-30 00:36:46 -07:00
|
|
|
diff --git a/toolkit/components/browser/nsIWebBrowserChrome.idl b/toolkit/components/browser/nsIWebBrowserChrome.idl
|
2023-04-24 21:28:08 +00:00
|
|
|
index 54de3abab5757dd706e3d909ccef6a0bed5deacc..f5c5480cd052ede0c76e5eec733dbb9283389045 100644
|
2020-09-30 00:36:46 -07:00
|
|
|
--- a/toolkit/components/browser/nsIWebBrowserChrome.idl
|
|
|
|
+++ b/toolkit/components/browser/nsIWebBrowserChrome.idl
|
2023-04-24 21:28:08 +00:00
|
|
|
@@ -71,6 +71,9 @@ interface nsIWebBrowserChrome : nsISupports
|
2020-09-30 00:36:46 -07:00
|
|
|
// 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;
|
2023-01-23 11:29:48 -08:00
|
|
|
diff --git a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs
|
2023-11-14 10:18:18 -08:00
|
|
|
index 61eda006f090e391b3c0f209e9400920f480c115..8fea8caf17913a2736884caca8f6087f1fb48d15 100644
|
2023-01-23 11:29:48 -08:00
|
|
|
--- a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs
|
|
|
|
+++ b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.sys.mjs
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -108,6 +108,12 @@ EnterprisePoliciesManager.prototype = {
|
2021-08-25 10:26:20 -04: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) {
|
2020-03-24 20:51:21 -07:00
|
|
|
diff --git a/toolkit/components/startup/nsAppStartup.cpp b/toolkit/components/startup/nsAppStartup.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 3314cb813f6ceb67096eeda0864ad3b16c0616cb..5aac63649e186d624a9905a5d16513f8353f5515 100644
|
2020-03-24 20:51:21 -07:00
|
|
|
--- a/toolkit/components/startup/nsAppStartup.cpp
|
|
|
|
+++ b/toolkit/components/startup/nsAppStartup.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -371,7 +371,7 @@ nsAppStartup::Quit(uint32_t aMode, int aExitCode, bool* aUserAllowedQuit) {
|
2020-03-24 20:51:21 -07: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;
|
2019-11-18 18:18:28 -08:00
|
|
|
diff --git a/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp b/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp
|
2023-05-18 00:50:43 +00:00
|
|
|
index 654903fadb709be976b72f36f155e23bc0622152..815b3dc24c9fda6b1db6c4666ac68904c87ac0ab 100644
|
2019-11-18 18:18:28 -08:00
|
|
|
--- a/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp
|
|
|
|
+++ b/toolkit/components/statusfilter/nsBrowserStatusFilter.cpp
|
2021-09-08 16:47:26 +03:00
|
|
|
@@ -174,8 +174,8 @@ nsBrowserStatusFilter::OnStateChange(nsIWebProgress* aWebProgress,
|
2019-11-18 18:18:28 -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,
|
2020-09-30 00:36:46 -07:00
|
|
|
diff --git a/toolkit/components/windowwatcher/nsWindowWatcher.cpp b/toolkit/components/windowwatcher/nsWindowWatcher.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index 144924a7a6b3d11c0de3992d1e1f99a04f7611b4..b7646200f7843d42ef3fb1919e5a1d3057eaf14c 100644
|
2020-09-30 00:36:46 -07:00
|
|
|
--- a/toolkit/components/windowwatcher/nsWindowWatcher.cpp
|
|
|
|
+++ b/toolkit/components/windowwatcher/nsWindowWatcher.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -1880,7 +1880,11 @@ uint32_t nsWindowWatcher::CalculateChromeFlagsForContent(
|
2020-09-30 00:36:46 -07:00
|
|
|
|
2022-01-18 04:16:04 -07:00
|
|
|
// Open a minimal popup.
|
|
|
|
*aIsPopupRequested = true;
|
|
|
|
- return nsIWebBrowserChrome::CHROME_MINIMAL_POPUP;
|
|
|
|
+ uint32_t chromeFlags = 0;
|
2020-09-30 00:36:46 -07:00
|
|
|
+ if (aFeatures.Exists("width") || aFeatures.Exists("height")) {
|
|
|
|
+ chromeFlags |= nsIWebBrowserChrome::JUGGLER_WINDOW_EXPLICIT_SIZE;
|
|
|
|
+ }
|
2022-01-18 04:16:04 -07:00
|
|
|
+ return chromeFlags | nsIWebBrowserChrome::CHROME_MINIMAL_POPUP;
|
2020-09-30 00:36:46 -07:00
|
|
|
}
|
|
|
|
|
2022-01-18 04:16:04 -07:00
|
|
|
/**
|
2023-07-06 12:22:45 -07:00
|
|
|
diff --git a/toolkit/mozapps/update/UpdateService.sys.mjs b/toolkit/mozapps/update/UpdateService.sys.mjs
|
2024-02-22 13:17:33 -08:00
|
|
|
index fcb142e5d74ab40515fd6e3b7848a661771d459c..592d4b759958283b1c53c52a648f35f97110705b 100644
|
2023-07-06 12:22:45 -07:00
|
|
|
--- a/toolkit/mozapps/update/UpdateService.sys.mjs
|
|
|
|
+++ b/toolkit/mozapps/update/UpdateService.sys.mjs
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -3853,6 +3853,8 @@ UpdateService.prototype = {
|
2021-07-14 08:26:43 -08:00
|
|
|
},
|
2020-03-22 23:52:59 -07:00
|
|
|
|
2021-07-14 08:26:43 -08:00
|
|
|
get disabledForTesting() {
|
2023-07-06 12:22:45 -07:00
|
|
|
+ /* playwright */
|
2022-06-29 04:46:49 -07:00
|
|
|
+ return true;
|
|
|
|
return (
|
2022-07-29 05:47:00 -07:00
|
|
|
(Cu.isInAutomation ||
|
|
|
|
lazy.Marionette.running ||
|
2019-11-18 18:18:28 -08:00
|
|
|
diff --git a/toolkit/toolkit.mozbuild b/toolkit/toolkit.mozbuild
|
2024-02-22 13:17:33 -08:00
|
|
|
index 2e3721e8a5807936c02cce6c21240df3b4c92c97..ecd1ca11d96c14ba6db4b09d4d9c10ef757e690b 100644
|
2019-11-18 18:18:28 -08:00
|
|
|
--- a/toolkit/toolkit.mozbuild
|
|
|
|
+++ b/toolkit/toolkit.mozbuild
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -155,6 +155,7 @@ if CONFIG['ENABLE_WEBDRIVER']:
|
2021-07-14 08:26:43 -08:00
|
|
|
'/remote',
|
2019-11-18 18:18:28 -08:00
|
|
|
'/testing/firefox-ui',
|
|
|
|
'/testing/marionette',
|
2020-03-05 17:20:07 -08:00
|
|
|
+ '/juggler',
|
2019-11-18 18:18:28 -08:00
|
|
|
'/toolkit/components/telemetry/tests/marionette',
|
|
|
|
]
|
|
|
|
|
browser(firefox): properly initialize debugging pipe on windows (#5514)
browser(firefox): properly initialize debugging pipe on windows
Firefox on Windows has 2 launch modes:
- default: a special "launcher process" is used to start browser as a
sub-process
- non-default: browser process starts right away
Firefox has a logic to detect how successful was the use of the
launcher process to do self-recovery when things go wrong. Namely:
- when attempting to use launcher process, firefox records a timestamp
of the attempt beginning
- once the launcher process successfully launches browser sub-process,
firefox records another timestamp of the completion
On a new launch, firefox checks what timestamps are present. If there's
a timestamp that signifies start of launcher process, but no successful
timestamp, it decides that last "launcher process" use was not
successful and falls back to launching browser right away.
When launching 2 firefox processes right away, the first process
uses attempts to use launcher process and records the first timestamp.
At the same time, the second instance sees the first timestamp and
doesn't see the second timestamp, and falls back to launching browser
right away. Our debugging pipe code, however, does not support
non-launcher-process code path.
This patch adds support for remote debugging pipe in case of
non-launcher-process startup.
Drive-by:
- disable crashreporter altogether
- remove stray dcheck that breaks firefox debug compilation
- disable compilation of firefox update agent
- do not use WIN32_DISTRIB flag unless doing full builds since
it kills incremental compilation
References #4660
2021-02-19 10:32:47 -08:00
|
|
|
diff --git a/toolkit/xre/nsWindowsWMain.cpp b/toolkit/xre/nsWindowsWMain.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
index 7eb9e1104682d4eb47060654f43a1efa8b2a6bb2..a8315d6decf654b5302bea5beeea34140c300ded 100644
|
browser(firefox): properly initialize debugging pipe on windows (#5514)
browser(firefox): properly initialize debugging pipe on windows
Firefox on Windows has 2 launch modes:
- default: a special "launcher process" is used to start browser as a
sub-process
- non-default: browser process starts right away
Firefox has a logic to detect how successful was the use of the
launcher process to do self-recovery when things go wrong. Namely:
- when attempting to use launcher process, firefox records a timestamp
of the attempt beginning
- once the launcher process successfully launches browser sub-process,
firefox records another timestamp of the completion
On a new launch, firefox checks what timestamps are present. If there's
a timestamp that signifies start of launcher process, but no successful
timestamp, it decides that last "launcher process" use was not
successful and falls back to launching browser right away.
When launching 2 firefox processes right away, the first process
uses attempts to use launcher process and records the first timestamp.
At the same time, the second instance sees the first timestamp and
doesn't see the second timestamp, and falls back to launching browser
right away. Our debugging pipe code, however, does not support
non-launcher-process code path.
This patch adds support for remote debugging pipe in case of
non-launcher-process startup.
Drive-by:
- disable crashreporter altogether
- remove stray dcheck that breaks firefox debug compilation
- disable compilation of firefox update agent
- do not use WIN32_DISTRIB flag unless doing full builds since
it kills incremental compilation
References #4660
2021-02-19 10:32:47 -08:00
|
|
|
--- a/toolkit/xre/nsWindowsWMain.cpp
|
|
|
|
+++ b/toolkit/xre/nsWindowsWMain.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -14,8 +14,10 @@
|
browser(firefox): properly initialize debugging pipe on windows (#5514)
browser(firefox): properly initialize debugging pipe on windows
Firefox on Windows has 2 launch modes:
- default: a special "launcher process" is used to start browser as a
sub-process
- non-default: browser process starts right away
Firefox has a logic to detect how successful was the use of the
launcher process to do self-recovery when things go wrong. Namely:
- when attempting to use launcher process, firefox records a timestamp
of the attempt beginning
- once the launcher process successfully launches browser sub-process,
firefox records another timestamp of the completion
On a new launch, firefox checks what timestamps are present. If there's
a timestamp that signifies start of launcher process, but no successful
timestamp, it decides that last "launcher process" use was not
successful and falls back to launching browser right away.
When launching 2 firefox processes right away, the first process
uses attempts to use launcher process and records the first timestamp.
At the same time, the second instance sees the first timestamp and
doesn't see the second timestamp, and falls back to launching browser
right away. Our debugging pipe code, however, does not support
non-launcher-process code path.
This patch adds support for remote debugging pipe in case of
non-launcher-process startup.
Drive-by:
- disable crashreporter altogether
- remove stray dcheck that breaks firefox debug compilation
- disable compilation of firefox update agent
- do not use WIN32_DISTRIB flag unless doing full builds since
it kills incremental compilation
References #4660
2021-02-19 10:32:47 -08:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "mozilla/Char16.h"
|
|
|
|
+#include "mozilla/CmdLineAndEnvUtils.h"
|
|
|
|
#include "nsUTF8Utils.h"
|
|
|
|
|
|
|
|
+#include <io.h>
|
|
|
|
#include <windows.h>
|
|
|
|
|
2023-11-14 10:18:18 -08:00
|
|
|
#ifdef __MINGW32__
|
|
|
|
@@ -114,6 +116,19 @@ static void FreeAllocStrings(int argc, char** argv) {
|
|
|
|
int wmain(int argc, WCHAR** argv) {
|
browser(firefox): properly initialize debugging pipe on windows (#5514)
browser(firefox): properly initialize debugging pipe on windows
Firefox on Windows has 2 launch modes:
- default: a special "launcher process" is used to start browser as a
sub-process
- non-default: browser process starts right away
Firefox has a logic to detect how successful was the use of the
launcher process to do self-recovery when things go wrong. Namely:
- when attempting to use launcher process, firefox records a timestamp
of the attempt beginning
- once the launcher process successfully launches browser sub-process,
firefox records another timestamp of the completion
On a new launch, firefox checks what timestamps are present. If there's
a timestamp that signifies start of launcher process, but no successful
timestamp, it decides that last "launcher process" use was not
successful and falls back to launching browser right away.
When launching 2 firefox processes right away, the first process
uses attempts to use launcher process and records the first timestamp.
At the same time, the second instance sees the first timestamp and
doesn't see the second timestamp, and falls back to launching browser
right away. Our debugging pipe code, however, does not support
non-launcher-process code path.
This patch adds support for remote debugging pipe in case of
non-launcher-process startup.
Drive-by:
- disable crashreporter altogether
- remove stray dcheck that breaks firefox debug compilation
- disable compilation of firefox update agent
- do not use WIN32_DISTRIB flag unless doing full builds since
it kills incremental compilation
References #4660
2021-02-19 10:32:47 -08:00
|
|
|
SanitizeEnvironmentVariables();
|
|
|
|
SetDllDirectoryW(L"");
|
|
|
|
+ bool hasJugglerPipe =
|
2023-01-23 11:29:48 -08:00
|
|
|
+ mozilla::CheckArg(argc, argv, "juggler-pipe", nullptr,
|
browser(firefox): properly initialize debugging pipe on windows (#5514)
browser(firefox): properly initialize debugging pipe on windows
Firefox on Windows has 2 launch modes:
- default: a special "launcher process" is used to start browser as a
sub-process
- non-default: browser process starts right away
Firefox has a logic to detect how successful was the use of the
launcher process to do self-recovery when things go wrong. Namely:
- when attempting to use launcher process, firefox records a timestamp
of the attempt beginning
- once the launcher process successfully launches browser sub-process,
firefox records another timestamp of the completion
On a new launch, firefox checks what timestamps are present. If there's
a timestamp that signifies start of launcher process, but no successful
timestamp, it decides that last "launcher process" use was not
successful and falls back to launching browser right away.
When launching 2 firefox processes right away, the first process
uses attempts to use launcher process and records the first timestamp.
At the same time, the second instance sees the first timestamp and
doesn't see the second timestamp, and falls back to launching browser
right away. Our debugging pipe code, however, does not support
non-launcher-process code path.
This patch adds support for remote debugging pipe in case of
non-launcher-process startup.
Drive-by:
- disable crashreporter altogether
- remove stray dcheck that breaks firefox debug compilation
- disable compilation of firefox update agent
- do not use WIN32_DISTRIB flag unless doing full builds since
it kills incremental compilation
References #4660
2021-02-19 10:32:47 -08:00
|
|
|
+ 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.
|
2019-11-18 18:18:28 -08:00
|
|
|
diff --git a/uriloader/base/nsDocLoader.cpp b/uriloader/base/nsDocLoader.cpp
|
2024-02-22 13:17:33 -08:00
|
|
|
index d54be4a4d7697851cc5279a39a49b06c745b7630..abb455116db3011dc7f84df86631da5eb7030700 100644
|
2019-11-18 18:18:28 -08:00
|
|
|
--- a/uriloader/base/nsDocLoader.cpp
|
|
|
|
+++ b/uriloader/base/nsDocLoader.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -828,6 +828,13 @@ void nsDocLoader::DocLoaderIsEmpty(bool aFlushLayout,
|
2019-12-11 17:53:46 -08:00
|
|
|
("DocLoader:%p: Firing load event for document.open\n",
|
|
|
|
this));
|
|
|
|
|
|
|
|
+ nsCOMPtr<nsIObserverService> os = mozilla::services::GetObserverService();
|
|
|
|
+ if (os) {
|
|
|
|
+ nsIPrincipal* principal = doc->NodePrincipal();
|
2020-01-11 01:20:39 +01:00
|
|
|
+ if (!principal->IsSystemPrincipal())
|
2019-12-11 17:53:46 -08:00
|
|
|
+ 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
|
2020-04-06 23:34:30 -07:00
|
|
|
diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp
|
2023-11-14 10:18:18 -08:00
|
|
|
index 4573e28470c5112f5ac2c5dd53e7a9d1ceedb943..b53b86d8e39f1de4b0d0f1a8d5d7295ea050b878 100644
|
2020-04-06 23:34:30 -07:00
|
|
|
--- a/uriloader/exthandler/nsExternalHelperAppService.cpp
|
|
|
|
+++ b/uriloader/exthandler/nsExternalHelperAppService.cpp
|
2023-01-23 11:29:48 -08:00
|
|
|
@@ -112,6 +112,7 @@
|
2020-04-06 23:34:30 -07:00
|
|
|
|
|
|
|
#include "mozilla/Components.h"
|
|
|
|
#include "mozilla/ClearOnShutdown.h"
|
|
|
|
+#include "mozilla/ErrorNames.h"
|
|
|
|
#include "mozilla/Preferences.h"
|
|
|
|
#include "mozilla/ipc/URIUtils.h"
|
|
|
|
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -831,6 +832,12 @@ NS_IMETHODIMP nsExternalHelperAppService::ApplyDecodingForExtension(
|
2020-04-06 23:34:30 -07: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);
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -1442,7 +1449,12 @@ nsresult nsExternalAppHandler::SetUpTempFile(nsIChannel* aChannel) {
|
2020-04-06 23:34:30 -07: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);
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -1631,7 +1643,36 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
|
2020-04-06 23:34:30 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
- rv = SetUpTempFile(aChannel);
|
|
|
|
+ bool isIntercepted = false;
|
|
|
|
+ nsCOMPtr<nsIDownloadInterceptor> interceptor = mExtProtSvc->mInterceptor;
|
|
|
|
+ if (interceptor) {
|
|
|
|
+ nsCOMPtr<nsIFile> fileToUse;
|
2020-04-23 14:26:00 -07:00
|
|
|
+ rv = interceptor->InterceptDownloadRequest(this, request, mBrowsingContext, getter_AddRefs(fileToUse), &isIntercepted);
|
2020-04-06 23:34:30 -07:00
|
|
|
+ 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;
|
|
|
|
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -1683,6 +1724,9 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
|
2020-08-12 10:09:20 -07:00
|
|
|
|
2021-12-07 11:53:17 -08:00
|
|
|
bool alwaysAsk = true;
|
|
|
|
mMimeInfo->GetAlwaysAskBeforeHandling(&alwaysAsk);
|
2020-04-06 23:34:30 -07: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
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -2199,6 +2243,16 @@ nsExternalAppHandler::OnSaveComplete(nsIBackgroundFileSaver* aSaver,
|
2020-04-06 23:34:30 -07: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");
|
2020-07-02 10:43:04 -07:00
|
|
|
+ Unused << rv;
|
2020-04-06 23:34:30 -07:00
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -2680,6 +2734,15 @@ NS_IMETHODIMP nsExternalAppHandler::Cancel(nsresult aReason) {
|
2020-04-06 23:34:30 -07: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");
|
2020-07-02 10:43:04 -07:00
|
|
|
+ Unused << rv;
|
2020-04-06 23:34:30 -07:00
|
|
|
+ }
|
|
|
|
+
|
|
|
|
// 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
|
2023-11-14 10:18:18 -08:00
|
|
|
index 205f73cfa127e15e171854165c92551fea957e84..6399525ea0abb55655c824b086a043d022392113 100644
|
2020-04-06 23:34:30 -07:00
|
|
|
--- a/uriloader/exthandler/nsExternalHelperAppService.h
|
|
|
|
+++ b/uriloader/exthandler/nsExternalHelperAppService.h
|
2023-06-06 15:08:23 -07:00
|
|
|
@@ -257,6 +257,8 @@ class nsExternalHelperAppService : public nsIExternalHelperAppService,
|
2020-04-06 23:34:30 -07:00
|
|
|
mozilla::dom::BrowsingContext* aContentContext, bool aForceSave,
|
|
|
|
nsIInterfaceRequestor* aWindowContext,
|
|
|
|
nsIStreamListener** aStreamListener);
|
|
|
|
+
|
|
|
|
+ nsCOMPtr<nsIDownloadInterceptor> mInterceptor;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -462,6 +464,9 @@ class nsExternalAppHandler final : public nsIStreamListener,
|
2020-04-06 23:34:30 -07: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
|
2023-11-14 10:18:18 -08:00
|
|
|
index 4a399acb72d4fd475c9ae43e9eadbc32f261e290..31e9490a7dfd7d7eff69ad23c9ce277f367d1524 100644
|
2020-04-06 23:34:30 -07:00
|
|
|
--- a/uriloader/exthandler/nsIExternalHelperAppService.idl
|
|
|
|
+++ b/uriloader/exthandler/nsIExternalHelperAppService.idl
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -6,8 +6,11 @@
|
2020-04-06 23:34:30 -07:00
|
|
|
|
|
|
|
#include "nsICancelable.idl"
|
|
|
|
|
2020-04-23 14:26:00 -07:00
|
|
|
+webidl BrowsingContext;
|
2020-04-06 23:34:30 -07:00
|
|
|
+interface nsIHelperAppLauncher;
|
|
|
|
interface nsIURI;
|
2023-11-14 10:18:18 -08:00
|
|
|
interface nsIChannel;
|
|
|
|
+interface nsIRequest;
|
2020-04-06 23:34:30 -07:00
|
|
|
interface nsIStreamListener;
|
2023-11-14 10:18:18 -08:00
|
|
|
interface nsIFile;
|
|
|
|
interface nsIMIMEInfo;
|
|
|
|
@@ -15,6 +18,17 @@ interface nsIWebProgressListener2;
|
2020-10-07 14:12:19 -07:00
|
|
|
interface nsIInterfaceRequestor;
|
|
|
|
webidl BrowsingContext;
|
2020-04-06 23:34:30 -07:00
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * Interceptor interface used by Juggler.
|
|
|
|
+ */
|
|
|
|
+[scriptable, uuid(9a20e9b0-75d0-11ea-bc55-0242ac130003)]
|
|
|
|
+interface nsIDownloadInterceptor : nsISupports
|
|
|
|
+{
|
2020-04-23 14:26:00 -07:00
|
|
|
+ bool interceptDownloadRequest(in nsIHelperAppLauncher aHandler, in nsIRequest aRequest, in BrowsingContext aBrowsingContext, out nsIFile file);
|
2020-04-06 23:34:30 -07:00
|
|
|
+
|
|
|
|
+ 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.
|
2023-11-14 10:18:18 -08:00
|
|
|
@@ -76,6 +90,7 @@ interface nsIExternalHelperAppService : nsISupports
|
2020-04-06 23:34:30 -07:00
|
|
|
boolean applyDecodingForExtension(in AUTF8String aExtension,
|
|
|
|
in ACString aEncodingType);
|
|
|
|
|
|
|
|
+ void setDownloadInterceptor(in nsIDownloadInterceptor interceptor);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2020-07-15 09:37:08 -07:00
|
|
|
diff --git a/widget/InProcessCompositorWidget.cpp b/widget/InProcessCompositorWidget.cpp
|
2022-01-18 04:16:04 -07:00
|
|
|
index 1c25e9d9a101233f71e92288a0f93125b81ac1c5..22cf67b0f6e3ddd2b3ed725a314ba6a9896abd1c 100644
|
2020-07-15 09:37:08 -07:00
|
|
|
--- a/widget/InProcessCompositorWidget.cpp
|
|
|
|
+++ b/widget/InProcessCompositorWidget.cpp
|
2020-12-17 21:02:01 -08:00
|
|
|
@@ -4,7 +4,10 @@
|
2020-07-15 09:37:08 -07:00
|
|
|
|
|
|
|
#include "InProcessCompositorWidget.h"
|
|
|
|
|
|
|
|
+#include "HeadlessCompositorWidget.h"
|
|
|
|
+#include "HeadlessWidget.h"
|
|
|
|
#include "mozilla/VsyncDispatcher.h"
|
2020-12-17 21:02:01 -08:00
|
|
|
+#include "mozilla/widget/PlatformWidgetTypes.h"
|
2020-07-15 09:37:08 -07:00
|
|
|
#include "nsBaseWidget.h"
|
|
|
|
|
2022-01-18 04:16:04 -07:00
|
|
|
namespace mozilla {
|
|
|
|
@@ -23,6 +26,12 @@ RefPtr<CompositorWidget> CompositorWidget::CreateLocal(
|
2021-04-01 18:49:01 -05:00
|
|
|
// do it after the static_cast.
|
|
|
|
nsBaseWidget* widget = static_cast<nsBaseWidget*>(aWidget);
|
|
|
|
MOZ_RELEASE_ASSERT(widget);
|
2020-07-15 09:37:08 -07:00
|
|
|
+ if (aInitData.type() ==
|
|
|
|
+ CompositorWidgetInitData::THeadlessCompositorWidgetInitData) {
|
|
|
|
+ return new HeadlessCompositorWidget(
|
|
|
|
+ aInitData.get_HeadlessCompositorWidgetInitData(), aOptions,
|
|
|
|
+ static_cast<HeadlessWidget*>(aWidget));
|
|
|
|
+ }
|
2022-01-18 04:16:04 -07:00
|
|
|
return new InProcessCompositorWidget(aOptions, widget);
|
|
|
|
}
|
|
|
|
#endif
|
2023-06-06 15:08:23 -07:00
|
|
|
diff --git a/widget/MouseEvents.h b/widget/MouseEvents.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index 7ad7d82cd68810d9557adaa31ad5c7cb80bfb079..7a3d0116ce924e1e26a1cc6976abe11ed6f4a62c 100644
|
2023-06-06 15:08:23 -07:00
|
|
|
--- a/widget/MouseEvents.h
|
|
|
|
+++ b/widget/MouseEvents.h
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -258,6 +258,7 @@ class WidgetMouseEvent : public WidgetMouseEventBase,
|
2023-06-06 15:08:23 -07:00
|
|
|
: mReason(eReal),
|
|
|
|
mContextMenuTrigger(eNormal),
|
|
|
|
mClickCount(0),
|
|
|
|
+ mJugglerEventId(0),
|
|
|
|
mIgnoreRootScrollFrame(false),
|
|
|
|
mClickEventPrevented(false) {}
|
2024-01-13 00:19:49 +01:00
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -269,6 +270,7 @@ class WidgetMouseEvent : public WidgetMouseEventBase,
|
2023-06-06 15:08:23 -07:00
|
|
|
mReason(aReason),
|
|
|
|
mContextMenuTrigger(eNormal),
|
|
|
|
mClickCount(0),
|
|
|
|
+ mJugglerEventId(0),
|
|
|
|
mIgnoreRootScrollFrame(false),
|
|
|
|
mClickEventPrevented(false) {}
|
2024-01-13 00:19:49 +01:00
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -288,6 +290,7 @@ class WidgetMouseEvent : public WidgetMouseEventBase,
|
2023-06-06 15:08:23 -07:00
|
|
|
mReason(aReason),
|
|
|
|
mContextMenuTrigger(aContextMenuTrigger),
|
|
|
|
mClickCount(0),
|
|
|
|
+ mJugglerEventId(0),
|
|
|
|
mIgnoreRootScrollFrame(false),
|
|
|
|
mClickEventPrevented(false) {
|
2024-01-13 00:19:49 +01:00
|
|
|
if (aMessage == eContextMenu) {
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -336,6 +339,9 @@ class WidgetMouseEvent : public WidgetMouseEventBase,
|
2023-06-06 15:08:23 -07:00
|
|
|
// Otherwise, this must be 0.
|
|
|
|
uint32_t mClickCount;
|
|
|
|
|
|
|
|
+ // Unique event ID
|
|
|
|
+ uint32_t mJugglerEventId;
|
|
|
|
+
|
|
|
|
// Whether the event should ignore scroll frame bounds during dispatch.
|
|
|
|
bool mIgnoreRootScrollFrame;
|
|
|
|
|
2024-02-22 13:17:33 -08:00
|
|
|
@@ -348,6 +354,7 @@ class WidgetMouseEvent : public WidgetMouseEventBase,
|
2023-06-06 15:08:23 -07:00
|
|
|
|
|
|
|
mExitFrom = aEvent.mExitFrom;
|
|
|
|
mClickCount = aEvent.mClickCount;
|
|
|
|
+ mJugglerEventId = aEvent.mJugglerEventId;
|
|
|
|
mIgnoreRootScrollFrame = aEvent.mIgnoreRootScrollFrame;
|
|
|
|
mClickEventPrevented = aEvent.mClickEventPrevented;
|
2024-01-13 00:19:49 +01:00
|
|
|
}
|
2021-04-01 11:27:44 -07:00
|
|
|
diff --git a/widget/cocoa/NativeKeyBindings.mm b/widget/cocoa/NativeKeyBindings.mm
|
2024-01-13 00:19:49 +01:00
|
|
|
index e4bdf715e2fb899e97a5bfeb2e147127460d6047..3554f919480278b7353617481c7ce8050630a1aa 100644
|
2021-04-01 11:27:44 -07:00
|
|
|
--- a/widget/cocoa/NativeKeyBindings.mm
|
|
|
|
+++ b/widget/cocoa/NativeKeyBindings.mm
|
2024-01-13 00:19:49 +01:00
|
|
|
@@ -528,6 +528,13 @@
|
2021-04-01 11:27:44 -07: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())) {
|
2024-01-13 00:19:49 +01:00
|
|
|
@@ -550,6 +557,13 @@
|
2021-04-01 11:27:44 -07: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())) {
|
2024-01-13 00:19:49 +01:00
|
|
|
@@ -572,6 +586,10 @@
|
2021-04-01 11:27:44 -07: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()) {
|
2024-01-13 00:19:49 +01:00
|
|
|
@@ -582,7 +600,7 @@
|
2021-04-01 11:27:44 -07:00
|
|
|
!aEvent.IsShift()
|
|
|
|
? ToObjcSelectorPtr(@selector(moveToBeginningOfDocument:))
|
2024-01-13 00:19:49 +01:00
|
|
|
: ToObjcSelectorPtr(
|
|
|
|
- @selector(moveToBegginingOfDocumentAndModifySelection:)),
|
|
|
|
+ @selector(moveToBeginningOfDocumentAndModifySelection:)),
|
2021-04-01 11:27:44 -07:00
|
|
|
aCommands);
|
|
|
|
break;
|
|
|
|
}
|
2024-01-13 00:19:49 +01:00
|
|
|
@@ -609,6 +627,10 @@
|
2021-04-01 11:27:44 -07: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()) {
|
2024-02-22 13:17:33 -08:00
|
|
|
diff --git a/widget/cocoa/nsCocoaUtils.mm b/widget/cocoa/nsCocoaUtils.mm
|
|
|
|
index f3a760476290953df2179fa44bd68dd171d291ab..6cd3f8178d260904905372c1afc7ecbcc568fbc8 100644
|
|
|
|
--- a/widget/cocoa/nsCocoaUtils.mm
|
|
|
|
+++ b/widget/cocoa/nsCocoaUtils.mm
|
|
|
|
@@ -267,14 +267,17 @@ static float MenuBarScreenHeight() {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
- nsCOMPtr<nsIWidget> hiddenWindowWidget;
|
|
|
|
+ nsCOMPtr<nsIWidget> mainWindowWidget;
|
|
|
|
if (NS_FAILED(baseHiddenWindow->GetMainWidget(
|
|
|
|
- getter_AddRefs(hiddenWindowWidget)))) {
|
|
|
|
+ getter_AddRefs(mainWindowWidget)))) {
|
|
|
|
NS_WARNING("Couldn't get nsIWidget from hidden window (nsIBaseWindow)");
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
- return hiddenWindowWidget;
|
|
|
|
+ // In the case of headless mode, it's a HeadlessWidget while the callee expects a nsCocoaWindow
|
|
|
|
+ if (gfxPlatform::IsHeadless())
|
|
|
|
+ return nullptr;
|
|
|
|
+ return mainWindowWidget;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOL nsCocoaUtils::WasLaunchedAtLogin() {
|
2020-07-14 11:20:36 -07:00
|
|
|
diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
|
2023-08-10 14:41:33 -07:00
|
|
|
index bb4ee9175e66dc40de1871a7f91368fe309494a3..747625e3869882300bfbc18b184db5151dd90c1a 100644
|
2020-07-14 11:20:36 -07: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"
|
2023-08-10 14:41:33 -07:00
|
|
|
@@ -15,9 +16,32 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
|
|
|
|
const layers::CompositorOptions& aOptions, HeadlessWidget* aWindow)
|
2023-04-24 21:28:08 +00:00
|
|
|
: CompositorWidget(aOptions),
|
|
|
|
mWidget(aWindow),
|
2023-08-10 14:41:33 -07:00
|
|
|
+ mMon("snapshotListener"),
|
2023-04-24 21:28:08 +00:00
|
|
|
mClientSize(LayoutDeviceIntSize(aInitData.InitialClientSize()),
|
2023-08-10 14:41:33 -07:00
|
|
|
"HeadlessCompositorWidget::mClientSize") {}
|
|
|
|
|
2020-07-14 11:20:36 -07:00
|
|
|
+void HeadlessCompositorWidget::SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener) {
|
|
|
|
+ MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
+
|
2021-12-13 21:23:25 -08:00
|
|
|
+ ReentrantMonitorAutoEnter lock(mMon);
|
2020-07-14 11:20:36 -07:00
|
|
|
+ mSnapshotListener = std::move(listener);
|
2021-12-13 21:23:25 -08:00
|
|
|
+ layers::CompositorThread()->Dispatch(NewRunnableMethod(
|
|
|
|
+ "HeadlessCompositorWidget::PeriodicSnapshot", this,
|
|
|
|
+ &HeadlessCompositorWidget::PeriodicSnapshot
|
|
|
|
+ ));
|
2020-07-14 11:20:36 -07:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+already_AddRefed<gfx::DrawTarget> HeadlessCompositorWidget::StartRemoteDrawingInRegion(
|
2021-04-01 18:49:01 -05:00
|
|
|
+ const LayoutDeviceIntRegion& aInvalidRegion,
|
|
|
|
+ layers::BufferMode* aBufferMode) {
|
2020-07-14 11:20:36 -07:00
|
|
|
+ if (!mDrawTarget)
|
|
|
|
+ return nullptr;
|
|
|
|
+
|
|
|
|
+ *aBufferMode = layers::BufferMode::BUFFER_NONE;
|
|
|
|
+ RefPtr<gfx::DrawTarget> result = mDrawTarget;
|
|
|
|
+ return result.forget();
|
|
|
|
+}
|
2023-08-10 14:41:33 -07:00
|
|
|
+
|
2020-07-14 11:20:36 -07:00
|
|
|
void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) {
|
|
|
|
if (RefPtr<CompositorVsyncDispatcher> cvd =
|
2023-08-10 14:41:33 -07:00
|
|
|
mWidget->GetCompositorVsyncDispatcher()) {
|
2023-04-24 21:28:08 +00:00
|
|
|
@@ -31,6 +55,59 @@ void HeadlessCompositorWidget::NotifyClientSizeChanged(
|
2020-07-14 11:20:36 -07:00
|
|
|
const LayoutDeviceIntSize& aClientSize) {
|
2023-04-24 21:28:08 +00:00
|
|
|
auto size = mClientSize.Lock();
|
|
|
|
*size = aClientSize;
|
2020-07-20 14:24:52 -07:00
|
|
|
+ layers::CompositorThread()->Dispatch(NewRunnableMethod<LayoutDeviceIntSize>(
|
|
|
|
+ "HeadlessCompositorWidget::UpdateDrawTarget", this,
|
|
|
|
+ &HeadlessCompositorWidget::UpdateDrawTarget,
|
|
|
|
+ aClientSize));
|
2020-07-14 11:20:36 -07:00
|
|
|
+}
|
|
|
|
+
|
2020-07-20 14:24:52 -07:00
|
|
|
+void HeadlessCompositorWidget::UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize) {
|
|
|
|
+ MOZ_ASSERT(NS_IsInCompositorThread());
|
|
|
|
+ if (aClientSize.IsEmpty()) {
|
2020-07-14 11:20:36 -07:00
|
|
|
+ mDrawTarget = nullptr;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
2020-07-20 14:24:52 -07:00
|
|
|
+ RefPtr<gfx::DrawTarget> old = std::move(mDrawTarget);
|
2020-07-14 11:20:36 -07:00
|
|
|
+ gfx::SurfaceFormat format = gfx::SurfaceFormat::B8G8R8A8;
|
2020-07-20 14:24:52 -07:00
|
|
|
+ gfx::IntSize size = aClientSize.ToUnknownSize();
|
2020-07-14 11:20:36 -07:00
|
|
|
+ mDrawTarget = mozilla::gfx::Factory::CreateDrawTarget(
|
|
|
|
+ mozilla::gfx::BackendType::SKIA, size, format);
|
2020-07-20 14:24:52 -07:00
|
|
|
+ if (old) {
|
|
|
|
+ RefPtr<gfx::SourceSurface> snapshot = old->Snapshot();
|
|
|
|
+ if (snapshot)
|
|
|
|
+ mDrawTarget->CopySurface(snapshot.get(), old->GetRect(), gfx::IntPoint(0, 0));
|
|
|
|
+ }
|
2020-07-15 09:37:08 -07:00
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HeadlessCompositorWidget::PeriodicSnapshot() {
|
2021-12-13 21:23:25 -08:00
|
|
|
+ ReentrantMonitorAutoEnter lock(mMon);
|
2020-08-04 17:58:57 -07:00
|
|
|
+ if (!mSnapshotListener)
|
2020-07-15 09:37:08 -07:00
|
|
|
+ return;
|
|
|
|
+
|
2020-08-04 17:58:57 -07:00
|
|
|
+ TakeSnapshot();
|
|
|
|
+ NS_DelayedDispatchToCurrentThread(NewRunnableMethod(
|
|
|
|
+ "HeadlessCompositorWidget::PeriodicSnapshot", this,
|
|
|
|
+ &HeadlessCompositorWidget::PeriodicSnapshot), 40);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void HeadlessCompositorWidget::TakeSnapshot() {
|
|
|
|
+ if (!mDrawTarget)
|
2020-07-15 09:37:08 -07:00
|
|
|
+ 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));
|
2020-07-14 11:20:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() {
|
|
|
|
diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
|
2023-04-24 21:28:08 +00:00
|
|
|
index facd2bc65afab8ec1aa322faa20a67464964dfb9..d6dea95472bec6006411753c3dfdab2e3659171f 100644
|
2020-07-14 11:20:36 -07:00
|
|
|
--- a/widget/headless/HeadlessCompositorWidget.h
|
|
|
|
+++ b/widget/headless/HeadlessCompositorWidget.h
|
2021-12-13 21: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,
|
2020-07-14 11:20:36 -07:00
|
|
|
HeadlessWidget* aWindow);
|
|
|
|
|
|
|
|
void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize);
|
|
|
|
+ void SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener);
|
|
|
|
|
|
|
|
// CompositorWidget Overrides
|
|
|
|
+ already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion(
|
2021-04-01 18:49:01 -05:00
|
|
|
+ const LayoutDeviceIntRegion& aInvalidRegion,
|
|
|
|
+ layers::BufferMode* aBufferMode) override;
|
|
|
|
|
2020-07-14 11:20:36 -07:00
|
|
|
uintptr_t GetWidgetKey() override;
|
|
|
|
|
2023-04-24 21:28:08 +00:00
|
|
|
@@ -42,10 +47,18 @@ class HeadlessCompositorWidget final : public CompositorWidget,
|
2020-07-14 11:20:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2020-07-20 14:24:52 -07:00
|
|
|
+ void UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize);
|
2020-07-15 09:37:08 -07:00
|
|
|
+ void PeriodicSnapshot();
|
2020-08-04 17:58:57 -07:00
|
|
|
+ void TakeSnapshot();
|
2020-07-14 11:20:36 -07:00
|
|
|
+
|
|
|
|
HeadlessWidget* mWidget;
|
2021-12-13 21:23:25 -08:00
|
|
|
+ mozilla::ReentrantMonitor mMon;
|
2020-07-14 11:20:36 -07:00
|
|
|
|
2023-04-24 21:28:08 +00:00
|
|
|
// See GtkCompositorWidget for the justification for this mutex.
|
|
|
|
DataMutex<LayoutDeviceIntSize> mClientSize;
|
2020-07-14 11:20:36 -07:00
|
|
|
+
|
|
|
|
+ HeadlessWidget::SnapshotListener mSnapshotListener;
|
|
|
|
+ RefPtr<gfx::DrawTarget> mDrawTarget;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace widget
|
|
|
|
diff --git a/widget/headless/HeadlessWidget.cpp b/widget/headless/HeadlessWidget.cpp
|
2023-07-06 12:22:45 -07:00
|
|
|
index 083d026d3c019cb76fff2b8f605f3d6ef8dd578f..84c049709ead92c980b86230513a634bf6337085 100644
|
2020-07-14 11:20:36 -07:00
|
|
|
--- a/widget/headless/HeadlessWidget.cpp
|
|
|
|
+++ b/widget/headless/HeadlessWidget.cpp
|
2023-07-06 12:22:45 -07:00
|
|
|
@@ -111,6 +111,8 @@ void HeadlessWidget::Destroy() {
|
2020-07-15 09:37:08 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
+ SetSnapshotListener(nullptr);
|
|
|
|
+
|
|
|
|
nsBaseWidget::OnDestroy();
|
|
|
|
|
|
|
|
nsBaseWidget::Destroy();
|
2023-06-06 15:08:23 -07:00
|
|
|
@@ -621,5 +623,14 @@ nsresult HeadlessWidget::SynthesizeNativeTouchpadPan(
|
2020-07-14 11:20:36 -07:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2023-01-23 11:29:48 -08:00
|
|
|
|
2020-07-14 11:20:36 -07:00
|
|
|
+void HeadlessWidget::SetSnapshotListener(SnapshotListener&& listener) {
|
|
|
|
+ if (!mCompositorWidget) {
|
2020-08-04 17:38:46 -07:00
|
|
|
+ if (listener)
|
|
|
|
+ fprintf(stderr, "Trying to set SnapshotListener without compositor widget\n");
|
2020-07-14 11:20:36 -07:00
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ mCompositorWidget->SetSnapshotListener(std::move(listener));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
} // namespace widget
|
|
|
|
} // namespace mozilla
|
|
|
|
diff --git a/widget/headless/HeadlessWidget.h b/widget/headless/HeadlessWidget.h
|
2023-06-06 15:08:23 -07:00
|
|
|
index 9856991ef32f25f51942f8cd664a09bec2192c70..948947a421179e91c51005aeb83ed0d18cfc84ce 100644
|
2020-07-14 11:20:36 -07:00
|
|
|
--- a/widget/headless/HeadlessWidget.h
|
|
|
|
+++ b/widget/headless/HeadlessWidget.h
|
2023-01-23 11:29:48 -08:00
|
|
|
@@ -141,6 +141,9 @@ class HeadlessWidget : public nsBaseWidget {
|
|
|
|
int32_t aModifierFlags,
|
|
|
|
nsIObserver* aObserver) override;
|
2020-07-14 11:20:36 -07:00
|
|
|
|
|
|
|
+ using SnapshotListener = std::function<void(RefPtr<gfx::DataSourceSurface>&&)>;
|
|
|
|
+ void SetSnapshotListener(SnapshotListener&& listener);
|
|
|
|
+
|
|
|
|
private:
|
|
|
|
~HeadlessWidget();
|
|
|
|
bool mEnabled;
|
2023-06-06 15:08:23 -07:00
|
|
|
diff --git a/widget/nsGUIEventIPC.h b/widget/nsGUIEventIPC.h
|
2024-02-22 13:17:33 -08:00
|
|
|
index a3d7aaf1b6c651fedbab7875c1a38647103d08ed..ac3b09e50216524cce90d96b013007f7b07472da 100644
|
2023-06-06 15:08:23 -07:00
|
|
|
--- a/widget/nsGUIEventIPC.h
|
|
|
|
+++ b/widget/nsGUIEventIPC.h
|
|
|
|
@@ -234,6 +234,7 @@ struct ParamTraits<mozilla::WidgetMouseEvent> {
|
|
|
|
aParam.mExitFrom.value()));
|
|
|
|
}
|
|
|
|
WriteParam(aWriter, aParam.mClickCount);
|
|
|
|
+ WriteParam(aWriter, aParam.mJugglerEventId);
|
|
|
|
}
|
|
|
|
|
|
|
|
static bool Read(MessageReader* aReader, paramType* aResult) {
|
|
|
|
@@ -258,6 +259,7 @@ struct ParamTraits<mozilla::WidgetMouseEvent> {
|
|
|
|
aResult->mExitFrom = Some(static_cast<paramType::ExitFrom>(exitFrom));
|
|
|
|
}
|
|
|
|
rv = rv && ReadParam(aReader, &aResult->mClickCount);
|
|
|
|
+ rv = rv && ReadParam(aReader, &aResult->mJugglerEventId);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
};
|
2020-10-13 12:24:11 -07:00
|
|
|
diff --git a/xpcom/reflect/xptinfo/xptinfo.h b/xpcom/reflect/xptinfo/xptinfo.h
|
2022-07-05 08:20:01 -07:00
|
|
|
index 2456c2c2b58b27cd595880b547ed20fb687a1835..e967c089b2331c7cd36d34e511543fbc84320b7d 100644
|
2020-10-13 12:24:11 -07:00
|
|
|
--- a/xpcom/reflect/xptinfo/xptinfo.h
|
|
|
|
+++ b/xpcom/reflect/xptinfo/xptinfo.h
|
2021-07-14 08:26:43 -08:00
|
|
|
@@ -514,7 +514,7 @@ static_assert(sizeof(nsXPTMethodInfo) == 8, "wrong size");
|
2020-10-13 12:24:11 -07: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
|
|
|
|
|
|
|
|
/**
|