michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: const { Loader } = require("sdk/test/loader"); michael@0: const { getMostRecentBrowserWindow, getInnerId } = require("sdk/window/utils"); michael@0: const { openTab, closeTab, getBrowserForTab } = require("sdk/tabs/utils"); michael@0: const { defer } = require("sdk/core/promise"); michael@0: const { curry, identity, partial } = require("sdk/lang/functional"); michael@0: michael@0: let when = curry(function(options, tab) { michael@0: let type = options.type || options; michael@0: let capture = options.capture || false; michael@0: let target = getBrowserForTab(tab); michael@0: let { promise, resolve } = defer(); michael@0: michael@0: target.addEventListener(type, function handler(event) { michael@0: if (!event.target.defaultView.frameElement) { michael@0: target.removeEventListener(type, handler, capture); michael@0: resolve(tab); michael@0: } michael@0: }, capture); michael@0: michael@0: return promise; michael@0: }); michael@0: michael@0: let use = function(value) function() value; michael@0: michael@0: michael@0: let open = curry(function(url, window) openTab(window, url)); michael@0: let close = function(tab) { michael@0: let promise = when("pagehide", tab); michael@0: closeTab(tab); michael@0: return promise; michael@0: } michael@0: michael@0: exports["test multiple tabs"] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { events } = loader.require("sdk/content/events"); michael@0: let { on, off } = loader.require("sdk/event/core"); michael@0: let actual = []; michael@0: michael@0: on(events, "data", handler); michael@0: function handler ({type, target, timeStamp}) { michael@0: eventFilter(type, target, () => { michael@0: actual.push(type + " -> " + target.URL) michael@0: }); michael@0: } michael@0: michael@0: let window = getMostRecentBrowserWindow(); michael@0: let firstTab = open("data:text/html,first-tab", window); michael@0: michael@0: when("pageshow", firstTab). michael@0: then(close). michael@0: then(use(window)). michael@0: then(open("data:text/html,second-tab")). michael@0: then(when("pageshow")). michael@0: then(close). michael@0: then(function() { michael@0: assert.deepEqual(actual, [ michael@0: "document-element-inserted -> data:text/html,first-tab", michael@0: "DOMContentLoaded -> data:text/html,first-tab", michael@0: "load -> data:text/html,first-tab", michael@0: "pageshow -> data:text/html,first-tab", michael@0: "document-element-inserted -> data:text/html,second-tab", michael@0: "DOMContentLoaded -> data:text/html,second-tab", michael@0: "load -> data:text/html,second-tab", michael@0: "pageshow -> data:text/html,second-tab" michael@0: ], "all events dispatche as expeced") michael@0: }, function(reason) { michael@0: assert.fail(Error(reason)); michael@0: }).then(function() { michael@0: loader.unload(); michael@0: off(events, "data", handler); michael@0: done(); michael@0: }); michael@0: }; michael@0: michael@0: exports["test nested frames"] = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let { events } = loader.require("sdk/content/events"); michael@0: let { on, off } = loader.require("sdk/event/core"); michael@0: let actual = []; michael@0: on(events, "data", handler); michael@0: function handler ({type, target, timeStamp}) { michael@0: eventFilter(type, target, () => { michael@0: actual.push(type + " -> " + target.URL) michael@0: }); michael@0: } michael@0: michael@0: let window = getMostRecentBrowserWindow(); michael@0: let uri = encodeURI("data:text/html,