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,
|
||||
"browserActionFor": true,
|
||||
"getCookieStoreIdForTab": true,
|
||||
"getDevToolsTargetForContext": true,
|
||||
"makeWidgetId": true,
|
||||
"pageActionFor": 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 devtools chrome://browser/content/ext-devtools.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 omnibox chrome://browser/content/ext-omnibox.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 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_network chrome://browser/content/schemas/devtools_network.json
|
||||
category webextension-schemas history chrome://browser/content/schemas/history.json
|
||||
category webextension-schemas omnibox chrome://browser/content/schemas/omnibox.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-devtools.js
|
||||
content/browser/ext-devtools-inspectedWindow.js
|
||||
content/browser/ext-devtools-network.js
|
||||
content/browser/ext-history.js
|
||||
content/browser/ext-omnibox.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/devtools.json
|
||||
content/browser/schemas/devtools_inspected_window.json
|
||||
content/browser/schemas/devtools_network.json
|
||||
content/browser/schemas/history.json
|
||||
content/browser/schemas/omnibox.json
|
||||
content/browser/schemas/page_action.json
|
||||
|
||||
@@ -52,6 +52,7 @@ support-files =
|
||||
[browser_ext_currentWindow.js]
|
||||
[browser_ext_devtools_inspectedWindow.js]
|
||||
[browser_ext_devtools_inspectedWindow_reload.js]
|
||||
[browser_ext_devtools_network.js]
|
||||
[browser_ext_devtools_page.js]
|
||||
[browser_ext_getViews.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