Add the beginnings for webui page chrome://tracking2.

This is intended to supercede about:tracking. It will implement the same functionality but with a richer javascript-based UI.

BUG=100992

Review URL: http://codereview.chromium.org/8352037

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@106597 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index e0c1e754..0a7b823 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -106,6 +106,8 @@
       <include name="IDR_CLOUD_PRINT_SETUP_DONE_HTML" file="printing\cloud_print\resources\cloud_print_setup_done.html" flattenhtml="true" type="BINDATA" />
       <include name="IDR_TRACING_HTML" file="resources\tracing.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_TRACING_JS" file="resources\tracing.js" flattenhtml="true" type="BINDATA" />
+      <include name="IDR_TRACKING_HTML" file="resources\tracking.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
+      <include name="IDR_TRACKING_JS" file="resources\tracking.js" flattenhtml="true" type="BINDATA" />
       <include name="IDR_TRANSLATE_JS" file="resources\translate.js" type="BINDATA" />
       <include name="IDR_BUGREPORT_HTML" file="resources\bug_report.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
       <include name="IDR_BUGREPORT_HTML_INVALID" file="resources\bug_report_invalid.html" allowexternalscript="true" flattenhtml="true" type="BINDATA" />
diff --git a/chrome/browser/resources/tracking.html b/chrome/browser/resources/tracking.html
new file mode 100644
index 0000000..0ebae79
--- /dev/null
+++ b/chrome/browser/resources/tracking.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<meta charset="utf-8">
+<script src="tracking.js"></script>
+</head>
+<body>
+  This page is under construction!
+</body>
+</html>
diff --git a/chrome/browser/resources/tracking.js b/chrome/browser/resources/tracking.js
new file mode 100644
index 0000000..59ab9e5e
--- /dev/null
+++ b/chrome/browser/resources/tracking.js
@@ -0,0 +1,80 @@
+// 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.
+
+var g_browserBridge;
+var g_mainView;
+
+/**
+ * Main entry point called once the page has loaded.
+ */
+function onLoad() {
+  g_browserBridge = new BrowserBridge();
+  g_mainView = new MainView();
+
+  // Ask the browser to send us the current data.
+  g_browserBridge.sendGetData();
+}
+
+document.addEventListener('DOMContentLoaded', onLoad);
+
+/**
+ * This class provides a "bridge" for communicating between the javascript and
+ * the browser. Used as a singleton.
+ */
+var BrowserBridge = (function() {
+  'use strict';
+
+  /**
+   * @constructor
+   */
+  function BrowserBridge() {
+  }
+
+  BrowserBridge.prototype = {
+    //--------------------------------------------------------------------------
+    // Messages sent to the browser
+    //--------------------------------------------------------------------------
+
+    sendGetData: function() {
+      chrome.send('getData');
+    },
+
+    sendResetData: function() {
+      chrome.send('resetData');
+    },
+
+    //--------------------------------------------------------------------------
+    // Messages received from the browser.
+    //--------------------------------------------------------------------------
+
+    receivedData: function(data) {
+      g_mainView.setData(data);
+    },
+  };
+
+  return BrowserBridge;
+})();
+
+/**
+ * This class handles the presentation of our tracking view. Used as a
+ * singleton.
+ */
+var MainView = (function() {
+  'use strict';
+
+  /**
+   * @constructor
+   */
+  function MainView() {
+  }
+
+  MainView.prototype = {
+    setData: function(data) {
+      // TODO(eroman): IMPLEMENT.
+      alert('data received');
+    },
+  };
+
+  return MainView;
+})();
diff --git a/chrome/browser/ui/webui/chrome_web_ui_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_factory.cc
index 445bb038..0b172c4 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_factory.cc
@@ -38,6 +38,7 @@
 #include "chrome/browser/ui/webui/sync_internals_ui.h"
 #include "chrome/browser/ui/webui/test_chrome_web_ui_factory.h"
 #include "chrome/browser/ui/webui/tracing_ui.h"
+#include "chrome/browser/ui/webui/tracking_ui.h"
 #include "chrome/browser/ui/webui/workers_ui.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -203,6 +204,8 @@
     return &NewWebUI<OptionsUI>;
   if (url.host() == chrome::kChromeUITracingHost)
     return &NewWebUI<TracingUI>;
+  if (url.host() == chrome::kChromeUITrackingHost2)
+    return &NewWebUI<TrackingUI>;
   if (url.host() == chrome::kChromeUIQuotaInternalsHost)
     return &NewWebUI<QuotaInternalsUI>;
   if (url.host() == chrome::kChromeUIWorkersHost)
