mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3.3 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/. */
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
// Test whether fallback mechanism is working if don't trust nsIExternalProtocolService.
 | 
						|
 | 
						|
const { AppConstants } = ChromeUtils.importESModule(
 | 
						|
  "resource://gre/modules/AppConstants.sys.mjs"
 | 
						|
);
 | 
						|
const { MockRegistrar } = ChromeUtils.importESModule(
 | 
						|
  "resource://testing-common/MockRegistrar.sys.mjs"
 | 
						|
);
 | 
						|
 | 
						|
add_task(async function setup() {
 | 
						|
  info(
 | 
						|
    "Prepare mock nsIExternalProtocolService whose externalProtocolHandlerExists returns always true"
 | 
						|
  );
 | 
						|
  const externalProtocolService = Cc[
 | 
						|
    "@mozilla.org/uriloader/external-protocol-service;1"
 | 
						|
  ].getService(Ci.nsIExternalProtocolService);
 | 
						|
  const mockId = MockRegistrar.register(
 | 
						|
    "@mozilla.org/uriloader/external-protocol-service;1",
 | 
						|
    {
 | 
						|
      getProtocolHandlerInfo: scheme =>
 | 
						|
        externalProtocolService.getProtocolHandlerInfo(scheme),
 | 
						|
      externalProtocolHandlerExists: () => true,
 | 
						|
      QueryInterface: ChromeUtils.generateQI(["nsIExternalProtocolService"]),
 | 
						|
    }
 | 
						|
  );
 | 
						|
  const mockExternalProtocolService = Cc[
 | 
						|
    "@mozilla.org/uriloader/external-protocol-service;1"
 | 
						|
  ].getService(Ci.nsIExternalProtocolService);
 | 
						|
  Assert.ok(
 | 
						|
    mockExternalProtocolService.externalProtocolHandlerExists("__invalid__"),
 | 
						|
    "Mock service is working"
 | 
						|
  );
 | 
						|
 | 
						|
  info("Register new dummy protocol");
 | 
						|
  const dummyProtocolHandlerInfo =
 | 
						|
    externalProtocolService.getProtocolHandlerInfo("dummy");
 | 
						|
  const handlerService = Cc[
 | 
						|
    "@mozilla.org/uriloader/handler-service;1"
 | 
						|
  ].getService(Ci.nsIHandlerService);
 | 
						|
  handlerService.store(dummyProtocolHandlerInfo);
 | 
						|
 | 
						|
  info("Prepare test search engine");
 | 
						|
  await setupSearchService();
 | 
						|
  await addTestEngines();
 | 
						|
  await Services.search.setDefault(
 | 
						|
    Services.search.getEngineByName(kSearchEngineID),
 | 
						|
    Ci.nsISearchService.CHANGE_REASON_UNKNOWN
 | 
						|
  );
 | 
						|
 | 
						|
  registerCleanupFunction(() => {
 | 
						|
    handlerService.remove(dummyProtocolHandlerInfo);
 | 
						|
    MockRegistrar.unregister(mockId);
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
add_task(function basic() {
 | 
						|
  const testData = [
 | 
						|
    {
 | 
						|
      input: "mailto:test@example.com",
 | 
						|
      expected:
 | 
						|
        isSupportedInHandlerService("mailto") ||
 | 
						|
        // Thunderbird IS a mailto handler, it doesn't have handlers.
 | 
						|
        AppConstants.MOZ_APP_NAME == "thunderbird"
 | 
						|
          ? "mailto:test@example.com"
 | 
						|
          : "http://mailto:test@example.com/",
 | 
						|
    },
 | 
						|
    {
 | 
						|
      input: "keyword:search",
 | 
						|
      expected: "https://www.example.org/?search=keyword%3Asearch",
 | 
						|
    },
 | 
						|
    {
 | 
						|
      input: "dummy:protocol",
 | 
						|
      expected: "dummy:protocol",
 | 
						|
    },
 | 
						|
  ];
 | 
						|
 | 
						|
  for (const { input, expected } of testData) {
 | 
						|
    assertFixup(input, expected);
 | 
						|
  }
 | 
						|
});
 | 
						|
 | 
						|
function assertFixup(input, expected) {
 | 
						|
  const { preferredURI } = Services.uriFixup.getFixupURIInfo(
 | 
						|
    input,
 | 
						|
    Services.uriFixup.FIXUP_FLAG_FIX_SCHEME_TYPOS
 | 
						|
  );
 | 
						|
  Assert.equal(preferredURI.spec, expected);
 | 
						|
}
 | 
						|
 | 
						|
function isSupportedInHandlerService(scheme) {
 | 
						|
  const externalProtocolService = Cc[
 | 
						|
    "@mozilla.org/uriloader/external-protocol-service;1"
 | 
						|
  ].getService(Ci.nsIExternalProtocolService);
 | 
						|
  const handlerService = Cc[
 | 
						|
    "@mozilla.org/uriloader/handler-service;1"
 | 
						|
  ].getService(Ci.nsIHandlerService);
 | 
						|
  return handlerService.exists(
 | 
						|
    externalProtocolService.getProtocolHandlerInfo(scheme)
 | 
						|
  );
 | 
						|
}
 |