// 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);