Commit 6a233641 authored by Erik Luo's avatar Erik Luo Committed by Commit Bot

DevTools: move BrowserConsole back into Console

Motivated by the desire to make Console links keyboard navigable,
this CL removes the BrowserConsole module and moves logic back into
ConsoleViewMessage.

BrowserConsole did not explicitly depend on BrowserSDK.

Bug: 865674
Change-Id: Ibb004c52699b1d504b32accdfa4ee19adc907633
Reviewed-on: https://chromium-review.googlesource.com/c/1338329Reviewed-by: default avatarJoel Einbinder <einbinder@chromium.org>
Commit-Queue: Erik Luo <luoe@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610186}
parent ec66ff00
......@@ -56,14 +56,14 @@
TestRunner.addResult('Making requests with monitoring ENABLED');
Common.settingForTest('monitoringXHREnabled').set(true);
await TestRunner.callFunctionInPageAsync('makeRequests');
await ConsoleTestRunner.renderCompleteMessages();
await ConsoleTestRunner.waitForPendingViewportUpdates();
ConsoleTestRunner.dumpConsoleMessages();
Console.ConsoleView.clearConsole();
TestRunner.addResult('Making requests with monitoring DISABLED');
Common.settingForTest('monitoringXHREnabled').set(false);
await TestRunner.callFunctionInPageAsync('makeRequests');
await ConsoleTestRunner.renderCompleteMessages();
await ConsoleTestRunner.waitForPendingViewportUpdates();
ConsoleTestRunner.dumpConsoleMessages();
TestRunner.completeTest();
......
......@@ -36,7 +36,7 @@
ConsoleTestRunner.addConsoleViewSniffer(addMessage, true);
async function addMessage(uiMessage) {
var element = await uiMessage.completeElementForTest();
var element = uiMessage.toMessageElement();
// There will be only one such message.
if (element.deepTextContent().indexOf('non-existent-iframe') !== -1)
ConsoleTestRunner.expandConsoleMessages(onExpandedMessages);
......
......@@ -20,7 +20,7 @@
TestRunner.deprecatedRunAfterPendingDispatches(async () => {
TestRunner.addResult('XHR with logging enabled: ');
// Sorting console messages to prevent flakiness.
await ConsoleTestRunner.renderCompleteMessages();
await ConsoleTestRunner.waitForPendingViewportUpdates();
TestRunner.addResults(ConsoleTestRunner.dumpConsoleMessagesIntoArray().sort());
Console.ConsoleView.clearConsole();
step2();
......
......@@ -87,8 +87,6 @@ all_devtools_files = [
"front_end/bindings_test_runner/module.json",
"front_end/bindings_test_runner/PersistenceTestRunner.js",
"front_end/bindings_test_runner/OverridesTestRunner.js",
"front_end/browser_console/BrowserConsole.js",
"front_end/browser_console/module.json",
"front_end/browser_debugger/DOMBreakpointsSidebarPane.js",
"front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js",
"front_end/browser_debugger/ObjectEventListenersSidebarPane.js",
......@@ -1028,7 +1026,6 @@ generated_applications = [
generated_non_autostart_non_remote_modules = [
"$resources_out_dir/animation/animation_module.js",
"$resources_out_dir/audits2/audits2_module.js",
"$resources_out_dir/browser_console/browser_console_module.js",
"$resources_out_dir/browser_debugger/browser_debugger_module.js",
"$resources_out_dir/changes/changes_module.js",
"$resources_out_dir/protocol_monitor/protocol_monitor_module.js",
......
// Copyright 2018 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.
/**
* @implements {UI.Renderer}
* @implements {UI.ContextMenu.Provider}
*/
BrowserConsole.BrowserConsole = class {
/**
* @override
* @param {!Event} event
* @param {!UI.ContextMenu} contextMenu
* @param {!Object} object
*/
appendApplicableItems(event, contextMenu, object) {
const consoleMessage = /** @type {!SDK.ConsoleMessage} */ (object);
const request = SDK.NetworkLog.requestForConsoleMessage(consoleMessage);
if (request && SDK.NetworkManager.canReplayRequest(request)) {
contextMenu.debugSection().appendItem(
Common.UIString('Replay XHR'), SDK.NetworkManager.replayRequest.bind(null, request));
}
}
/**
* @override
* @param {!Object} object
* @return {!Promise<?{node: !Node, tree: ?UI.TreeOutline}>}
*/
render(object) {
const consoleMessage = /** @type {!SDK.ConsoleMessage} */ (object);
const request = SDK.NetworkLog.requestForConsoleMessage(consoleMessage);
let messageElement = null;
if (request) {
messageElement = createElement('span');
if (consoleMessage.level === SDK.ConsoleMessage.MessageLevel.Error) {
messageElement.createTextChild(request.requestMethod + ' ');
messageElement.appendChild(Components.Linkifier.linkifyRevealable(request, request.url(), request.url()));
if (request.failed)
messageElement.createTextChildren(' ', request.localizedFailDescription);
if (request.statusCode !== 0)
messageElement.createTextChildren(' ', String(request.statusCode));
if (request.statusText)
messageElement.createTextChildren(' (', request.statusText, ')');
} else {
const fragment = Console.ConsoleViewMessage.linkifyWithCustomLinkifier(
consoleMessage.messageText,
title => Components.Linkifier.linkifyRevealable(
/** @type {!SDK.NetworkRequest} */ (request), title, request.url()));
messageElement.appendChild(fragment);
}
}
const result = messageElement ? {node: messageElement, tree: null} : null;
return Promise.resolve(/** @type {?{node: !Node, tree: ?UI.TreeOutline}} */ (result));
}
};
{
"extensions": [
{
"type": "@UI.ContextMenu.Provider",
"contextTypes": [
"SDK.ConsoleMessage"
],
"className": "BrowserConsole.BrowserConsole"
},
{
"type": "@UI.Renderer",
"contextTypes": [
"SDK.ConsoleMessage"
],
"source": "network",
"className": "BrowserConsole.BrowserConsole"
}
],
"dependencies": [
"browser_sdk",
"console"
],
"scripts": [
"BrowserConsole.js"
]
}
......@@ -679,8 +679,11 @@ Console.ConsoleView = class extends UI.VBox {
Common.UIString('Copy visible styled selection'), this._viewport.copyWithStyles.bind(this._viewport));
}
if (consoleMessage)
contextMenu.appendApplicableItems(consoleMessage);
if (consoleMessage) {
const request = SDK.NetworkLog.requestForConsoleMessage(consoleMessage);
if (request && SDK.NetworkManager.canReplayRequest(request))
contextMenu.debugSection().appendItem(ls`Replay XHR`, SDK.NetworkManager.replayRequest.bind(null, request));
}
contextMenu.show();
}
......
......@@ -67,16 +67,6 @@ Console.ConsoleViewMessage = class {
return this.toMessageElement();
}
/**
* @return {!Promise<!Element>}
*/
async completeElementForTest() {
const element = this.toMessageElement();
if (this._completeElementForTestPromise)
await this._completeElementForTestPromise;
return element;
}
/**
* @override
*/
......@@ -250,26 +240,9 @@ Console.ConsoleViewMessage = class {
}
}
} else {
let rendered = false;
this._completeElementForTestPromise = null;
for (const extension of self.runtime.extensions(UI.Renderer, this._message)) {
if (extension.descriptor()['source'] === this._message.source) {
messageElement = createElement('span');
let callback;
this._completeElementForTestPromise = new Promise(fulfill => callback = fulfill);
extension.instance().then(renderer => {
renderer.render(this._message)
.then(result => {
const renderedNode = result ? result.node : null;
messageElement.appendChild(renderedNode || this._format([messageText]));
})
.then(callback);
});
rendered = true;
break;
}
}
if (!rendered) {
if (this._message.source === SDK.ConsoleMessage.MessageSource.Network) {
messageElement = this._formatAsNetworkRequest() || this._format([messageText]);
} else {
const messageInParameters =
this._message.parameters && messageText === /** @type {string} */ (this._message.parameters[0]);
if (this._message.source === SDK.ConsoleMessage.MessageSource.Violation)
......@@ -297,6 +270,33 @@ Console.ConsoleViewMessage = class {
return formattedMessage;
}
/**
* @return {?Element}
*/
_formatAsNetworkRequest() {
const request = SDK.NetworkLog.requestForConsoleMessage(this._message);
if (!request)
return null;
const messageElement = createElement('span');
if (this._message.level === SDK.ConsoleMessage.MessageLevel.Error) {
messageElement.createTextChild(request.requestMethod + ' ');
messageElement.appendChild(Components.Linkifier.linkifyRevealable(request, request.url(), request.url()));
if (request.failed)
messageElement.createTextChildren(' ', request.localizedFailDescription);
if (request.statusCode !== 0)
messageElement.createTextChildren(' ', String(request.statusCode));
if (request.statusText)
messageElement.createTextChildren(' (', request.statusText, ')');
} else {
const fragment = this._linkifyWithCustomLinkifier(
this._message.messageText,
title => Components.Linkifier.linkifyRevealable(
/** @type {!SDK.NetworkRequest} */ (request), title, request.url()));
messageElement.appendChild(fragment);
}
return messageElement;
}
/**
* @return {?Element}
*/
......@@ -1470,12 +1470,14 @@ Console.ConsoleViewMessage = class {
* @param {function(string,string,number=,number=):!Node} linkifier
* @return {!DocumentFragment}
*/
static linkifyWithCustomLinkifier(string, linkifier) {
_linkifyWithCustomLinkifier(string, linkifier) {
if (string.length > Console.ConsoleViewMessage._MaxTokenizableStringLength)
return UI.createExpandableText(string, Console.ConsoleViewMessage._LongStringVisibleLength);
const container = createDocumentFragment();
const tokens = this._tokenizeMessageText(string);
const tokens = Console.ConsoleViewMessage._tokenizeMessageText(string);
for (const token of tokens) {
if (!token.text)
continue;
switch (token.type) {
case 'url': {
const realURL = (token.text.startsWith('www.') ? 'http://' + token.text : token.text);
......@@ -1501,7 +1503,7 @@ Console.ConsoleViewMessage = class {
* @return {!DocumentFragment}
*/
_linkifyStringAsFragment(string) {
return Console.ConsoleViewMessage.linkifyWithCustomLinkifier(string, (text, url, lineNumber, columnNumber) => {
return this._linkifyWithCustomLinkifier(string, (text, url, lineNumber, columnNumber) => {
const linkElement = Components.Linkifier.linkifyURL(url, {text, lineNumber, columnNumber});
linkElement.tabIndex = -1;
this._selectableChildren.push({element: linkElement, selectFirst: () => linkElement.focus()});
......
......@@ -20,14 +20,6 @@ ConsoleTestRunner.dumpConsoleMessages = function(printOriginatingCommand, dumpCl
ConsoleTestRunner.dumpConsoleMessagesIntoArray(printOriginatingCommand, dumpClassNames, formatter));
};
ConsoleTestRunner.renderCompleteMessages = async function() {
const consoleView = Console.ConsoleView.instance();
if (consoleView._needsFullUpdate)
consoleView._updateMessageList();
const viewMessages = consoleView._visibleViewMessages;
await Promise.all(viewMessages.map(uiMessage => uiMessage.completeElementForTest()));
};
/**
* @param {boolean=} printOriginatingCommand
* @param {boolean=} dumpClassNames
......@@ -536,7 +528,7 @@ ConsoleTestRunner.waitForConsoleMessages = function(expectedCount, callback) {
*/
ConsoleTestRunner.waitForConsoleMessagesPromise = async function(expectedCount) {
await new Promise(fulfill => ConsoleTestRunner.waitForConsoleMessages(expectedCount, fulfill));
return ConsoleTestRunner.renderCompleteMessages();
return ConsoleTestRunner.waitForPendingViewportUpdates();
};
/**
......
......@@ -7,7 +7,6 @@
{ "name": "accessibility", "type": "remote" },
{ "name": "animation" },
{ "name": "audits2" },
{ "name": "browser_console" },
{ "name": "browser_debugger" },
{ "name": "cookie_table" },
{ "name": "devices" },
......
......@@ -3,7 +3,6 @@
{ "name": "mobile_throttling", "type": "autostart" },
{ "name": "worker_main", "type": "autostart" },
{ "name": "browser_console" },
{ "name": "browser_debugger" },
{ "name": "cookie_table" },
{ "name": "elements" },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment