123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /* 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";
- const { Loader } = require("sdk/test/loader");
- const { getMostRecentBrowserWindow, getInnerId } = require("sdk/window/utils");
- const { openTab, closeTab, getBrowserForTab } = require("sdk/tabs/utils");
- const { defer } = require("sdk/core/promise");
- const { curry, identity, partial } = require("sdk/lang/functional");
- let when = curry(function(options, tab) {
- let type = options.type || options;
- let capture = options.capture || false;
- let target = getBrowserForTab(tab);
- let { promise, resolve } = defer();
- target.addEventListener(type, function handler(event) {
- if (!event.target.defaultView.frameElement) {
- target.removeEventListener(type, handler, capture);
- resolve(tab);
- }
- }, capture);
- return promise;
- });
- let use = function(value) function() value;
- let open = curry(function(url, window) openTab(window, url));
- let close = function(tab) {
- let promise = when("pagehide", tab);
- closeTab(tab);
- return promise;
- }
- exports["test multiple tabs"] = function(assert, done) {
- let loader = Loader(module);
- let { events } = loader.require("sdk/content/events");
- let { on, off } = loader.require("sdk/event/core");
- let actual = [];
- on(events, "data", handler);
- function handler ({type, target, timeStamp}) {
- eventFilter(type, target, () => {
- actual.push(type + " -> " + target.URL)
- });
- }
- let window = getMostRecentBrowserWindow();
- let firstTab = open("data:text/html,first-tab", window);
- when("pageshow", firstTab).
- then(close).
- then(use(window)).
- then(open("data:text/html,second-tab")).
- then(when("pageshow")).
- then(close).
- then(function() {
- assert.deepEqual(actual, [
- "document-element-inserted -> data:text/html,first-tab",
- "DOMContentLoaded -> data:text/html,first-tab",
- "load -> data:text/html,first-tab",
- "pageshow -> data:text/html,first-tab",
- "document-element-inserted -> data:text/html,second-tab",
- "DOMContentLoaded -> data:text/html,second-tab",
- "load -> data:text/html,second-tab",
- "pageshow -> data:text/html,second-tab"
- ], "all events dispatche as expeced")
- }, function(reason) {
- assert.fail(Error(reason));
- }).then(function() {
- loader.unload();
- off(events, "data", handler);
- done();
- });
- };
- exports["test nested frames"] = function(assert, done) {
- let loader = Loader(module);
- let { events } = loader.require("sdk/content/events");
- let { on, off } = loader.require("sdk/event/core");
- let actual = [];
- on(events, "data", handler);
- function handler ({type, target, timeStamp}) {
- eventFilter(type, target, () => {
- actual.push(type + " -> " + target.URL)
- });
- }
- let window = getMostRecentBrowserWindow();
- let uri = encodeURI("data:text/html,<iframe src='data:text/html,iframe'>");
- let tab = open(uri, window);
- when("pageshow", tab).
- then(close).
- then(function() {
- assert.deepEqual(actual, [
- "document-element-inserted -> " + uri,
- "DOMContentLoaded -> " + uri,
- "document-element-inserted -> data:text/html,iframe",
- "DOMContentLoaded -> data:text/html,iframe",
- "load -> data:text/html,iframe",
- "pageshow -> data:text/html,iframe",
- "load -> " + uri,
- "pageshow -> " + uri
- ], "events where dispatched")
- }, function(reason) {
- assert.fail(Error(reason))
- }).then(function() {
- loader.unload();
- off(events, "data", handler);
- done();
- });
- };
- // ignore about:blank pages and *-document-global-created
- // events that are not very consistent.
- // ignore http:// requests, as Fennec's `about:home` page
- // displays add-ons a user could install
- // ignore local `searchplugins` files loaded
- // Calls callback if passes filter
- function eventFilter (type, target, callback) {
- if (target.URL !== "about:blank" &&
- target.URL !== "about:home" &&
- !target.URL.match(/^https?:\/\//i) &&
- !target.URL.match(/searchplugins/) &&
- type !== "chrome-document-global-created" &&
- type !== "content-document-global-created")
-
- callback();
- }
- require("test").run(exports);
|