[tbb-commits] [Git][tpo/applications/tor-browser][tor-browser-102.10.0esr-12.5-1] 5 commits: Revert "Bug 19273: Avoid JavaScript patching of the external app helper dialog."
Richard Pospesel (@richard)
git at gitlab.torproject.org
Thu Apr 13 16:44:20 UTC 2023
Richard Pospesel pushed to branch tor-browser-102.10.0esr-12.5-1 at The Tor Project / Applications / Tor Browser
Commits:
627eab30 by Dan Ballard at 2023-04-13T16:15:53+00:00
Revert "Bug 19273: Avoid JavaScript patching of the external app helper dialog."
Bug 40701: Improve security warning when downloading a file
This reverts commit 5d003f7c5e0910c8e0c6f4e55a0ca7aa002faad1.
- - - - -
95ab5a71 by Dan Ballard at 2023-04-13T16:17:39+00:00
fixup! Bug 10760: Integrate TorButton to TorBrowser core
Bug 40701: Remove old download popup
- - - - -
87ddea9a by Dan Ballard at 2023-04-13T16:17:40+00:00
fixup! Add TorStrings module for localization
Bug 40701: Improve security warning when downloading a file
Add strings for new pane, flag deprecated strings
Bug 40701: fix capitalization of 'internet'
- - - - -
0169c7ee by Dan Ballard at 2023-04-13T16:17:40+00:00
fixup! Bug 40562: Added Tor Browser preferences to 000-tor-browser.js
Bug 40701: Improve security warning when downloading a file
Remove existing popup warnings and add pref for new one
Bug 40701: update pref names
- - - - -
7c7f1d72 by Dan Ballard at 2023-04-13T16:17:41+00:00
Bug 40701: Add in pane security warning when downloading a file
- - - - -
12 changed files:
- browser/app/profile/000-tor-browser.js
- browser/components/downloads/content/downloads.css
- browser/components/downloads/content/downloads.js
- browser/components/downloads/content/downloadsPanel.inc.xhtml
- browser/themes/shared/customizableui/panelUI-shared.css
- browser/themes/shared/downloads/downloads.inc.css
- toolkit/torbutton/chrome/locale/en-US/torbutton.properties
- − toolkit/torbutton/components/external-app-blocker.js
- toolkit/torbutton/jar.mn
- uriloader/exthandler/nsExternalHelperAppService.cpp
- uriloader/exthandler/nsExternalHelperAppService.h
- uriloader/exthandler/nsIExternalHelperAppService.idl
Changes:
=====================================
browser/app/profile/000-tor-browser.js
=====================================
@@ -64,11 +64,15 @@ pref("extensions.torbutton.startup", false);
// Security prefs:
pref("extensions.torbutton.resize_new_windows", false);
-pref("extensions.torbutton.launch_warning", true);
// Browser home page:
pref("browser.startup.homepage", "about:tor");
+// tor-browser#40701: Add new download warning and flipping prefs to match Firefox
+pref("browser.download.useDownloadDir", true);
+pref("browser.download.always_ask_before_handling_new_types", false);
+pref("browser.download.showTorWarning", true);
+
// This pref specifies an ad-hoc "version" for various pref update hacks we need to do
pref("extensions.torbutton.pref_fixup_version", 0);
=====================================
browser/components/downloads/content/downloads.css
=====================================
@@ -95,6 +95,32 @@
padding: 0.62em;
}
+#downloadsPanel-mainView {
+ /* Fix the layout to ensure the #downloadsWarningDescription is given enough
+ * vertical space. For tor-browser#40701.
+ * TODO: May no longer be necessary after esr 115 due to bugzilla bug 1816455.
+ */
+ display: flex;
+ flex-direction: column;
+}
+
+#downloadsWarning p {
+ padding-inline: 8px;
+ margin-block-start: 8px;
+ margin-block-end: 0;
+ line-height: 1.4;
+}
+
+#downloadsWarningHeaderTitle {
+ font-weight: bold;
+}
+
+#downloadsWarningDescription {
+ /* Make sure we wrap the text rather than request the default max-content
+ * width from the parent XUL -moz-box. */
+ width: 0;
+}
+
#downloadsHistory,
#downloadsFooterButtons {
margin: 0;
=====================================
browser/components/downloads/content/downloads.js
=====================================
@@ -31,6 +31,10 @@
"use strict";
+const PREF_SHOW_DOWNLOAD_WARNING = "browser.download.showTorWarning";
+
+const TAILS_URI = "https://tails.boum.org/";
+
var { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
@@ -93,6 +97,13 @@ var DownloadsPanel = {
*/
_state: 0,
+ /**
+ * State of tor's download warning. It should only be initialized once (text assigned,
+ * button commands assigned). This tracks if that has been performed and prevents
+ * repeats.
+ */
+ _torWarningInitialized: false,
+
/** The panel is not linked to downloads data yet. */
get kStateUninitialized() {
return 0;
@@ -132,6 +143,15 @@ var DownloadsPanel = {
);
}
+ let showDownloadWarning = Services.prefs.getBoolPref(
+ PREF_SHOW_DOWNLOAD_WARNING
+ );
+ if (!showDownloadWarning) {
+ document.getElementById("downloadsWarning").hidden = true;
+ } else {
+ document.getElementById("downloadsWarning").hidden = false;
+ }
+
if (this._state != this.kStateUninitialized) {
DownloadsCommon.log("DownloadsPanel is already initialized.");
return;
@@ -155,6 +175,44 @@ var DownloadsPanel = {
DownloadsSummary
);
+ if (this._torWarningInitialized == 0) {
+ document.getElementById(
+ "downloadsWarningHeaderTitle"
+ ).textContent = this._getString("torbutton.download.warning.title");
+ let tailsBrandName = this._getString(
+ "torbutton.download.warning.tails_brand_name"
+ );
+
+ let warningDescriptionText = this._getString(
+ "torbutton.download.warning.description"
+ );
+ let [head, rest] = warningDescriptionText.split("%S");
+ const tailsLink = document.createElement("a");
+ tailsLink.setAttribute("href", TAILS_URI);
+ tailsLink.textContent = tailsBrandName.trim();
+ tailsLink.addEventListener("click", event => {
+ event.preventDefault();
+ this.hidePanel();
+ openWebLinkIn(TAILS_URI, "tab");
+ });
+
+ let downloadsWarningDescription = document.getElementById(
+ "downloadsWarningDescription"
+ );
+ downloadsWarningDescription.append(head, tailsLink, rest);
+
+ let dismissBtn = document.getElementById(
+ "downloadWarningDismiss"
+ );
+ dismissBtn.textContent = this._getString("torbutton.download.warning.dismiss");
+ dismissBtn.addEventListener("click", event => {
+ Services.prefs.setBoolPref(PREF_SHOW_DOWNLOAD_WARNING, false);
+ document.getElementById("downloadsWarning").hidden = true;
+ this._focusPanel(true);
+ });
+ this._torWarningInitialized = 1;
+ }
+
DownloadsCommon.log(
"DownloadsView attached - the panel for this window",
"should now see download items come in."
@@ -530,16 +588,21 @@ var DownloadsPanel = {
/**
* Move focus to the main element in the downloads panel, unless another
* element in the panel is already focused.
+ *
+ * @param {bool} [forceFocus=false] - Whether to force move the focus.
*/
- _focusPanel() {
- // We may be invoked while the panel is still waiting to be shown.
- if (this._state != this.kStateShown) {
- return;
- }
+ _focusPanel(forceFocus=false) {
+ if (!forceFocus) {
+ // We may be invoked while the panel is still waiting to be shown.
+ if (this._state != this.kStateShown) {
+ return;
+ }
- if (document.activeElement && this.panel.contains(document.activeElement)) {
- return;
+ if (document.activeElement && this.panel.contains(document.activeElement)) {
+ return;
+ }
}
+
let focusOptions = { preventFocusRing: !!this._preventFocusRing };
if (DownloadsView.richListBox.itemCount > 0) {
DownloadsView.richListBox.selectedIndex = 0;
@@ -658,6 +721,30 @@ var DownloadsPanel = {
}
}, 0);
},
+
+ /**
+ * Get a string from the properties bundle.
+ *
+ * @param {string} name - The string name.
+ *
+ * @return {string} The string.
+ */
+ _getString(name) {
+ if (!this._stringBundle) {
+ this._stringBundle = Services.strings.createBundle(
+ "chrome://torbutton/locale/torbutton.properties"
+ );
+ }
+ try {
+ return this._stringBundle.GetStringFromName(name);
+ } catch {}
+ if (!this._fallbackStringBundle) {
+ this._fallbackStringBundle = Services.strings.createBundle(
+ "resource://torbutton/locale/en-US/torbutton.properties"
+ );
+ }
+ return this._fallbackStringBundle.GetStringFromName(name);
+ },
};
XPCOMUtils.defineConstant(this, "DownloadsPanel", DownloadsPanel);
=====================================
browser/components/downloads/content/downloadsPanel.inc.xhtml
=====================================
@@ -124,6 +124,21 @@
disablekeynav="true">
<panelview id="downloadsPanel-mainView">
+ <vbox id="downloadsWarning">
+ <vbox role="alert"
+ aria-labelledby="downloadsWarningHeaderTitle"
+ aria-describedby="downloadsWarningDescription">
+ <html:p id="downloadsWarningHeaderTitle"></html:p>
+ <html:p id="downloadsWarningDescription">
+ </html:p>
+
+ <html:div class="panel-footer">
+ <html:button id="downloadWarningDismiss">
+ </html:button>
+ </html:div>
+ </vbox>
+ <toolbarseparator />
+ </vbox>
<vbox class="panel-view-body-unscrollable">
<richlistbox id="downloadsListBox"
data-l10n-id="downloads-panel-items"
=====================================
browser/themes/shared/customizableui/panelUI-shared.css
=====================================
@@ -1324,6 +1324,7 @@ panelview .toolbarbutton-1 {
#downloadsFooterButtons > toolbarseparator,
.cui-widget-panelview menuseparator,
.cui-widget-panel toolbarseparator,
+#downloadsWarning toolbarseparator,
#securityLevel-panel toolbarseparator {
appearance: none;
min-height: 0;
=====================================
browser/themes/shared/downloads/downloads.inc.css
=====================================
@@ -258,6 +258,7 @@
}
/*** Toolbarseparator ***/
+#downloadsWarning toolbarseparator,
#downloadsFooterButtons > toolbarseparator {
margin-inline: 0;
}
=====================================
toolkit/torbutton/chrome/locale/en-US/torbutton.properties
=====================================
@@ -32,7 +32,7 @@ torbutton.circuit_display.click_to_copy = Click to Copy
torbutton.circuit_display.copied = Copied!
# end
-# External app blocker
+# External app blocker strings used up to 12.0 - TODO: remove when 12.5 becomes stable:
torbutton.popup.external.title = Download an external file type?
torbutton.popup.external.app = Tor Browser cannot display this file. You will need to open it with another application.\n\n
torbutton.popup.external.note = Some types of files can cause applications to connect to the Internet without using Tor.\n\n
@@ -41,6 +41,14 @@ torbutton.popup.launch = Download file
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Automatically download files from now on
+# Download pane warning
+torbutton.download.warning.title = Be careful opening downloads
+# %S will be a link to the Tails operating system website. With the content given by torbutton.download.warning.tails_brand_name
+torbutton.download.warning.description = Some files may connect to the internet when opened without using Tor. To be safe, open the files while offline or use a portable operating system like %S.
+# Locale name for Tails operating system.
+torbutton.download.warning.tails_brand_name = Tails
+torbutton.download.warning.dismiss = Got it
+
# .Onion Page Info prompt.
pageInfo_OnionEncryptionWithBitsAndProtocol=Connection Encrypted (Onion Service, %1$S, %2$S bit keys, %3$S)
pageInfo_OnionEncryption=Connection Encrypted (Onion Service)
=====================================
toolkit/torbutton/components/external-app-blocker.js deleted
=====================================
@@ -1,160 +0,0 @@
-// Bug 1506 Android P1/TBB P5: This code provides users with notification
-// in the event of external app launch. We want it to exist in the desktop
-// port, but it is probably useless for Android.
-
-/*************************************************************************
- * External App Handler.
- * Handles displaying confirmation dialogs for external apps and protocols
- * due to Firefox Bug https://bugzilla.mozilla.org/show_bug.cgi?id=440892
- *
- * An instance of this module is created each time the browser starts to
- * download a file and when an external application may be invoked to
- * handle an URL (e.g., when the user clicks on a mailto: URL).
- *************************************************************************/
-
-const { XPCOMUtils } = ChromeUtils.import(
- "resource://gre/modules/XPCOMUtils.jsm"
-);
-const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { PromptUtils } = ChromeUtils.import(
- "resource://gre/modules/SharedPromptUtils.jsm"
-);
-
-XPCOMUtils.defineLazyModuleGetters(this, {
- ComponentUtils: "resource://gre/modules/ComponentUtils.jsm",
-});
-
-let { torbutton_get_property_string } = ChromeUtils.import(
- "resource://torbutton/modules/utils.js"
-);
-
-// Module specific constants
-const kMODULE_NAME = "Torbutton External App Handler";
-const kCONTRACT_ID = "@torproject.org/torbutton-extAppBlocker;1";
-const kMODULE_CID = Components.ID("3da0269f-fc29-4e9e-a678-c3b1cafcf13f");
-
-const kInterfaces = [Ci.nsIObserver, Ci.nsIClassInfo];
-
-function ExternalAppBlocker() {
- this.logger = Cc["@torproject.org/torbutton-logger;1"].getService(
- Ci.nsISupports
- ).wrappedJSObject;
- this.logger.log(3, "Component Load 0: New ExternalAppBlocker.");
-}
-
-ExternalAppBlocker.prototype = {
- _helperAppLauncher: undefined,
-
- QueryInterface: ChromeUtils.generateQI([
- Ci.nsIObserver,
- Ci.nsIHelperAppWarningDialog,
- ]),
-
- // make this an nsIClassInfo object
- flags: Ci.nsIClassInfo.DOM_OBJECT,
- classDescription: kMODULE_NAME,
- contractID: kCONTRACT_ID,
- classID: kMODULE_CID,
-
- // method of nsIClassInfo
- getInterfaces(count) {
- count.value = kInterfaces.length;
- return kInterfaces;
- },
-
- // method of nsIClassInfo
- getHelperForLanguage(count) {
- return null;
- },
-
- // method of nsIHelperAppWarningDialog
- maybeShow(aLauncher, aWindowContext) {
- // Hold a reference to the object that called this component. This is
- // important not just because we need to later invoke the
- // continueRequest() or cancelRequest() callback on aLauncher, but also
- // so that the launcher object (which is a reference counted object) is
- // not released too soon.
- this._helperAppLauncher = aLauncher;
-
- if (!Services.prefs.getBoolPref("extensions.torbutton.launch_warning")) {
- this._helperAppLauncher.continueRequest();
- return;
- }
-
- this._showPrompt(aWindowContext);
- },
-
- /*
- * The _showPrompt() implementation uses some XUL and JS that is part of the
- * browser's confirmEx() implementation. Specifically, _showPrompt() depends
- * on chrome://global/content/commonDialog.xhtml as well as some of the code
- * in resource://gre/modules/SharedPromptUtils.jsm.
- */
- _showPrompt(aWindowContext) {
- let parentWin;
- try {
- parentWin = aWindowContext.getInterface(Ci.nsIDOMWindow);
- } catch (e) {
- parentWin = Services.wm.getMostRecentWindow("navigator:browser");
- }
-
- let title = torbutton_get_property_string("torbutton.popup.external.title");
- let app = torbutton_get_property_string("torbutton.popup.external.app");
- let note = torbutton_get_property_string("torbutton.popup.external.note");
- let suggest = torbutton_get_property_string(
- "torbutton.popup.external.suggest"
- );
- let launch = torbutton_get_property_string("torbutton.popup.launch");
- let cancel = torbutton_get_property_string("torbutton.popup.cancel");
- let dontask = torbutton_get_property_string("torbutton.popup.dontask");
-
- let args = {
- promptType: "confirmEx",
- title,
- text: app + note + suggest + " ",
- checkLabel: dontask,
- checked: false,
- ok: false,
- button0Label: launch,
- button1Label: cancel,
- defaultButtonNum: 1, // Cancel
- buttonNumClicked: 1, // Cancel
- enableDelay: true,
- };
-
- let propBag = PromptUtils.objectToPropBag(args);
- let uri = "chrome://global/content/commonDialog.xhtml";
- let promptWin = Services.ww.openWindow(
- parentWin,
- uri,
- "_blank",
- "centerscreen,chrome,titlebar",
- propBag
- );
- promptWin.addEventListener("load", aEvent => {
- promptWin.addEventListener("unload", aEvent => {
- PromptUtils.propBagToObject(propBag, args);
-
- if (0 == args.buttonNumClicked) {
- // Save the checkbox value and tell the browser's external helper app
- // module about the user's choice.
- if (args.checked) {
- Services.prefs.setBoolPref(
- "extensions.torbutton.launch_warning",
- false
- );
- }
-
- this._helperAppLauncher.continueRequest();
- } else {
- this._helperAppLauncher.cancelRequest(Cr.NS_BINDING_ABORTED);
- }
- });
- });
- },
-};
-
-// Assign factory to global object.
-const NSGetFactory = XPCOMUtils.generateNSGetFactory
- ? XPCOMUtils.generateNSGetFactory([ExternalAppBlocker])
- : ComponentUtils.generateNSGetFactory([ExternalAppBlocker]);
=====================================
toolkit/torbutton/jar.mn
=====================================
@@ -34,9 +34,6 @@ torbutton.jar:
% component {f605ec27-d867-44b5-ad97-2a29276642c3} %components/dragDropFilter.js
% contract @torproject.org/torbutton-dragDropFilter;1 {f605ec27-d867-44b5-ad97-2a29276642c3}
-% component {3da0269f-fc29-4e9e-a678-c3b1cafcf13f} %components/external-app-blocker.js
-% contract @torproject.org/torbutton-extAppBlocker;1 {3da0269f-fc29-4e9e-a678-c3b1cafcf13f}
-
% component {06322def-6fde-4c06-aef6-47ae8e799629} %components/startup-observer.js
% contract @torproject.org/startup-observer;1 {06322def-6fde-4c06-aef6-47ae8e799629}
=====================================
uriloader/exthandler/nsExternalHelperAppService.cpp
=====================================
@@ -144,9 +144,6 @@ static const char NEVER_ASK_FOR_SAVE_TO_DISK_PREF[] =
static const char NEVER_ASK_FOR_OPEN_FILE_PREF[] =
"browser.helperApps.neverAsk.openFile";
-static const char WARNING_DIALOG_CONTRACT_ID[] =
- "@torproject.org/torbutton-extAppBlocker;1";
-
StaticRefPtr<nsIFile> sFallbackDownloadDir;
// Helper functions for Content-Disposition headers
@@ -398,22 +395,6 @@ nsresult GenerateRandomName(nsACString& result) {
return NS_OK;
}
-static already_AddRefed<nsIInterfaceRequestor> GetDialogParentAux(
- BrowsingContext* aBrowsingContext, nsIInterfaceRequestor* aWindowContext) {
- nsCOMPtr<nsIInterfaceRequestor> dialogParent = aWindowContext;
-
- if (!dialogParent && aBrowsingContext) {
- dialogParent = do_QueryInterface(aBrowsingContext->GetDOMWindow());
- }
- if (!dialogParent && aBrowsingContext && XRE_IsParentProcess()) {
- RefPtr<Element> element = aBrowsingContext->Top()->GetEmbedderElement();
- if (element) {
- dialogParent = do_QueryInterface(element->OwnerDoc()->GetWindow());
- }
- }
- return dialogParent.forget();
-}
-
/**
* Structure for storing extension->type mappings.
* @see defaultMimeEntries
@@ -611,96 +592,6 @@ static const char* descriptionOverwriteExtensions[] = {
"avif", "jxl", "pdf", "svg", "webp", "xml",
};
-//////////////////////////////////////////////////////////////////////////////////////////////////////
-// begin nsExternalLoadURIHandler class definition and implementation
-//////////////////////////////////////////////////////////////////////////////////////////////////////
-class nsExternalLoadURIHandler final : public nsIHelperAppWarningLauncher {
- public:
- NS_DECL_THREADSAFE_ISUPPORTS
- NS_DECL_NSIHELPERAPPWARNINGLAUNCHER
-
- nsExternalLoadURIHandler(nsIHandlerInfo* aHandlerInfo, nsIURI* aURI,
- nsIPrincipal* aTriggeringPrincipal,
- BrowsingContext* aBrowsingContext,
- bool aTriggeredExternally);
-
- protected:
- ~nsExternalLoadURIHandler();
-
- nsCOMPtr<nsIHandlerInfo> mHandlerInfo;
- nsCOMPtr<nsIURI> mURI;
- nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
- RefPtr<BrowsingContext> mBrowsingContext;
- bool mTriggeredExternally;
- nsCOMPtr<nsIHelperAppWarningDialog> mWarningDialog;
-};
-
-NS_IMPL_ADDREF(nsExternalLoadURIHandler)
-NS_IMPL_RELEASE(nsExternalLoadURIHandler)
-
-NS_INTERFACE_MAP_BEGIN(nsExternalLoadURIHandler)
- NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIHelperAppWarningLauncher)
- NS_INTERFACE_MAP_ENTRY(nsIHelperAppWarningLauncher)
-NS_INTERFACE_MAP_END
-
-nsExternalLoadURIHandler::nsExternalLoadURIHandler(
- nsIHandlerInfo* aHandlerInfo, nsIURI* aURI,
- nsIPrincipal* aTriggeringPrincipal, BrowsingContext* aBrowsingContext,
- bool aTriggeredExternally)
- : mHandlerInfo(aHandlerInfo),
- mURI(aURI),
- mTriggeringPrincipal(aTriggeringPrincipal),
- mBrowsingContext(aBrowsingContext),
- mTriggeredExternally(aTriggeredExternally)
-
-{
- nsresult rv = NS_OK;
- mWarningDialog = do_CreateInstance(WARNING_DIALOG_CONTRACT_ID, &rv);
- if (NS_SUCCEEDED(rv) && mWarningDialog) {
- // This will create a reference cycle (the dialog holds a reference to us
- // as nsIHelperAppWarningLauncher), which will be broken in ContinueRequest
- // or CancelRequest.
- nsCOMPtr<nsIInterfaceRequestor> dialogParent =
- GetDialogParentAux(aBrowsingContext, nullptr);
- rv = mWarningDialog->MaybeShow(this, dialogParent);
- }
-
- if (NS_FAILED(rv)) {
- // If for some reason we could not open the download warning prompt,
- // continue with the request.
- ContinueRequest();
- }
-}
-
-nsExternalLoadURIHandler::~nsExternalLoadURIHandler() {}
-
-NS_IMETHODIMP nsExternalLoadURIHandler::ContinueRequest() {
- MOZ_ASSERT(mURI);
- MOZ_ASSERT(mHandlerInfo);
-
- // Break our reference cycle with the download warning dialog (set up in
- // LoadURI).
- mWarningDialog = nullptr;
-
- nsresult rv = NS_OK;
- nsCOMPtr<nsIContentDispatchChooser> chooser =
- do_CreateInstance("@mozilla.org/content-dispatch-chooser;1", &rv);
- NS_ENSURE_SUCCESS(rv, rv);
-
- return chooser->HandleURI(mHandlerInfo, mURI, mTriggeringPrincipal,
- mBrowsingContext, mTriggeredExternally);
-}
-
-NS_IMETHODIMP nsExternalLoadURIHandler::CancelRequest(nsresult aReason) {
- NS_ENSURE_ARG(NS_FAILED(aReason));
-
- // Break our reference cycle with the download warning dialog (set up in
- // LoadURI).
- mWarningDialog = nullptr;
-
- return NS_OK;
-}
-
static StaticRefPtr<nsExternalHelperAppService> sExtHelperAppSvcSingleton;
/**
@@ -723,9 +614,6 @@ nsExternalHelperAppService::GetSingleton() {
return do_AddRef(sExtHelperAppSvcSingleton);
}
-//////////////////////////////////////////////////////////////////////////////////////////////////////
-// nsExternalHelperAppService definition and implementation
-//////////////////////////////////////////////////////////////////////////////////////////////////////
NS_IMPL_ISUPPORTS(nsExternalHelperAppService, nsIExternalHelperAppService,
nsPIExternalAppLauncher, nsIExternalProtocolService,
nsIMIMEService, nsIObserver, nsISupportsWeakReference)
@@ -1238,15 +1126,14 @@ nsExternalHelperAppService::LoadURI(nsIURI* aURI,
rv = GetProtocolHandlerInfo(scheme, getter_AddRefs(handler));
NS_ENSURE_SUCCESS(rv, rv);
- RefPtr<nsExternalLoadURIHandler> h = new nsExternalLoadURIHandler(
+ nsCOMPtr<nsIContentDispatchChooser> chooser =
+ do_CreateInstance("@mozilla.org/content-dispatch-chooser;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return chooser->HandleURI(
handler, escapedURI,
aRedirectPrincipal ? aRedirectPrincipal : aTriggeringPrincipal,
aBrowsingContext, aTriggeredExternally);
- if (!h) {
- return NS_ERROR_OUT_OF_MEMORY;
- }
-
- return NS_OK;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1391,7 +1278,6 @@ NS_INTERFACE_MAP_BEGIN(nsExternalAppHandler)
NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
NS_INTERFACE_MAP_ENTRY(nsIHelperAppLauncher)
- NS_INTERFACE_MAP_ENTRY(nsIHelperAppWarningLauncher)
NS_INTERFACE_MAP_ENTRY(nsICancelable)
NS_INTERFACE_MAP_ENTRY(nsIBackgroundFileSaverObserver)
NS_INTERFACE_MAP_ENTRY(nsINamed)
@@ -1647,7 +1533,18 @@ void nsExternalAppHandler::MaybeApplyDecodingForExtension(
already_AddRefed<nsIInterfaceRequestor>
nsExternalAppHandler::GetDialogParent() {
- return GetDialogParentAux(mBrowsingContext, mWindowContext);
+ nsCOMPtr<nsIInterfaceRequestor> dialogParent = mWindowContext;
+
+ if (!dialogParent && mBrowsingContext) {
+ dialogParent = do_QueryInterface(mBrowsingContext->GetDOMWindow());
+ }
+ if (!dialogParent && mBrowsingContext && XRE_IsParentProcess()) {
+ RefPtr<Element> element = mBrowsingContext->Top()->GetEmbedderElement();
+ if (element) {
+ dialogParent = do_QueryInterface(element->OwnerDoc()->GetWindow());
+ }
+ }
+ return dialogParent.forget();
}
NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
@@ -1795,34 +1692,6 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
loadInfo->SetForceAllowDataURI(true);
}
- mWarningDialog = do_CreateInstance(WARNING_DIALOG_CONTRACT_ID, &rv);
- if (NS_SUCCEEDED(rv) && mWarningDialog) {
- // This will create a reference cycle (the dialog holds a reference to us
- // as nsIHelperAppWarningLauncher), which will be broken in ContinueRequest
- // or CancelRequest.
- nsCOMPtr<nsIInterfaceRequestor> dialogParent = GetDialogParent();
- rv = mWarningDialog->MaybeShow(this, dialogParent);
- }
-
- if (NS_FAILED(rv)) {
- // If for some reason we could not open the download warning prompt,
- // continue with the request.
- ContinueRequest();
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP nsExternalAppHandler::ContinueRequest() {
- nsAutoCString MIMEType;
- if (mMimeInfo) {
- mMimeInfo->GetMIMEType(MIMEType);
- }
-
- // Break our reference cycle with the download warning dialog (set up in
- // OnStartRequest).
- mWarningDialog = nullptr;
-
// now that the temp file is set up, find out if we need to invoke a dialog
// asking the user what they want us to do with this content...
@@ -1968,7 +1837,7 @@ NS_IMETHODIMP nsExternalAppHandler::ContinueRequest() {
GetTargetFile(getter_AddRefs(fileToTest));
if (fileToTest) {
bool isExecutable;
- nsresult rv = fileToTest->IsExecutable(&isExecutable);
+ rv = fileToTest->IsExecutable(&isExecutable);
if (NS_FAILED(rv) || mTempFileIsExecutable ||
isExecutable) { // checking NS_FAILED, because paranoia is good
alwaysAsk = true;
@@ -1984,7 +1853,20 @@ NS_IMETHODIMP nsExternalAppHandler::ContinueRequest() {
}
#endif
- nsresult rv = NS_OK;
+ nsAutoCString actionTelem;
+ if (alwaysAsk) {
+ actionTelem.AssignLiteral("ask");
+ } else if (shouldAutomaticallyHandleInternally) {
+ actionTelem.AssignLiteral("internal");
+ } else if (action == nsIMIMEInfo::useHelperApp ||
+ action == nsIMIMEInfo::useSystemDefault) {
+ actionTelem.AssignLiteral("external");
+ } else {
+ actionTelem.AssignLiteral("save");
+ }
+
+ RecordDownloadTelemetry(aChannel, actionTelem.get());
+
if (alwaysAsk) {
// Display the dialog
mDialog = do_CreateInstance(NS_HELPERAPPLAUNCHERDLG_CONTRACTID, &rv);
@@ -2017,14 +1899,6 @@ NS_IMETHODIMP nsExternalAppHandler::ContinueRequest() {
return NS_OK;
}
-NS_IMETHODIMP nsExternalAppHandler::CancelRequest(nsresult aReason) {
- // Break our reference cycle with the download warning dialog (set up in
- // OnStartRequest).
- mWarningDialog = nullptr;
-
- return Cancel(aReason);
-}
-
void nsExternalAppHandler::RecordDownloadTelemetry(nsIChannel* aChannel,
const char* aAction) {
// Telemetry for helper app dialog
@@ -2888,7 +2762,7 @@ NS_IMETHODIMP nsExternalAppHandler::Cancel(nsresult aReason) {
}
// Break our reference cycle with the helper app dialog (set up in
- // ContinueRequest)
+ // OnStartRequest)
mDialog = nullptr;
mDialogShowing = false;
=====================================
uriloader/exthandler/nsExternalHelperAppService.h
=====================================
@@ -261,7 +261,6 @@ class nsExternalHelperAppService : public nsIExternalHelperAppService,
*/
class nsExternalAppHandler final : public nsIStreamListener,
public nsIHelperAppLauncher,
- public nsIHelperAppWarningLauncher,
public nsIBackgroundFileSaverObserver,
public nsINamed {
public:
@@ -269,7 +268,6 @@ class nsExternalAppHandler final : public nsIStreamListener,
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIREQUESTOBSERVER
NS_DECL_NSIHELPERAPPLAUNCHER
- NS_DECL_NSIHELPERAPPWARNINGLAUNCHER
NS_DECL_NSICANCELABLE
NS_DECL_NSIBACKGROUNDFILESAVEROBSERVER
NS_DECL_NSINAMED
@@ -546,7 +544,6 @@ class nsExternalAppHandler final : public nsIStreamListener,
nsCOMPtr<nsITransfer> mTransfer;
nsCOMPtr<nsIHelperAppLauncherDialog> mDialog;
- nsCOMPtr<nsIHelperAppWarningDialog> mWarningDialog;
/**
=====================================
uriloader/exthandler/nsIExternalHelperAppService.idl
=====================================
@@ -189,50 +189,3 @@ interface nsIHelperAppLauncher : nsICancelable
*/
readonly attribute uint64_t browsingContextId;
};
-
-/**
- * nsIHelperAppWarningLauncher is implemented by two classes:
- * nsExternalLoadURIHandler
- * nsExternalAppHandler
- */
-[scriptable, uuid(cffd508b-4aaf-43ad-99c6-671d35cbc558)]
-interface nsIHelperAppWarningLauncher : nsISupports
-{
- /**
- * Callback invoked by the external app warning dialog to continue the
- * request.
- * NOTE: This will release the reference to the nsIHelperAppWarningDialog.
- */
- void continueRequest();
-
- /**
- * Callback invoked by the external app warning dialog to cancel the request.
- * NOTE: This will release the reference to the nsIHelperAppWarningDialog.
- *
- * @param aReason
- * Pass a failure code to indicate the reason why this operation is
- * being canceled. It is an error to pass a success code.
- */
- void cancelRequest(in nsresult aReason);
-};
-
-/**
- * nsIHelperAppWarningDialog is implemented by Torbutton's external app
- * blocker (src/components/external-app-blocker.js).
- */
-[scriptable, uuid(f4899a3f-0df3-42cc-9db8-bdf599e5a208)]
-interface nsIHelperAppWarningDialog : nsISupports
-{
- /**
- * Possibly show a launch warning dialog (it will not be shown if the user
- * has chosen to not see the warning again).
- *
- * @param aLauncher
- * A nsIHelperAppWarningLauncher to be invoked after the user confirms
- * or cancels the download.
- * @param aWindowContext
- * The window associated with the download.
- */
- void maybeShow(in nsIHelperAppWarningLauncher aLauncher,
- in nsISupports aWindowContext);
-};
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/4d0bea8766708d803842241ec9b7244b1e63c829...7c7f1d7240d281de582b81508099fd1f20980dd8
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/4d0bea8766708d803842241ec9b7244b1e63c829...7c7f1d7240d281de582b81508099fd1f20980dd8
You're receiving this email because of your account on gitlab.torproject.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tbb-commits/attachments/20230413/c72d4b67/attachment-0001.htm>
More information about the tbb-commits
mailing list