Index: chrome/browser/ui/webui/workers_ui.cc |
diff --git a/chrome/browser/ui/webui/workers_ui.cc b/chrome/browser/ui/webui/workers_ui.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0dd34a69db58b188720d890fe48e63830deae7c3 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/workers_ui.cc |
@@ -0,0 +1,107 @@ |
+// 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/workers_ui.h" |
+ |
+#include "base/json/json_writer.h" |
+#include "base/memory/ref_counted_memory.h" |
+#include "base/string_util.h" |
+#include "base/values.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/webui/chrome_url_data_manager_backend.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/worker_host/worker_process_host.h" |
+#include "grit/generated_resources.h" |
+#include "grit/workers_resources.h" |
+#include "ui/base/resource/resource_bundle.h" |
+ |
+static const char kWorkersDataFile[] = "workers_data.json"; |
+static const char kIndexHtmlFile[] = "index.html"; |
+ |
+namespace { |
+ |
+class WorkersUIHTMLSource : public ChromeURLDataManager::DataSource { |
+ public: |
+ WorkersUIHTMLSource(); |
+ |
+ virtual void StartDataRequest(const std::string& path, |
+ bool is_incognito, |
+ int request_id); |
+ |
+ virtual std::string GetMimeType(const std::string&) const; |
+ |
+ private: |
+ ~WorkersUIHTMLSource() {} |
+ |
+ void SendSharedWorkersData(int request_id); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WorkersUIHTMLSource); |
+}; |
+ |
+WorkersUIHTMLSource::WorkersUIHTMLSource() |
+ : DataSource(chrome::kChromeUIWorkersHost, NULL) { |
+} |
+ |
+void WorkersUIHTMLSource::StartDataRequest(const std::string& path, |
+ bool is_incognito, |
+ int request_id) { |
+ if (path == kWorkersDataFile) { |
+ SendSharedWorkersData(request_id); |
+ } else { |
+ int idr = IDR_WORKERS_INDEX_HTML; |
+ scoped_refptr<RefCountedStaticMemory> response( |
+ ResourceBundle::GetSharedInstance().LoadDataResourceBytes(idr)); |
+ SendResponse(request_id, response); |
+ } |
+} |
+ |
+std::string WorkersUIHTMLSource::GetMimeType(const std::string& path) const { |
+ if (EndsWith(path, ".css", false)) |
+ return "text/css"; |
+ if (EndsWith(path, ".js", false)) |
+ return "application/javascript"; |
+ if (EndsWith(path, ".json", false)) |
+ return "plain/text"; |
+ return "text/html"; |
+} |
+ |
+void WorkersUIHTMLSource::SendSharedWorkersData(int request_id) { |
+ ListValue workers_list; |
+ BrowserChildProcessHost::Iterator iter(ChildProcessInfo::WORKER_PROCESS); |
+ for (; !iter.Done(); ++iter) { |
+ WorkerProcessHost* worker = static_cast<WorkerProcessHost*>(*iter); |
+ const WorkerProcessHost::Instances& instances = worker->instances(); |
+ for (WorkerProcessHost::Instances::const_iterator i = instances.begin(); |
+ i != instances.end(); ++i) { |
+ if (!i->shared()) |
+ continue; |
+ DictionaryValue* worker_data = new DictionaryValue(); |
+ worker_data->SetInteger("id", i->worker_route_id()); |
+ worker_data->SetString("url", i->url().spec()); |
+ worker_data->SetString("name", i->name()); |
+ worker_data->SetInteger("pid", worker->pid()); |
+ workers_list.Append(worker_data); |
+ } |
+ } |
+ |
+ std::string json_string; |
+ base::JSONWriter::Write(&workers_list, false, &json_string); |
+ |
+ scoped_refptr<RefCountedBytes> json_bytes(new RefCountedBytes()); |
+ json_bytes->data.resize(json_string.size()); |
+ std::copy(json_string.begin(), json_string.end(), json_bytes->data.begin()); |
+ |
+ SendResponse(request_id, json_bytes); |
+} |
+ |
+} // namespace |
+ |
+WorkersUI::WorkersUI(TabContents* contents) : ChromeWebUI(contents) { |
+ WorkersUIHTMLSource* html_source = new WorkersUIHTMLSource(); |
+ |
+ // Set up the chrome://workers/ source. |
+ contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source); |
+} |