blob: 21ae5775e7cbcecc270f96205ccbfe0239592a4d [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/**
* This is the background window. It can access the necessary APIs to get
* at the console messages. It can only communicate with the content
* window through message passing.
*
* There is no way to query the console messages, as such, but we can
* set up a handler that is called when there are console messages. This
* will be called with any console messages already present, so it can be set
* up after the fact. However, if there are no messages it won't be called.
* To handle the end of the messages (or no messages) we have to use a
* sentinel message that is logged by the content page.
*/
var version = "1.0";
var messages = []; // An array that we can put messages in.
var debuggeeId; // An object that identifies the browser tab we are talking to.
var callback; // For passing back the response to the content window.
var timer; // To time out if no messages are available.
/**
* When we have collected all the messages, we send them back to the
* content page via the callback, turn off message collection, and
* detach the debugger from the browser tab.
*/
function allDone() {
callback(messages);
chrome.debugger.sendCommand(debuggeeId, "Console.clearMessages", {},
function() {
chrome.debugger.sendCommand(debuggeeId, "Console.disable", {},
function() {});
chrome.debugger.detach(debuggeeId, function() {});
});
messages = [];
}
/**
* Debugger event handler. We only care about console.messageAdded
* events, in which case we add a new message object with the fields
* we care about to our messages array.
*/
function onEvent(debuggeeId, method, params) {
var tabId = debuggeeId.tabId;
if (method == "Console.messageAdded") {
var msg = params.message;
// More fields are available if we want them later. See
// https://developers.google.com/chrome-developer-tools/docs/protocol/1.0/console#type-ConsoleMessage
if (msg.text == 'getMessages/end') {
allDone();
} else {
messages.push({"source":msg.url, "line": msg.line,
"category":msg.source, "message":msg.text });
}
}
}
/**
* Handle requests sent by the content script. We save the callback,
* get the window and tab that is currently active, attach the
* debugger to that tab, and then turn on console message event
* handling, which will result in onEvent calls for each console
* message, including the ones that are already present in the console.
*/
function onRequest(request, sender, sendResponse) {
if (request.command == "getMessages") {
callback = sendResponse;
chrome.windows.getCurrent(function(win) {
chrome.tabs.getSelected(win.id, function(tab) {
debuggeeId = {tabId:tab.id};
chrome.debugger.attach(debuggeeId, version, function() {
if (chrome.extension.lastError) {
// Attach failed; send an empty response.
callback([]);
} else {
chrome.debugger.sendCommand(debuggeeId, "Console.enable", {},
function() {});
//timer = setTimeout(allDone, 1000);
}
});
});
});
}
}
// Set up the general handler for debug events.
chrome.debugger.onEvent.addListener(onEvent);
// Listen for the content script to send a message to the background page.
chrome.extension.onRequest.addListener(onRequest);