Bug 1300588 - Implements the devtools.network.onNavigated API event, r=kmag,ochameau

MozReview-Commit-ID: 3P2KTzuzbWn
This commit is contained in:
Bob Silverberg
2017-01-20 14:50:20 -05:00
parent 2d7e6c9f83
commit 59e47f8d9d
8 changed files with 228 additions and 0 deletions

View File

@@ -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,

View 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(),
},
},
};
});

View File

@@ -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

View File

@@ -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

View 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."
}
]
}
]
}
]

View File

@@ -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

View File

@@ -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]

View File

@@ -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);
});