| Index: chrome/common/extensions/docs/examples/api/devtools/network/chrome-firephp/devtools.js
 | 
| diff --git a/chrome/common/extensions/docs/examples/api/devtools/network/chrome-firephp/devtools.js b/chrome/common/extensions/docs/examples/api/devtools/network/chrome-firephp/devtools.js
 | 
| index 40ab5c6ce2fec1834013e59cbb1706b13761293f..702677f77689283820ec13de1d5645a804f2d8c5 100644
 | 
| --- a/chrome/common/extensions/docs/examples/api/devtools/network/chrome-firephp/devtools.js
 | 
| +++ b/chrome/common/extensions/docs/examples/api/devtools/network/chrome-firephp/devtools.js
 | 
| @@ -1,181 +1,185 @@
 | 
| -function Console() {
 | 
| -}
 | 
| -
 | 
| -Console.Type = {
 | 
| -  LOG: "log",
 | 
| -  DEBUG: "debug",
 | 
| -  INFO: "info",
 | 
| -  WARN: "warn",
 | 
| -  ERROR: "error",
 | 
| -  GROUP: "group",
 | 
| -  GROUP_COLLAPSED: "groupCollapsed",
 | 
| -  GROUP_END: "groupEnd"
 | 
| -};
 | 
| -
 | 
| -Console.addMessage = function(type, format, args) {
 | 
| -  chrome.extension.sendRequest({
 | 
| -      command: "sendToConsole",
 | 
| -      tabId: chrome.experimental.devtools.tabId,
 | 
| -      args: escape(JSON.stringify(Array.prototype.slice.call(arguments, 0)))
 | 
| -  });
 | 
| -};
 | 
| -
 | 
| -// Generate Console output methods, i.e. Console.log(), Console.debug() etc.
 | 
| -(function() {
 | 
| -  var console_types = Object.getOwnPropertyNames(Console.Type);
 | 
| -  for (var type = 0; type < console_types.length; ++type) {
 | 
| -    var method_name = Console.Type[console_types[type]];
 | 
| -    Console[method_name] = Console.addMessage.bind(Console, method_name);
 | 
| -  }
 | 
| -})();
 | 
| -
 | 
| -function ChromeFirePHP() {
 | 
| -};
 | 
| -
 | 
