commit 845af535e43ba35a1f081ef161897a0e58ba5a5a parent 7eaee8e028d96a9fd2b3e29c2e50421a03e04597 Author: Edgar Chen <echen@mozilla.com> Date: Fri, 21 Nov 2025 08:38:19 +0000 Bug 2001379 - Get rid of dom.events.asyncClipboard.readText; r=tschuster,geckoview-reviewers,webidl,smaug,nalexander Differential Revision: https://phabricator.services.mozilla.com/D273481 Diffstat:
14 files changed, 3 insertions(+), 57 deletions(-)
diff --git a/dom/events/Clipboard.cpp b/dom/events/Clipboard.cpp @@ -322,10 +322,6 @@ void Clipboard::RequestRead(Promise* aPromise, ReadRequestType aType, } } -static bool IsReadTextExposedToContent() { - return StaticPrefs::dom_events_asyncClipboard_readText_DoNotUseDirectly(); -} - already_AddRefed<Promise> Clipboard::ReadHelper(nsIPrincipal& aSubjectPrincipal, ReadRequestType aType, ErrorResult& aRv) { @@ -811,14 +807,6 @@ JSObject* Clipboard::WrapObject(JSContext* aCx, LogModule* Clipboard::GetClipboardLog() { return gClipboardLog; } /* static */ -bool Clipboard::ReadTextEnabled(JSContext* aCx, JSObject* aGlobal) { - nsIPrincipal* prin = nsContentUtils::SubjectPrincipal(aCx); - return IsReadTextExposedToContent() || - prin->GetIsAddonOrExpandedAddonPrincipal() || - prin->IsSystemPrincipal(); -} - -/* static */ bool Clipboard::IsTestingPrefEnabled() { bool clipboardTestingEnabled = StaticPrefs::dom_events_testing_asyncClipboard_DoNotUseDirectly(); diff --git a/dom/events/Clipboard.h b/dom/events/Clipboard.h @@ -42,13 +42,6 @@ class Clipboard : public DOMEventTargetHelper { static LogModule* GetClipboardLog(); - // Check if the Clipboard.readText API should be enabled for this context. - // This API is only enabled for Extension and System contexts, as there is no - // way to request the required permission for web content. If the clipboard - // API testing pref is enabled, ReadText is enabled for web content for - // testing purposes. - static bool ReadTextEnabled(JSContext* aCx, JSObject* aGlobal); - static Span<const nsLiteralCString> MandatoryDataTypes(); virtual JSObject* WrapObject(JSContext* aCx, diff --git a/dom/events/test/clipboard/browser_navigator_clipboard_clickjacking.js b/dom/events/test/clipboard/browser_navigator_clipboard_clickjacking.js @@ -20,12 +20,6 @@ const kApzTestNativeEventUtilsUrl = Services.scriptloader.loadSubScript(kApzTestNativeEventUtilsUrl, this); -add_setup(async function () { - await SpecialPowers.pushPrefEnv({ - set: [["dom.events.asyncClipboard.readText", true]], - }); -}); - add_task(async function test_paste_button_clickjacking() { await BrowserTestUtils.withNewTab(kContentFileUrl, async function (browser) { const pasteButtonIsShown = promisePasteButtonIsShown(); diff --git a/dom/events/test/clipboard/browser_navigator_clipboard_contextmenu_suppression.js b/dom/events/test/clipboard/browser_navigator_clipboard_contextmenu_suppression.js @@ -116,7 +116,6 @@ function testPasteContextMenuSuppression(aWriteFun, aMsg) { add_setup(async function () { await SpecialPowers.pushPrefEnv({ set: [ - ["dom.events.asyncClipboard.readText", true], ["dom.events.asyncClipboard.clipboardItem", true], ["test.events.async.enabled", true], // Avoid paste button delay enabling making test too long. diff --git a/dom/events/test/clipboard/browser_navigator_clipboard_contextmenu_suppression_ext.js b/dom/events/test/clipboard/browser_navigator_clipboard_contextmenu_suppression_ext.js @@ -126,7 +126,6 @@ function testExtensionContentScript(aContentScript, aMessage) { add_setup(async function () { await SpecialPowers.pushPrefEnv({ set: [ - ["dom.events.asyncClipboard.readText", true], ["dom.events.asyncClipboard.clipboardItem", true], ["test.events.async.enabled", true], // Avoid paste button delay enabling making test too long. diff --git a/dom/events/test/clipboard/browser_navigator_clipboard_readText.js b/dom/events/test/clipboard/browser_navigator_clipboard_readText.js @@ -43,10 +43,7 @@ function promiseMutatedReadTextResultFromContentElement(aBrowser) { add_setup(async function () { await SpecialPowers.pushPrefEnv({ - set: [ - ["dom.events.asyncClipboard.readText", true], - ["test.events.async.enabled", true], - ], + set: [["test.events.async.enabled", true]], }); }); diff --git a/dom/events/test/clipboard/browser_navigator_clipboard_readText_multiple.js b/dom/events/test/clipboard/browser_navigator_clipboard_readText_multiple.js @@ -28,7 +28,6 @@ async function waitForPasteContextMenu() { add_setup(async function () { await SpecialPowers.pushPrefEnv({ set: [ - ["dom.events.asyncClipboard.readText", true], ["test.events.async.enabled", true], // Avoid paste button delay enabling making test too long. ["security.dialog_enable_delay", 0], diff --git a/dom/events/test/clipboard/browser_navigator_clipboard_touch.js b/dom/events/test/clipboard/browser_navigator_clipboard_touch.js @@ -49,12 +49,6 @@ function promiseTouchTapContent(aBrowser, aContentElementId) { ); } -add_setup(async function () { - await SpecialPowers.pushPrefEnv({ - set: [["dom.events.asyncClipboard.readText", true]], - }); -}); - add_task(async function test_paste_button_position_touch() { // Ensure there's text on the clipboard. await promiseWritingRandomTextToClipboard(); diff --git a/dom/events/test/clipboard/test_async_clipboard_datatransfer.html b/dom/events/test/clipboard/test_async_clipboard_datatransfer.html @@ -41,7 +41,6 @@ async function paste(aCallback) { add_setup(async function () { await SpecialPowers.pushPrefEnv({ set: [ - ["dom.events.asyncClipboard.readText", true], ["dom.events.asyncClipboard.clipboardItem", true], ], }); diff --git a/dom/webidl/Clipboard.webidl b/dom/webidl/Clipboard.webidl @@ -17,7 +17,7 @@ typedef sequence<ClipboardItem> ClipboardItems; interface Clipboard : EventTarget { [Pref="dom.events.asyncClipboard.clipboardItem", NewObject, NeedsSubjectPrincipal] Promise<ClipboardItems> read(); - [Func="Clipboard::ReadTextEnabled", NewObject, NeedsSubjectPrincipal] + [NewObject, NeedsSubjectPrincipal] Promise<DOMString> readText(); [Pref="dom.events.asyncClipboard.clipboardItem", NewObject, NeedsSubjectPrincipal] diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/SelectionActionDelegateTest.kt @@ -396,8 +396,6 @@ class SelectionActionDelegateTest : BaseSessionTest() { fun clipboardReadAllow() { assumeThat("Unnecessary to run multiple times", id, equalTo("#text")) - sessionRule.setPrefsUntilTestEnd(mapOf("dom.events.asyncClipboard.readText" to true)) - withClipboard("clipboardReadAllow") {} // Reset clipboard data val url = createTestUrl(CLIPBOARD_READ_HTML_PATH) @@ -441,8 +439,6 @@ class SelectionActionDelegateTest : BaseSessionTest() { fun clipboardReadDeny() { assumeThat("Unnecessary to run multiple times", id, equalTo("#text")) - sessionRule.setPrefsUntilTestEnd(mapOf("dom.events.asyncClipboard.readText" to true)) - withClipboard("clipboardReadDeny") {} // Reset clipboard data val url = createTestUrl(CLIPBOARD_READ_HTML_PATH) @@ -485,8 +481,6 @@ class SelectionActionDelegateTest : BaseSessionTest() { fun clipboardReadDeactivate() { assumeThat("Unnecessary to run multiple times", id, equalTo("#text")) - sessionRule.setPrefsUntilTestEnd(mapOf("dom.events.asyncClipboard.readText" to true)) - withClipboard("clipboardReadDeactivate") {} // Reset clipboard data val url = createTestUrl(CLIPBOARD_READ_HTML_PATH) @@ -531,8 +525,6 @@ class SelectionActionDelegateTest : BaseSessionTest() { fun clipboardReadDismiss() { assumeThat("Unnecessary to run multiple times", id, equalTo("#text")) - sessionRule.setPrefsUntilTestEnd(mapOf("dom.events.asyncClipboard.readText" to true)) - withClipboard("clipboardReadDismiss") {} // Reset clipboard data val url = createTestUrl(CLIPBOARD_READ_HTML_PATH) diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml @@ -2976,13 +2976,6 @@ mirror: always do_not_use_directly: true -# Control whether `navigator.clipboard.readText()` is exposed to content. -- name: dom.events.asyncClipboard.readText - type: bool - value: true - mirror: always - do_not_use_directly: true - # This pref controls whether or not the `protected` dataTransfer state is # enabled. If the `protected` dataTransfer stae is disabled, then the # DataTransfer will be read-only whenever it should be protected, and will not diff --git a/testing/web-platform/meta/clipboard-apis/__dir__.ini b/testing/web-platform/meta/clipboard-apis/__dir__.ini @@ -1 +1 @@ -prefs: [dom.events.asyncClipboard.clipboardItem: true, dom.events.asyncClipboard.readText: true] +prefs: [dom.events.asyncClipboard.clipboardItem: true] diff --git a/toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js b/toolkit/components/contentanalysis/tests/browser/browser_clipboard_read_async_content_analysis.js @@ -7,7 +7,6 @@ add_setup(async function test_setup() { mockCA = await mockContentAnalysisService(mockCA); await SpecialPowers.pushPrefEnv({ set: [ - ["dom.events.asyncClipboard.readText", true], // This pref turns off the "Paste" popup ["dom.events.testing.asyncClipboard", true], ],