forked from mirrors/gecko-dev
		
	These issues were previously ignored due to the nature of our global import rules. They need to be fixed before that rule can be updated. MozReview-Commit-ID: DCChktTc5TW --HG-- extra : rebase_source : cffb1c9762191c579d1397c8169e6e7635d229da extra : histedit_source : dea59ddd2daaae52069c5faceae9149a4f08dd73
		
			
				
	
	
		
			130 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
	
		
			4.9 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";
 | 
						|
 | 
						|
ChromeUtils.defineModuleGetter(this, "ExtensionControlledPopup",
 | 
						|
                               "resource:///modules/ExtensionControlledPopup.jsm");
 | 
						|
ChromeUtils.defineModuleGetter(this, "ExtensionSettingsStore",
 | 
						|
                               "resource://gre/modules/ExtensionSettingsStore.jsm");
 | 
						|
 | 
						|
XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
 | 
						|
                                   "@mozilla.org/browser/aboutnewtab-service;1",
 | 
						|
                                   "nsIAboutNewTabService");
 | 
						|
 | 
						|
const STORE_TYPE = "url_overrides";
 | 
						|
const NEW_TAB_SETTING_NAME = "newTabURL";
 | 
						|
const NEW_TAB_CONFIRMED_TYPE = "newTabNotification";
 | 
						|
 | 
						|
XPCOMUtils.defineLazyGetter(this, "newTabPopup", () => {
 | 
						|
  return new ExtensionControlledPopup({
 | 
						|
    confirmedType: NEW_TAB_CONFIRMED_TYPE,
 | 
						|
    observerTopic: "browser-open-newtab-start",
 | 
						|
    popupnotificationId: "extension-new-tab-notification",
 | 
						|
    settingType: STORE_TYPE,
 | 
						|
    settingKey: NEW_TAB_SETTING_NAME,
 | 
						|
    descriptionId: "extension-new-tab-notification-description",
 | 
						|
    descriptionMessageId: "newTabControlled.message2",
 | 
						|
    learnMoreMessageId: "newTabControlled.learnMore",
 | 
						|
    learnMoreLink: "extension-home",
 | 
						|
    onObserverAdded() {
 | 
						|
      aboutNewTabService.willNotifyUser = true;
 | 
						|
    },
 | 
						|
    onObserverRemoved() {
 | 
						|
      aboutNewTabService.willNotifyUser = false;
 | 
						|
    },
 | 
						|
    async beforeDisableAddon(popup, win) {
 | 
						|
      // ExtensionControlledPopup will disable the add-on once this function completes.
 | 
						|
      // Disabling an add-on should remove the tabs that it has open, but we want
 | 
						|
      // to open the new New Tab in this tab (which might get closed).
 | 
						|
      //   1. Replace the tab's URL with about:blank
 | 
						|
      //   2. Return control to ExtensionControlledPopup once about:blank has loaded
 | 
						|
      //   3. Once the New Tab URL has changed, replace the tab's URL with the new New Tab URL
 | 
						|
      let gBrowser = win.gBrowser;
 | 
						|
      let tab = gBrowser.selectedTab;
 | 
						|
      await replaceUrlInTab(gBrowser, tab, "about:blank");
 | 
						|
      Services.obs.addObserver({
 | 
						|
        async observe() {
 | 
						|
          await replaceUrlInTab(gBrowser, tab, aboutNewTabService.newTabURL);
 | 
						|
          // Now that the New Tab is loading, try to open the popup again. This
 | 
						|
          // will only open the popup if a new extension is controlling the New Tab.
 | 
						|
          popup.open();
 | 
						|
          Services.obs.removeObserver(this, "newtab-url-changed");
 | 
						|
        },
 | 
						|
      }, "newtab-url-changed");
 | 
						|
    },
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
function setNewTabURL(extensionId, url) {
 | 
						|
  if (extensionId) {
 | 
						|
    newTabPopup.addObserver(extensionId);
 | 
						|
  } else {
 | 
						|
    newTabPopup.removeObserver();
 | 
						|
  }
 | 
						|
  aboutNewTabService.newTabURL = url;
 | 
						|
}
 | 
						|
 | 
						|
this.urlOverrides = class extends ExtensionAPI {
 | 
						|
  static onUninstall(id) {
 | 
						|
    // TODO: This can be removed once bug 1438364 is fixed and all data is cleaned up.
 | 
						|
    newTabPopup.clearConfirmation(id);
 | 
						|
  }
 | 
						|
 | 
						|
  processNewTabSetting(action) {
 | 
						|
    let {extension} = this;
 | 
						|
    let item = ExtensionSettingsStore[action](extension.id, STORE_TYPE, NEW_TAB_SETTING_NAME);
 | 
						|
    if (item) {
 | 
						|
      setNewTabURL(item.id, item.value || item.initialValue);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  async onManifestEntry(entryName) {
 | 
						|
    let {extension} = this;
 | 
						|
    let {manifest} = extension;
 | 
						|
 | 
						|
    await ExtensionSettingsStore.initialize();
 | 
						|
 | 
						|
    if (manifest.chrome_url_overrides.newtab) {
 | 
						|
      // Set up the shutdown code for the setting.
 | 
						|
      extension.callOnClose({
 | 
						|
        close: () => {
 | 
						|
          switch (extension.shutdownReason) {
 | 
						|
            case "ADDON_DISABLE":
 | 
						|
              this.processNewTabSetting("disable");
 | 
						|
              newTabPopup.clearConfirmation(extension.id);
 | 
						|
              break;
 | 
						|
 | 
						|
            // We can remove the setting on upgrade or downgrade because it will be
 | 
						|
            // added back in when the manifest is re-read. This will cover the case
 | 
						|
            // where a new version of an add-on removes the manifest key.
 | 
						|
            case "ADDON_DOWNGRADE":
 | 
						|
            case "ADDON_UPGRADE":
 | 
						|
            case "ADDON_UNINSTALL":
 | 
						|
              this.processNewTabSetting("removeSetting");
 | 
						|
              break;
 | 
						|
          }
 | 
						|
        },
 | 
						|
      });
 | 
						|
 | 
						|
      let url = extension.baseURI.resolve(manifest.chrome_url_overrides.newtab);
 | 
						|
 | 
						|
      let item = await ExtensionSettingsStore.addSetting(
 | 
						|
        extension.id, STORE_TYPE, NEW_TAB_SETTING_NAME, url,
 | 
						|
        () => aboutNewTabService.newTabURL);
 | 
						|
 | 
						|
      // If the extension was just re-enabled, change the setting to enabled.
 | 
						|
      // This is required because addSetting above is used for both add and update.
 | 
						|
      if (["ADDON_ENABLE", "ADDON_UPGRADE", "ADDON_DOWNGRADE"]
 | 
						|
          .includes(extension.startupReason)) {
 | 
						|
        item = ExtensionSettingsStore.enable(extension.id, STORE_TYPE, NEW_TAB_SETTING_NAME);
 | 
						|
      }
 | 
						|
 | 
						|
      // Set the newTabURL to the current value of the setting.
 | 
						|
      if (item) {
 | 
						|
        setNewTabURL(item.id, item.value || item.initialValue);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
};
 |