diff -r 000000000000 -r 6474c204b198 toolkit/devtools/DevToolsExtensions.jsm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/devtools/DevToolsExtensions.jsm Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,46 @@ +/* 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"; + +this.EXPORTED_SYMBOLS = ["gDevToolsExtensions"]; + +Components.utils.import("resource://gre/modules/Services.jsm"); + +let globalsCache = {}; + +this.gDevToolsExtensions = { + addContentGlobal: function(options) { + if (!options || !options.global || !options['inner-window-id']) { + throw Error('Invalid arguments'); + } + let cache = getGlobalCache(options['inner-window-id']); + cache.push(options.global); + return undefined; + }, + getContentGlobals: function(options) { + if (!options || !options['inner-window-id']) { + throw Error('Invalid arguments'); + } + return Array.slice(globalsCache[options['inner-window-id']] || []); + }, + removeContentGlobal: function(options) { + if (!options || !options.global || !options['inner-window-id']) { + throw Error('Invalid arguments'); + } + let cache = getGlobalCache(options['inner-window-id']); + let index = cache.indexOf(options.global); + cache.splice(index, 1); + return undefined; + } +}; + +function getGlobalCache(aInnerWindowID) { + return globalsCache[aInnerWindowID] = globalsCache[aInnerWindowID] || []; +} + +// when the window is destroyed, eliminate the associated globals cache +Services.obs.addObserver(function observer(subject, topic, data) { + let id = subject.QueryInterface(Components.interfaces.nsISupportsPRUint64).data; + delete globalsCache[id]; +}, 'inner-window-destroyed', false);