| -ChromeFirePHP.handleFirePhpHeaders = function(har_entry) {
 | 
| -  var response_headers = har_entry.response.headers;
 | 
| -  var wf_header_map = {};
 | 
| -  var had_wf_headers = false;
 | 
| -
 | 
| -  for (var i = 0; i < response_headers.length; ++i) {
 | 
| -    var header = response_headers[i];
 | 
| -    if (/^X-Wf-/.test(header.name)) {
 | 
| -      wf_header_map[header.name] = header.value;
 | 
| -      had_wf_headers = true;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  var proto_header = wf_header_map["X-Wf-Protocol-1"];
 | 
| -  if (!had_wf_headers || !this._checkProtoVersion(proto_header))
 | 
| -    return;
 | 
| -
 | 
| -  var message_objects = this._buildMessageObjects(wf_header_map);
 | 
| -  message_objects.sort(function(a, b) {
 | 
| -      var aFile = a.File || "";
 | 
| -      var bFile = b.File || "";
 | 
| -      if (aFile !== bFile)
 | 
| -        return aFile.localeCompare(bFile);
 | 
| -      var aLine = a.Line !== undefined ? a.Line : -1;
 | 
| -      var bLine = b.Line !== undefined ? b.Line : -1;
 | 
| -      return aLine - bLine;
 | 
| -  });
 | 
| -
 | 
| -  var context = { pageRef: har_entry.pageref };
 | 
| -  for (var i = 0; i < message_objects.length; ++i)
 | 
| -    this._processLogMessage(message_objects[i], context);
 | 
| -  if (context.groupStarted)
 | 
| -    Console.groupEnd();
 | 
| -};
 | 
| -
 | 
| -ChromeFirePHP._processLogMessage = function(message, context) {
 | 
| -  var meta = message[0];
 | 
| -  if (!meta) {
 | 
| -    Console.error("No Meta in FirePHP message");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  var body = message[1];
 | 
| -  var type = meta.Type;
 | 
| -  if (!type) {
 | 
| -    Console.error("No Type for FirePHP message");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  switch (type) {
 | 
| -    case "LOG":
 | 
| -    case "INFO":
 | 
| -    case "WARN":
 | 
| -    case "ERROR":
 | 
| -      if (!context.groupStarted) {
 | 
| -        context.groupStarted = true;
 | 
| -        Console.groupCollapsed(context.pageRef || "");
 | 
| -      }
 | 
| -      Console.addMessage(Console.Type[type], "%s%o",
 | 
| -          (meta.Label ? meta.Label + ": " : ""), body);
 | 
| -      break;
 | 
| -    case "EXCEPTION":
 | 
| -    case "TABLE":
 | 
| -    case "TRACE":
 | 
| -    case "GROUP_START":
 | 
| -    case "GROUP_END":
 | 
| -     // FIXME: implement
 | 
| -     break;
 | 
| -  }
 | 
| -};
 | 
| -
 | 
| -ChromeFirePHP._buildMessageObjects = function(header_map)
 | 
| -{
 | 
| -  const normal_header_prefix = "X-Wf-1-1-1-";
 | 
| -
 | 
| -  return this._collectMessageObjectsForPrefix(header_map, normal_header_prefix);
 | 
| -};
 | 
| -
 | 
| -ChromeFirePHP._collectMessageObjectsForPrefix = function(header_map, prefix) {
 | 
| -  var results = [];
 | 
| -  const header_regexp = /(?:\d+)?\|(.+)/;
 | 
| -  var json = "";
 | 
| -  for (var i = 1; ; ++i) {
 | 
| -    var name = prefix + i;
 | 
| -    var value = header_map[name];
 | 
| -    if (!value)
 | 
| -      break;
 | 
| -
 | 
| -    var match = value.match(header_regexp);
 | 
| -    if (!match) {
 | 
| -      Console.error("Failed to parse FirePHP log message: " + value);
 | 
| -      break;
 | 
| -    }
 | 
| -    var json_part = match[1];
 | 
| -    json += json_part.substring(0, json_part.lastIndexOf("|"));
 | 
| -    if (json_part.charAt(json_part.length - 1) === "\\")
 | 
| -      continue;
 | 
| -    try {
 | 
| -      var message = JSON.parse(json);
 | 
| -      results.push(message);
 | 
| -    } catch(e) {
 | 
| -      Console.error("Failed to parse FirePHP log message: " + json);
 | 
| -    }
 | 
| -    json = "";
 | 
| -  }
 | 
| -  return results;
 | 
| -};
 | 
| -
 | 
| -ChromeFirePHP._checkProtoVersion = function(proto_header) {
 | 
| -  if (!proto_header) {
 | 
| -    Console.warn("WildFire protocol header not found");
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  var match = /http:\/\/meta\.wildfirehq\.org\/Protocol\/([^\/]+)\/(.+)/.exec(
 | 
| -      proto_header);
 | 
| -  if (!match) {
 | 
| -    Console.warn("Invalid WildFire protocol header");
 | 
| -    return;
 | 
| -  }
 | 
| -  var proto_name = match[1];
 | 
| -  var proto_version = match[2];
 | 
| -  if (proto_name !== "JsonStream" || proto_version !== "0.2") {
 | 
| -    Console.warn(
 | 
| -        "Unknown FirePHP protocol version: %s (expecting JsonStream/0.2)",
 | 
| -        proto_name + "/" + proto_version);
 | 
| -    return false;
 | 
| -  }
 | 
| -  return true;
 | 
| -};
 | 
| -
 | 
| -chrome.experimental.devtools.network.addRequestHeaders({
 | 
| -    "X-FirePHP-Version": "0.0.6"
 | 
| -});
 | 
| -
 | 
| -chrome.experimental.devtools.network.getHAR(function(result) {
 | 
| -  var entries = result.entries;
 | 
| -  if (!entries.length) {
 | 
| -    Console.warn("ChromeFirePHP suggests that you reload the page to track" +
 | 
| -        " FirePHP messages for all the requests");
 | 
| -  }
 | 
| -  for (var i = 0; i < entries.length; ++i)
 | 
| -    ChromeFirePHP.handleFirePhp_headers(entries[i]);
 | 
| -
 | 
| -  chrome.experimental.devtools.network.onRequestFinished.addListener(
 | 
| -      ChromeFirePHP.handleFirePhpHeaders.bind(ChromeFirePHP));
 | 
| -});
 | 
| +// Copyright (c) 2011 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.
 | 
| +
 | 
| +function Console() {
 | 
| +}
 | 
| +
 | 
| +Console.Type = {
 | 
| +  LOG: "log",
 | 
| +  DEBUG: "debug",
 | 
| +  INFO: "info",
 | 
| +  WARN: "warn",
 | 
| +  ERROR: "error",
 | 
| +  GROUP: "group",
 | 
| +  GROUP_COLLAPSED: "groupCollapsed",
 | 
| +  GROUP_END: "groupEnd"
 | 
| +};
 | 
| +
 | 
| +Console.addMessage = function(type, format, args) {
 | 
| +  chrome.extension.sendRequest({
 | 
| +      command: "sendToConsole",
 | 
| +      tabId: chrome.experimental.devtools.tabId,
 | 
| +      args: escape(JSON.stringify(Array.prototype.slice.call(arguments, 0)))
 | 
| +  });
 | 
| +};
 | 
| +
 | 
| +// Generate Console output methods, i.e. Console.log(), Console.debug() etc.
 | 
| +(function() {
 | 
| +  var console_types = Object.getOwnPropertyNames(Console.Type);
 | 
| +  for (var type = 0; type < console_types.length; ++type) {
 | 
| +    var method_name = Console.Type[console_types[type]];
 | 
| +    Console[method_name] = Console.addMessage.bind(Console, method_name);
 | 
| +  }
 | 
| +})();
 | 
| +
 | 
| +function ChromeFirePHP() {
 | 
| +};
 | 
| +
 | 
| +ChromeFirePHP.handleFirePhpHeaders = function(har_entry) {
 | 
| +  var response_headers = har_entry.response.headers;
 | 
| +  var wf_header_map = {};
 | 
| +  var had_wf_headers = false;
 | 
| +
 | 
| +  for (var i = 0; i < response_headers.length; ++i) {
 | 
| +    var header = response_headers[i];
 | 
| +    if (/^X-Wf-/.test(header.name)) {
 | 
| +      wf_header_map[header.name] = header.value;
 | 
| +      had_wf_headers = true;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  var proto_header = wf_header_map["X-Wf-Protocol-1"];
 | 
| +  if (!had_wf_headers || !this._checkProtoVersion(proto_header))
 | 
| +    return;
 | 
| +
 | 
| +  var message_objects = this._buildMessageObjects(wf_header_map);
 | 
| +  message_objects.sort(function(a, b) {
 | 
| +      var aFile = a.File || "";
 | 
| +      var bFile = b.File || "";
 | 
| +      if (aFile !== bFile)
 | 
| +        return aFile.localeCompare(bFile);
 | 
| +      var aLine = a.Line !== undefined ? a.Line : -1;
 | 
| +      var bLine = b.Line !== undefined ? b.Line : -1;
 | 
| +      return aLine - bLine;
 | 
| +  });
 | 
| +
 | 
| +  var context = { pageRef: har_entry.pageref };
 | 
| +  for (var i = 0; i < message_objects.length; ++i)
 | 
| +    this._processLogMessage(message_objects[i], context);
 | 
| +  if (context.groupStarted)
 | 
| +    Console.groupEnd();
 | 
| +};
 | 
| +
 | 
| +ChromeFirePHP._processLogMessage = function(message, context) {
 | 
| +  var meta = message[0];
 | 
| +  if (!meta) {
 | 
| +    Console.error("No Meta in FirePHP message");
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  var body = message[1];
 | 
| +  var type = meta.Type;
 | 
| +  if (!type) {
 | 
| +    Console.error("No Type for FirePHP message");
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  switch (type) {
 | 
| +    case "LOG":
 | 
| +    case "INFO":
 | 
| +    case "WARN":
 | 
| +    case "ERROR":
 | 
| +      if (!context.groupStarted) {
 | 
| +        context.groupStarted = true;
 | 
| +        Console.groupCollapsed(context.pageRef || "");
 | 
| +      }
 | 
| +      Console.addMessage(Console.Type[type], "%s%o",
 | 
| +          (meta.Label ? meta.Label + ": " : ""), body);
 | 
| +      break;
 | 
| +    case "EXCEPTION":
 | 
| +    case "TABLE":
 | 
| +    case "TRACE":
 | 
| +    case "GROUP_START":
 | 
| +    case "GROUP_END":
 | 
| +     // FIXME: implement
 | 
| +     break;
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +ChromeFirePHP._buildMessageObjects = function(header_map)
 | 
| +{
 | 
| +  const normal_header_prefix = "X-Wf-1-1-1-";
 | 
| +
 | 
| +  return this._collectMessageObjectsForPrefix(header_map, normal_header_prefix);
 | 
| +};
 | 
| +
 | 
| +ChromeFirePHP._collectMessageObjectsForPrefix = function(header_map, prefix) {
 | 
| +  var results = [];
 | 
| +  const header_regexp = /(?:\d+)?\|(.+)/;
 | 
| +  var json = "";
 | 
| +  for (var i = 1; ; ++i) {
 | 
| +    var name = prefix + i;
 | 
| +    var value = header_map[name];
 | 
| +    if (!value)
 | 
| +      break;
 | 
| +
 | 
| +    var match = value.match(header_regexp);
 | 
| +    if (!match) {
 | 
| +      Console.error("Failed to parse FirePHP log message: " + value);
 | 
| +      break;
 | 
| +    }
 | 
| +    var json_part = match[1];
 | 
| +    json += json_part.substring(0, json_part.lastIndexOf("|"));
 | 
| +    if (json_part.charAt(json_part.length - 1) === "\\")
 | 
| +      continue;
 | 
| +    try {
 | 
| +      var message = JSON.parse(json);
 | 
| +      results.push(message);
 | 
| +    } catch(e) {
 | 
| +      Console.error("Failed to parse FirePHP log message: " + json);
 | 
| +    }
 | 
| +    json = "";
 | 
| +  }
 | 
| +  return results;
 | 
| +};
 | 
| +
 | 
| +ChromeFirePHP._checkProtoVersion = function(proto_header) {
 | 
| +  if (!proto_header) {
 | 
| +    Console.warn("WildFire protocol header not found");
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  var match = /http:\/\/meta\.wildfirehq\.org\/Protocol\/([^\/]+)\/(.+)/.exec(
 | 
| +      proto_header);
 | 
| +  if (!match) {
 | 
| +    Console.warn("Invalid WildFire protocol header");
 | 
| +    return;
 | 
| +  }
 | 
| +  var proto_name = match[1];
 | 
| +  var proto_version = match[2];
 | 
| +  if (proto_name !== "JsonStream" || proto_version !== "0.2") {
 | 
| +    Console.warn(
 | 
| +        "Unknown FirePHP protocol version: %s (expecting JsonStream/0.2)",
 | 
| +        proto_name + "/" + proto_version);
 | 
| +    return false;
 | 
| +  }
 | 
| +  return true;
 | 
| +};
 | 
| +
 | 
| +chrome.experimental.devtools.network.addRequestHeaders({
 | 
| +    "X-FirePHP-Version": "0.0.6"
 | 
| +});
 | 
| +
 | 
| +chrome.experimental.devtools.network.getHAR(function(result) {
 | 
| +  var entries = result.entries;
 | 
| +  if (!entries.length) {
 | 
| +    Console.warn("ChromeFirePHP suggests that you reload the page to track" +
 | 
| +        " FirePHP messages for all the requests");
 | 
| +  }
 | 
| +  for (var i = 0; i < entries.length; ++i)
 | 
| +    ChromeFirePHP.handleFirePhp_headers(entries[i]);
 | 
| +
 | 
| +  chrome.experimental.devtools.network.onRequestFinished.addListener(
 | 
| +      ChromeFirePHP.handleFirePhpHeaders.bind(ChromeFirePHP));
 | 
| +});
 | 
| 
 |