tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

LoadURIDelegate.sys.mjs (2313B)


      1 // -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      4 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 import { GeckoViewUtils } from "resource://gre/modules/GeckoViewUtils.sys.mjs";
      7 
      8 const { debug, warn } = GeckoViewUtils.initLogging("LoadURIDelegate");
      9 
     10 export const LoadURIDelegate = {
     11  // Delegate URI loading to the app.
     12  // Return whether the loading has been handled.
     13  async load(
     14    aWindow,
     15    aEventDispatcher,
     16    aUri,
     17    aWhere,
     18    aFlags,
     19    aTriggeringPrincipal
     20  ) {
     21    if (!aWindow) {
     22      return false;
     23    }
     24 
     25    const triggerUri =
     26      aTriggeringPrincipal &&
     27      (aTriggeringPrincipal.isNullPrincipal ? null : aTriggeringPrincipal.URI);
     28 
     29    const message = {
     30      type: "GeckoView:OnLoadRequest",
     31      uri: aUri ? aUri.displaySpec : "",
     32      where: aWhere,
     33      flags: aFlags,
     34      triggerUri: triggerUri && triggerUri.displaySpec,
     35      hasUserGesture: aWindow.document.hasValidTransientUserGestureActivation,
     36    };
     37 
     38    try {
     39      return await aEventDispatcher.sendRequestForResult(message);
     40    } catch (e) {
     41      // There was an error or listener was not registered in GeckoSession,
     42      // treat as unhandled.
     43      return false;
     44    }
     45  },
     46 
     47  handleLoadError(aWindow, aErrorPagePromise) {
     48    let errorPageURI = undefined;
     49    aErrorPagePromise.then(
     50      response => {
     51        try {
     52          errorPageURI = response ? Services.io.newURI(response) : null;
     53        } catch (e) {
     54          warn`Failed to parse URI '${response}`;
     55          errorPageURI = null;
     56          Components.returnCode = Cr.NS_ERROR_ABORT;
     57        }
     58      },
     59      () => {
     60        errorPageURI = null;
     61        Components.returnCode = Cr.NS_ERROR_ABORT;
     62      }
     63    );
     64    Services.tm.spinEventLoopUntil(
     65      "LoadURIDelegate.sys.mjs:handleLoadError",
     66      () => aWindow.closed || errorPageURI !== undefined
     67    );
     68 
     69    return errorPageURI;
     70  },
     71 
     72  isSafeBrowsingError(aError) {
     73    return (
     74      aError === Cr.NS_ERROR_PHISHING_URI ||
     75      aError === Cr.NS_ERROR_MALWARE_URI ||
     76      aError === Cr.NS_ERROR_HARMFUL_URI ||
     77      aError === Cr.NS_ERROR_UNWANTED_URI ||
     78      aError === Cr.NS_ERROR_HARMFULADDON_URI
     79    );
     80  },
     81 };