summaryrefslogtreecommitdiffstats
path: root/chrome/browser/dom_ui/dom_ui_contents.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/dom_ui/dom_ui_contents.cc')
-rw-r--r--chrome/browser/dom_ui/dom_ui_contents.cc207
1 files changed, 207 insertions, 0 deletions
diff --git a/chrome/browser/dom_ui/dom_ui_contents.cc b/chrome/browser/dom_ui/dom_ui_contents.cc
new file mode 100644
index 0000000..260c68f
--- /dev/null
+++ b/chrome/browser/dom_ui/dom_ui_contents.cc
@@ -0,0 +1,207 @@
+// Copyright (c) 2006-2008 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/dom_ui/dom_ui_contents.h"
+
+#include "chrome/browser/dom_ui/dom_ui.h"
+#include "chrome/browser/dom_ui/history_ui.h"
+#include "chrome/browser/navigation_entry.h"
+#include "chrome/browser/render_view_host.h"
+#include "chrome/common/resource_bundle.h"
+
+// The scheme used for DOMUIContentses
+// TODO(glen): Merge this with the scheme in chrome_url_data_manager
+static const char kURLScheme[] = "chrome";
+
+// The path used in internal URLs to thumbnail data.
+static const char kThumbnailPath[] = "thumb";
+
+// The path used in internal URLs to favicon data.
+static const char kFavIconPath[] = "favicon";
+
+///////////////////////////////////////////////////////////////////////////////
+// FavIconSource
+
+FavIconSource::FavIconSource(Profile* profile)
+ : DataSource(kFavIconPath, MessageLoop::current()), profile_(profile) {}
+
+void FavIconSource::StartDataRequest(const std::string& path, int request_id) {
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs) {
+ HistoryService::Handle handle;
+ if (path.size() > 8 && path.substr(0, 8) == "iconurl/") {
+ handle = hs->GetFavIcon(
+ GURL(path.substr(8)),
+ &cancelable_consumer_,
+ NewCallback(this, &FavIconSource::OnFavIconDataAvailable));
+ } else {
+ handle = hs->GetFavIconForURL(
+ GURL(path),
+ &cancelable_consumer_,
+ NewCallback(this, &FavIconSource::OnFavIconDataAvailable));
+ }
+ // Attach the ChromeURLDataManager request ID to the history request.
+ cancelable_consumer_.SetClientData(hs, handle, request_id);
+ } else {
+ SendResponse(request_id, NULL);
+ }
+}
+
+void FavIconSource::OnFavIconDataAvailable(
+ HistoryService::Handle request_handle,
+ bool know_favicon,
+ scoped_refptr<RefCountedBytes> data,
+ bool expired,
+ GURL icon_url) {
+ HistoryService* hs =
+ profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ int request_id = cancelable_consumer_.GetClientData(hs, request_handle);
+
+ if (know_favicon && data.get() && !data->data.empty()) {
+ // Forward the data along to the networking system.
+ SendResponse(request_id, data);
+ } else {
+ if (!default_favicon_.get()) {
+ default_favicon_ = new RefCountedBytes;
+ ResourceBundle::GetSharedInstance().LoadImageResourceBytes(
+ IDR_DEFAULT_FAVICON, &default_favicon_->data);
+ }
+
+ SendResponse(request_id, default_favicon_);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// ThumbnailSource
+
+ThumbnailSource::ThumbnailSource(Profile* profile)
+ : DataSource(kThumbnailPath, MessageLoop::current()), profile_(profile) {}
+
+void ThumbnailSource::StartDataRequest(const std::string& path,
+ int request_id) {
+ HistoryService* hs = profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ if (hs) {
+ HistoryService::Handle handle = hs->GetPageThumbnail(
+ GURL(path),
+ &cancelable_consumer_,
+ NewCallback(this, &ThumbnailSource::OnThumbnailDataAvailable));
+ // Attach the ChromeURLDataManager request ID to the history request.
+ cancelable_consumer_.SetClientData(hs, handle, request_id);
+ } else {
+ // Tell the caller that no thumbnail is available.
+ SendResponse(request_id, NULL);
+ }
+}
+
+void ThumbnailSource::OnThumbnailDataAvailable(
+ HistoryService::Handle request_handle,
+ scoped_refptr<RefCountedBytes> data) {
+ HistoryService* hs =
+ profile_->GetHistoryService(Profile::EXPLICIT_ACCESS);
+ int request_id = cancelable_consumer_.GetClientData(hs, request_handle);
+ // Forward the data along to the networking system.
+ if (data.get() && !data->data.empty()) {
+ SendResponse(request_id, data);
+ } else {
+ if (!default_thumbnail_.get()) {
+ default_thumbnail_ = new RefCountedBytes;
+ ResourceBundle::GetSharedInstance().LoadImageResourceBytes(
+ IDR_DEFAULT_THUMBNAIL, &default_thumbnail_->data);
+ }
+
+ SendResponse(request_id, default_thumbnail_);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// DOMUIContents
+
+// This is the top-level URL handler for chrome: URLs, and exposed in
+// our header file. The individual DOMUIs provide a chrome:
+// HTML source at the same host/path.
+bool DOMUIContentsCanHandleURL(GURL* url,
+ TabContentsType* result_type) {
+ if (!url->SchemeIs(kURLScheme))
+ return false;
+
+ // TODO: remove once the debugger is using DOMContentsUI
+ if (url->host().compare("debugger") == 0)
+ return false;
+
+ *result_type = TAB_CONTENTS_DOM_UI;
+ return true;
+}
+
+DOMUIContents::DOMUIContents(Profile* profile,
+ SiteInstance* instance,
+ RenderViewHostFactory* render_view_factory)
+ : WebContents(profile,
+ instance,
+ render_view_factory,
+ MSG_ROUTING_NONE,
+ NULL),
+ current_ui_(NULL) {
+ set_type(TAB_CONTENTS_DOM_UI);
+}
+
+DOMUIContents::~DOMUIContents() {
+ if (current_ui_)
+ delete current_ui_;
+}
+
+bool DOMUIContents::CreateRenderViewForRenderManager(
+ RenderViewHost* render_view_host) {
+ // Be sure to enable DOM UI bindings on the RenderViewHost before
+ // CreateRenderView is called. Since a cross-site transition may be
+ // involved, this may or may not be the same RenderViewHost that we had when
+ // we were created.
+ render_view_host->AllowDOMUIBindings();
+ return WebContents::CreateRenderViewForRenderManager(render_view_host);
+}
+
+WebPreferences DOMUIContents::GetWebkitPrefs() {
+ // Get the users preferences then force image loading to always be on.
+ WebPreferences web_prefs = WebContents::GetWebkitPrefs();
+ web_prefs.loads_images_automatically = true;
+ web_prefs.javascript_enabled = true;
+
+ return web_prefs;
+}
+
+bool DOMUIContents::NavigateToPendingEntry(bool reload) {
+ if (current_ui_) {
+ // Shut down our existing DOMUI.
+ delete current_ui_;
+ current_ui_ = NULL;
+ }
+
+ // Set up a new DOMUI.
+ NavigationEntry* pending_entry = controller()->GetPendingEntry();
+ current_ui_ = GetDOMUIForURL(pending_entry->url());
+ if (current_ui_)
+ current_ui_->Init();
+ else
+ return false;
+
+ // Let WebContents do whatever it's meant to do.
+ return WebContents::NavigateToPendingEntry(reload);
+}
+
+DOMUI* DOMUIContents::GetDOMUIForURL(const GURL &url) {
+ if (url.host() == HistoryUI::GetBaseURL().host())
+ return new HistoryUI(this);
+
+ return NULL;
+}
+
+void DOMUIContents::ProcessDOMUIMessage(const std::string& message,
+ const std::string& content) {
+ DCHECK(current_ui_);
+ current_ui_->ProcessDOMUIMessage(message, content);
+}
+
+// static
+const std::string DOMUIContents::GetScheme() {
+ return kURLScheme;
+} \ No newline at end of file