mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * 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/. */
 | 
						|
 | 
						|
const PREF_TEST_ORIGINS = "browser.uitour.testingOrigins";
 | 
						|
const UITOUR_PERMISSION = "uitour";
 | 
						|
 | 
						|
export let UITourUtils = {
 | 
						|
  /**
 | 
						|
   * Check if we've got a testing origin.
 | 
						|
   *
 | 
						|
   * @param {nsIURI} uri
 | 
						|
   *    The URI to check
 | 
						|
   * @returns {boolean}
 | 
						|
   *    Whether or not it's a testing origin.
 | 
						|
   */
 | 
						|
  isTestingOrigin(uri) {
 | 
						|
    let testingOrigins = Services.prefs.getStringPref(PREF_TEST_ORIGINS, "");
 | 
						|
    if (!testingOrigins) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    // Allow any testing origins (comma-seperated).
 | 
						|
    for (let origin of testingOrigins.split(/\s*,\s*/)) {
 | 
						|
      try {
 | 
						|
        let testingURI = Services.io.newURI(origin);
 | 
						|
        if (uri.prePath == testingURI.prePath) {
 | 
						|
          return true;
 | 
						|
        }
 | 
						|
      } catch (ex) {
 | 
						|
        console.error(ex);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return false;
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   *
 | 
						|
   * @param {WindowGlobalChild|WindowGlobalParent} windowGlobal
 | 
						|
   *   The parent/child representation of a window global to check if we can
 | 
						|
   *   use UITour.
 | 
						|
   * @returns {boolean}
 | 
						|
   *   Whether or not we can use UITour here.
 | 
						|
   */
 | 
						|
  ensureTrustedOrigin(windowGlobal) {
 | 
						|
    // If we're not top-most or no longer current, bail out immediately.
 | 
						|
    if (windowGlobal.browsingContext.parent || !windowGlobal.isCurrentGlobal) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    let principal, uri;
 | 
						|
    // We can get either a WindowGlobalParent or WindowGlobalChild, depending on
 | 
						|
    // what process we're called in, and determining the secure context-ness and
 | 
						|
    // principal + URI needs different approaches based on this.
 | 
						|
    if (WindowGlobalParent.isInstance(windowGlobal)) {
 | 
						|
      if (!windowGlobal.browsingContext.secureBrowserUI?.isSecureContext) {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
      principal = windowGlobal.documentPrincipal;
 | 
						|
      uri = windowGlobal.documentURI;
 | 
						|
    } else {
 | 
						|
      if (!windowGlobal.contentWindow?.isSecureContext) {
 | 
						|
        return false;
 | 
						|
      }
 | 
						|
      let document = windowGlobal.contentWindow.document;
 | 
						|
      principal = document?.nodePrincipal;
 | 
						|
      uri = document?.documentURIObject;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!principal) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
 | 
						|
    let permission = Services.perms.testPermissionFromPrincipal(
 | 
						|
      principal,
 | 
						|
      UITOUR_PERMISSION
 | 
						|
    );
 | 
						|
    if (permission == Services.perms.ALLOW_ACTION) {
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    return uri && this.isTestingOrigin(uri);
 | 
						|
  },
 | 
						|
};
 |