diff --git a/chrome/browser/ui/webui/tracking_ui.cc b/chrome/browser/ui/webui/tracking_ui.cc
new file mode 100644
index 0000000..76bb088
--- /dev/null
+++ b/chrome/browser/ui/webui/tracking_ui.cc
@@ -0,0 +1,88 @@
+// 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.
+
+#include "chrome/browser/ui/webui/tracking_ui.h"
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/tracked_objects.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chrome_web_ui_data_source.h"
+#include "chrome/common/url_constants.h"
+#include "content/browser/tab_contents/tab_contents.h"
+#include "content/browser/trace_controller.h"
+#include "grit/browser_resources.h"
+#include "grit/generated_resources.h"
+
+namespace {
+
+ChromeWebUIDataSource* CreateTrackingHTMLSource() {
+  // TODO(eroman): Use kChromeUITrackingHost instead of kChromeUITrackingHost2
+  //               once migration to webui is complete.
+  ChromeWebUIDataSource* source =
+      new ChromeWebUIDataSource(chrome::kChromeUITrackingHost2);
+
+  source->set_json_path("strings.js");
+  source->add_resource_path("tracking.js", IDR_TRACKING_JS);
+  source->set_default_resource(IDR_TRACKING_HTML);
+  return source;
+}
+
+// This class receives javascript messages from the renderer.
+// Note that the WebUI infrastructure runs on the UI thread, therefore all of
+// this class's methods are expected to run on the UI thread.
+class TrackingMessageHandler : public WebUIMessageHandler {
+ public:
+  TrackingMessageHandler() {}
+
+  // WebUIMessageHandler implementation.
+  virtual WebUIMessageHandler* Attach(WebUI* web_ui) OVERRIDE;
+  virtual void RegisterMessages() OVERRIDE;
+
+  // Messages.
+  void OnGetData(const ListValue* list);
+  void OnResetData(const ListValue* list);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TrackingMessageHandler);
+};
+
+WebUIMessageHandler* TrackingMessageHandler::Attach(WebUI* web_ui) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  WebUIMessageHandler* result = WebUIMessageHandler::Attach(web_ui);
+  return result;
+}
+
+void TrackingMessageHandler::RegisterMessages() {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+  web_ui_->RegisterMessageCallback("getData",
+      base::Bind(&TrackingMessageHandler::OnGetData,base::Unretained(this)));
+  web_ui_->RegisterMessageCallback("resetData",
+      base::Bind(&TrackingMessageHandler::OnResetData,
+                 base::Unretained(this)));
+}
+
+void TrackingMessageHandler::OnGetData(const ListValue* list) {
+  // TODO(eroman): Gather all the task tracking information into a Value.
+  ListValue values;
+
+  // Send the data to the renderer.
+  web_ui_->CallJavascriptFunction("g_browserBridge.receivedData", values);
+}
+
+void TrackingMessageHandler::OnResetData(const ListValue* list) {
+  tracked_objects::ThreadData::ResetAllThreadData();
+}
+
+}  // namespace
+
+TrackingUI::TrackingUI(TabContents* contents) : ChromeWebUI(contents) {
+  AddMessageHandler((new TrackingMessageHandler())->Attach(this));
+
+  // Set up the chrome://tracking2/ source.
+  Profile::FromBrowserContext(contents->browser_context())->
+      GetChromeURLDataManager()->AddDataSource(CreateTrackingHTMLSource());
+}
diff --git a/chrome/browser/ui/webui/tracking_ui.h b/chrome/browser/ui/webui/tracking_ui.h
new file mode 100644
index 0000000..de62ae2
--- /dev/null
+++ b/chrome/browser/ui/webui/tracking_ui.h
@@ -0,0 +1,20 @@
+// 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.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_TRACKING_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_TRACKING_UI_H_
+#pragma once
+
+#include "chrome/browser/ui/webui/chrome_web_ui.h"
+
+// The C++ back-end for the chrome://tracking2 webui page.
+class TrackingUI : public ChromeWebUI {
+ public:
+  explicit TrackingUI(TabContents* contents);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TrackingUI);
+};
+
+#endif  // CHROME_BROWSER_UI_WEBUI_TRACKING_UI_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 17385f2e..30eb7466 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -3880,6 +3880,8 @@
         'browser/ui/webui/theme_source.h',
         'browser/ui/webui/tracing_ui.cc',
         'browser/ui/webui/tracing_ui.h',
+        'browser/ui/webui/tracking_ui.cc',
+        'browser/ui/webui/tracking_ui.h',
         'browser/ui/webui/web_ui_util.cc',
         'browser/ui/webui/web_ui_util.h',
         'browser/ui/webui/workers_ui.cc',
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index cdfb3c7d..4012895f 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -174,6 +174,7 @@
 const char kChromeUITouchIconHost[] = "touch-icon";
 const char kChromeUITracingHost[] = "tracing";
 const char kChromeUITrackingHost[] = "tracking";
+const char kChromeUITrackingHost2[] = "tracking2";
 const char kChromeUIVersionHost[] = "version";
 const char kChromeUIWorkersHost[] = "workers";
 
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index da9e9f42..42b713b 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -165,6 +165,7 @@
 extern const char kChromeUITouchIconHost[];
 extern const char kChromeUITracingHost[];
 extern const char kChromeUITrackingHost[];
+extern const char kChromeUITrackingHost2[];
 extern const char kChromeUIVersionHost[];
 extern const char kChromeUIWorkersHost[];