Bug 1300588 - Implements the devtools.network.onNavigated API event, r=kmag,ochameau
MozReview-Commit-ID: 3P2KTzuzbWn
This commit is contained in:
@@ -12,6 +12,7 @@ module.exports = { // eslint-disable-line no-undef
|
|||||||
"WindowEventManager": true,
|
"WindowEventManager": true,
|
||||||
"browserActionFor": true,
|
"browserActionFor": true,
|
||||||
"getCookieStoreIdForTab": true,
|
"getCookieStoreIdForTab": true,
|
||||||
|
"getDevToolsTargetForContext": true,
|
||||||
"makeWidgetId": true,
|
"makeWidgetId": true,
|
||||||
"pageActionFor": true,
|
"pageActionFor": true,
|
||||||
"tabTracker": true,
|
"tabTracker": true,
|
||||||
|
|||||||
35
browser/components/extensions/ext-devtools-network.js
Normal file
35
browser/components/extensions/ext-devtools-network.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||||
|
/* vim: set sts=2 sw=2 et tw=80: */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
|
||||||
|
|
||||||
|
const {
|
||||||
|
SingletonEventManager,
|
||||||
|
} = ExtensionUtils;
|
||||||
|
|
||||||
|
extensions.registerSchemaAPI("devtools.network", "devtools_parent", (context) => {
|
||||||
|
return {
|
||||||
|
devtools: {
|
||||||
|
network: {
|
||||||
|
onNavigated: new SingletonEventManager(context, "devtools.onNavigated", fire => {
|
||||||
|
let listener = (event, data) => {
|
||||||
|
fire.async(data.url);
|
||||||
|
};
|
||||||
|
|
||||||
|
let targetPromise = getDevToolsTargetForContext(context);
|
||||||
|
targetPromise.then(target => {
|
||||||
|
target.on("will-navigate", listener);
|
||||||
|
});
|
||||||
|
return () => {
|
||||||
|
targetPromise.then(target => {
|
||||||
|
target.off("will-navigate", listener);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}).api(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
@@ -7,6 +7,7 @@ category webextension-scripts contextMenus chrome://browser/content/ext-contextM
|
|||||||
category webextension-scripts desktop-runtime chrome://browser/content/ext-desktop-runtime.js
|
category webextension-scripts desktop-runtime chrome://browser/content/ext-desktop-runtime.js
|
||||||
category webextension-scripts devtools chrome://browser/content/ext-devtools.js
|
category webextension-scripts devtools chrome://browser/content/ext-devtools.js
|
||||||
category webextension-scripts devtools-inspectedWindow chrome://browser/content/ext-devtools-inspectedWindow.js
|
category webextension-scripts devtools-inspectedWindow chrome://browser/content/ext-devtools-inspectedWindow.js
|
||||||
|
category webextension-scripts devtools-network chrome://browser/content/ext-devtools-network.js
|
||||||
category webextension-scripts history chrome://browser/content/ext-history.js
|
category webextension-scripts history chrome://browser/content/ext-history.js
|
||||||
category webextension-scripts omnibox chrome://browser/content/ext-omnibox.js
|
category webextension-scripts omnibox chrome://browser/content/ext-omnibox.js
|
||||||
category webextension-scripts pageAction chrome://browser/content/ext-pageAction.js
|
category webextension-scripts pageAction chrome://browser/content/ext-pageAction.js
|
||||||
@@ -34,6 +35,7 @@ category webextension-schemas context_menus chrome://browser/content/schemas/con
|
|||||||
category webextension-schemas context_menus_internal chrome://browser/content/schemas/context_menus_internal.json
|
category webextension-schemas context_menus_internal chrome://browser/content/schemas/context_menus_internal.json
|
||||||
category webextension-schemas devtools chrome://browser/content/schemas/devtools.json
|
category webextension-schemas devtools chrome://browser/content/schemas/devtools.json
|
||||||
category webextension-schemas devtools_inspected_window chrome://browser/content/schemas/devtools_inspected_window.json
|
category webextension-schemas devtools_inspected_window chrome://browser/content/schemas/devtools_inspected_window.json
|
||||||
|
category webextension-schemas devtools_network chrome://browser/content/schemas/devtools_network.json
|
||||||
category webextension-schemas history chrome://browser/content/schemas/history.json
|
category webextension-schemas history chrome://browser/content/schemas/history.json
|
||||||
category webextension-schemas omnibox chrome://browser/content/schemas/omnibox.json
|
category webextension-schemas omnibox chrome://browser/content/schemas/omnibox.json
|
||||||
category webextension-schemas page_action chrome://browser/content/schemas/page_action.json
|
category webextension-schemas page_action chrome://browser/content/schemas/page_action.json
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ browser.jar:
|
|||||||
content/browser/ext-desktop-runtime.js
|
content/browser/ext-desktop-runtime.js
|
||||||
content/browser/ext-devtools.js
|
content/browser/ext-devtools.js
|
||||||
content/browser/ext-devtools-inspectedWindow.js
|
content/browser/ext-devtools-inspectedWindow.js
|
||||||
|
content/browser/ext-devtools-network.js
|
||||||
content/browser/ext-history.js
|
content/browser/ext-history.js
|
||||||
content/browser/ext-omnibox.js
|
content/browser/ext-omnibox.js
|
||||||
content/browser/ext-pageAction.js
|
content/browser/ext-pageAction.js
|
||||||
|
|||||||
93
browser/components/extensions/schemas/devtools_network.json
Normal file
93
browser/components/extensions/schemas/devtools_network.json
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"namespace": "devtools.network",
|
||||||
|
"allowedContexts": ["devtools", "devtools_only"],
|
||||||
|
"defaultContexts": ["devtools", "devtools_only"],
|
||||||
|
"description": "Use the <code>chrome.devtools.network</code> API to retrieve the information about network requests displayed by the Developer Tools in the Network panel.",
|
||||||
|
"types": [
|
||||||
|
{
|
||||||
|
"id": "Request",
|
||||||
|
"type": "object",
|
||||||
|
"description": "Represents a network request for a document resource (script, image and so on). See HAR Specification for reference.",
|
||||||
|
"functions": [
|
||||||
|
{
|
||||||
|
"name": "getContent",
|
||||||
|
"type": "function",
|
||||||
|
"description": "Returns content of the response body.",
|
||||||
|
"async": "callback",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "callback",
|
||||||
|
"type": "function",
|
||||||
|
"description": "A function that receives the response body when the request completes.",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "content",
|
||||||
|
"type": "string",
|
||||||
|
"description": "Content of the response body (potentially encoded)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "encoding",
|
||||||
|
"type": "string",
|
||||||
|
"description": "Empty if content is not encoded, encoding name otherwise. Currently, only base64 is supported."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"functions": [
|
||||||
|
{
|
||||||
|
"name": "getHAR",
|
||||||
|
"unsupported": true,
|
||||||
|
"type": "function",
|
||||||
|
"description": "Returns HAR log that contains all known network requests.",
|
||||||
|
"async": "callback",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "callback",
|
||||||
|
"type": "function",
|
||||||
|
"description": "A function that receives the HAR log when the request completes.",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "harLog",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": {"type": "any"},
|
||||||
|
"description": "A HAR log. See HAR specification for details."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"events": [
|
||||||
|
{
|
||||||
|
"name": "onRequestFinished",
|
||||||
|
"unsupported": true,
|
||||||
|
"type": "function",
|
||||||
|
"description": "Fired when a network request is finished and all request data are available.",
|
||||||
|
"parameters": [
|
||||||
|
{ "name": "request", "$ref": "Request", "description": "Description of a network request in the form of a HAR entry. See HAR specification for details." }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "onNavigated",
|
||||||
|
"type": "function",
|
||||||
|
"description": "Fired when the inspected window navigates to a new page.",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"name": "url",
|
||||||
|
"type": "string",
|
||||||
|
"description": "URL of the new page."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -11,6 +11,7 @@ browser.jar:
|
|||||||
content/browser/schemas/context_menus_internal.json
|
content/browser/schemas/context_menus_internal.json
|
||||||
content/browser/schemas/devtools.json
|
content/browser/schemas/devtools.json
|
||||||
content/browser/schemas/devtools_inspected_window.json
|
content/browser/schemas/devtools_inspected_window.json
|
||||||
|
content/browser/schemas/devtools_network.json
|
||||||
content/browser/schemas/history.json
|
content/browser/schemas/history.json
|
||||||
content/browser/schemas/omnibox.json
|
content/browser/schemas/omnibox.json
|
||||||
content/browser/schemas/page_action.json
|
content/browser/schemas/page_action.json
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ support-files =
|
|||||||
[browser_ext_currentWindow.js]
|
[browser_ext_currentWindow.js]
|
||||||
[browser_ext_devtools_inspectedWindow.js]
|
[browser_ext_devtools_inspectedWindow.js]
|
||||||
[browser_ext_devtools_inspectedWindow_reload.js]
|
[browser_ext_devtools_inspectedWindow_reload.js]
|
||||||
|
[browser_ext_devtools_network.js]
|
||||||
[browser_ext_devtools_page.js]
|
[browser_ext_devtools_page.js]
|
||||||
[browser_ext_getViews.js]
|
[browser_ext_getViews.js]
|
||||||
[browser_ext_incognito_views.js]
|
[browser_ext_incognito_views.js]
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||||
|
/* vim: set sts=2 sw=2 et tw=80: */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "devtools",
|
||||||
|
"resource://devtools/shared/Loader.jsm");
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "gDevTools",
|
||||||
|
"resource://devtools/client/framework/gDevTools.jsm");
|
||||||
|
|
||||||
|
add_task(async function test_devtools_network_on_navigated() {
|
||||||
|
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "http://mochi.test:8888/");
|
||||||
|
|
||||||
|
function background() {
|
||||||
|
browser.test.onMessage.addListener(msg => {
|
||||||
|
let code;
|
||||||
|
if (msg === "navigate") {
|
||||||
|
code = "window.wrappedJSObject.location.href = 'http://example.com/';";
|
||||||
|
browser.tabs.executeScript({code});
|
||||||
|
} else if (msg === "reload") {
|
||||||
|
code = "window.wrappedJSObject.location.reload(true);";
|
||||||
|
browser.tabs.executeScript({code});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
|
||||||
|
if (changeInfo.status === "complete" && tab.url === "http://example.com/") {
|
||||||
|
browser.test.sendMessage("tabUpdated");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
browser.test.sendMessage("ready");
|
||||||
|
}
|
||||||
|
|
||||||
|
function devtools_page() {
|
||||||
|
let eventCount = 0;
|
||||||
|
let listener = url => {
|
||||||
|
eventCount++;
|
||||||
|
browser.test.assertEq("http://example.com/", url, "onNavigated received the expected url.");
|
||||||
|
if (eventCount === 2) {
|
||||||
|
browser.devtools.network.onNavigated.removeListener(listener);
|
||||||
|
}
|
||||||
|
browser.test.sendMessage("onNavigatedFired", eventCount);
|
||||||
|
};
|
||||||
|
browser.devtools.network.onNavigated.addListener(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
let extension = ExtensionTestUtils.loadExtension({
|
||||||
|
background,
|
||||||
|
manifest: {
|
||||||
|
permissions: ["tabs", "http://mochi.test/", "http://example.com/"],
|
||||||
|
devtools_page: "devtools_page.html",
|
||||||
|
},
|
||||||
|
files: {
|
||||||
|
"devtools_page.html": `<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<script src="devtools_page.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
</body>
|
||||||
|
</html>`,
|
||||||
|
"devtools_page.js": devtools_page,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await extension.startup();
|
||||||
|
await extension.awaitMessage("ready");
|
||||||
|
|
||||||
|
let target = devtools.TargetFactory.forTab(tab);
|
||||||
|
|
||||||
|
await gDevTools.showToolbox(target, "webconsole");
|
||||||
|
info("Developer toolbox opened.");
|
||||||
|
|
||||||
|
extension.sendMessage("navigate");
|
||||||
|
await extension.awaitMessage("tabUpdated");
|
||||||
|
let eventCount = await extension.awaitMessage("onNavigatedFired");
|
||||||
|
is(eventCount, 1, "The expected number of events were fired.");
|
||||||
|
|
||||||
|
extension.sendMessage("reload");
|
||||||
|
await extension.awaitMessage("tabUpdated");
|
||||||
|
eventCount = await extension.awaitMessage("onNavigatedFired");
|
||||||
|
is(eventCount, 2, "The expected number of events were fired.");
|
||||||
|
|
||||||
|
// do a reload after the listener has been removed, do not expect a message to be sent
|
||||||
|
extension.sendMessage("reload");
|
||||||
|
await extension.awaitMessage("tabUpdated");
|
||||||
|
|
||||||
|
await gDevTools.closeToolbox(target);
|
||||||
|
|
||||||
|
await target.destroy();
|
||||||
|
|
||||||
|
await extension.unload();
|
||||||
|
|
||||||
|
await BrowserTestUtils.removeTab(tab);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user