diff -r 000000000000 -r 6474c204b198 addon-sdk/source/lib/sdk/addon-page.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/addon-sdk/source/lib/sdk/addon-page.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,73 @@ +/* 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'; + +module.metadata = { + 'stability': 'deprecated' +}; + +const { WindowTracker } = require('./deprecated/window-utils'); +const { isXULBrowser } = require('./window/utils'); +const { add, remove } = require('./util/array'); +const { getTabs, closeTab, getURI } = require('./tabs/utils'); +const { data } = require('./self'); +const { ns } = require("./core/namespace"); + +const addonURL = data.url('index.html'); + +const windows = ns(); + +require("./util/deprecate").deprecateUsage( + "The addon-page module is deprecated." + + "In the new Firefox UI design all pages will include navigational elements;" + + "once the new design ships, using the addon-page module will not have any effect." +); + +WindowTracker({ + onTrack: function onTrack(window) { + if (!isXULBrowser(window) || windows(window).hideChromeForLocation) + return; + + let { XULBrowserWindow } = window; + let { hideChromeForLocation } = XULBrowserWindow; + + windows(window).hideChromeForLocation = hideChromeForLocation; + + // Augmenting the behavior of `hideChromeForLocation` method, as + // suggested by https://developer.mozilla.org/en-US/docs/Hiding_browser_chrome + XULBrowserWindow.hideChromeForLocation = function(url) { + return isAddonURL(url) || hideChromeForLocation.call(this, url); + } + }, + + onUntrack: function onUntrack(window) { + if (isXULBrowser(window)) + getTabs(window).filter(tabFilter).forEach(untrackTab.bind(null, window)); + } +}); + +function isAddonURL(url) { + if (url.indexOf(addonURL) === 0) { + let rest = url.substr(addonURL.length); + return ((rest.length === 0) || (['#','?'].indexOf(rest.charAt(0)) > -1)); + } + return false; +} + +function tabFilter(tab) { + return isAddonURL(getURI(tab)); +} + +function untrackTab(window, tab) { + // Note: `onUntrack` will be called for all windows on add-on unloads, + // so we want to clean them up from these URLs. + let { hideChromeForLocation } = windows(window); + + if (hideChromeForLocation) { + window.XULBrowserWindow.hideChromeForLocation = hideChromeForLocation.bind(window.XULBrowserWindow); + windows(window).hideChromeForLocation = null; + } + + closeTab(tab); +}