summaryrefslogtreecommitdiffstats
path: root/chrome/browser/dom_ui/dom_ui_theme_source.cc
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-07-29 17:14:53 +0100
committerBen Murdoch <benm@google.com>2010-08-04 14:29:45 +0100
commitc407dc5cd9bdc5668497f21b26b09d988ab439de (patch)
tree7eaf8707c0309516bdb042ad976feedaf72b0bb1 /chrome/browser/dom_ui/dom_ui_theme_source.cc
parent0998b1cdac5733f299c12d88bc31ef9c8035b8fa (diff)
downloadexternal_chromium-c407dc5cd9bdc5668497f21b26b09d988ab439de.zip
external_chromium-c407dc5cd9bdc5668497f21b26b09d988ab439de.tar.gz
external_chromium-c407dc5cd9bdc5668497f21b26b09d988ab439de.tar.bz2
Merge Chromium src@r53293
Change-Id: Ia79acf8670f385cee48c45b0a75371d8e950af34
Diffstat (limited to 'chrome/browser/dom_ui/dom_ui_theme_source.cc')
-rw-r--r--chrome/browser/dom_ui/dom_ui_theme_source.cc109
1 files changed, 109 insertions, 0 deletions
diff --git a/chrome/browser/dom_ui/dom_ui_theme_source.cc b/chrome/browser/dom_ui/dom_ui_theme_source.cc
new file mode 100644
index 0000000..f34091e
--- /dev/null
+++ b/chrome/browser/dom_ui/dom_ui_theme_source.cc
@@ -0,0 +1,109 @@
+// Copyright (c) 2009 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_theme_source.h"
+
+#include "app/resource_bundle.h"
+#include "app/theme_provider.h"
+#include "base/message_loop.h"
+#include "chrome/browser/browser_theme_provider.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/dom_ui/ntp_resource_cache.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/resources_util.h"
+#include "chrome/common/url_constants.h"
+#include "googleurl/src/gurl.h"
+
+// use a resource map rather than hard-coded strings.
+static const char* kNewTabCSSPath = "css/newtab.css";
+static const char* kNewIncognitoTabCSSPath = "css/newincognitotab.css";
+
+static std::string StripQueryParams(const std::string& path) {
+ GURL path_url = GURL(std::string(chrome::kChromeUIScheme) + "://" +
+ std::string(chrome::kChromeUIThemePath) + "/" + path);
+ return path_url.path().substr(1); // path() always includes a leading '/'.
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// DOMUIThemeSource, public:
+
+DOMUIThemeSource::DOMUIThemeSource(Profile* profile)
+ : DataSource(chrome::kChromeUIThemePath, MessageLoop::current()),
+ profile_(profile->GetOriginalProfile()) {
+ css_bytes_ = profile_->GetNTPResourceCache()->GetNewTabCSS(
+ profile->IsOffTheRecord());
+}
+
+void DOMUIThemeSource::StartDataRequest(const std::string& path,
+ bool is_off_the_record,
+ int request_id) {
+ // Our path may include cachebuster arguments, so trim them off.
+ std::string uncached_path = StripQueryParams(path);
+
+ if (uncached_path == kNewTabCSSPath ||
+ uncached_path == kNewIncognitoTabCSSPath) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
+ DCHECK((uncached_path == kNewTabCSSPath && !is_off_the_record) ||
+ (uncached_path == kNewIncognitoTabCSSPath && is_off_the_record));
+
+ SendResponse(request_id, css_bytes_);
+ return;
+ } else {
+ int resource_id = ResourcesUtil::GetThemeResourceId(uncached_path);
+ if (resource_id != -1) {
+ SendThemeBitmap(request_id, resource_id);
+ return;
+ }
+ }
+ // We don't have any data to send back.
+ SendResponse(request_id, NULL);
+}
+
+std::string DOMUIThemeSource::GetMimeType(const std::string& path) const {
+ std::string uncached_path = StripQueryParams(path);
+
+ if (uncached_path == kNewTabCSSPath ||
+ uncached_path == kNewIncognitoTabCSSPath) {
+ return "text/css";
+ }
+
+ return "image/png";
+}
+
+MessageLoop* DOMUIThemeSource::MessageLoopForRequestPath(
+ const std::string& path) const {
+ std::string uncached_path = StripQueryParams(path);
+
+ if (uncached_path == kNewTabCSSPath ||
+ uncached_path == kNewIncognitoTabCSSPath) {
+ // We generated and cached this when we initialized the object. We don't
+ // have to go back to the UI thread to send the data.
+ return NULL;
+ }
+
+ // If it's not a themeable image, we don't need to go to the UI thread.
+ int resource_id = ResourcesUtil::GetThemeResourceId(uncached_path);
+ if (!BrowserThemeProvider::IsThemeableImage(resource_id))
+ return NULL;
+
+ return DataSource::MessageLoopForRequestPath(path);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// DOMUIThemeSource, private:
+
+void DOMUIThemeSource::SendThemeBitmap(int request_id, int resource_id) {
+ if (BrowserThemeProvider::IsThemeableImage(resource_id)) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
+ ThemeProvider* tp = profile_->GetThemeProvider();
+ DCHECK(tp);
+
+ scoped_refptr<RefCountedMemory> image_data(tp->GetRawData(resource_id));
+ SendResponse(request_id, image_data);
+ } else {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::IO));
+ const ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ SendResponse(request_id, rb.LoadDataResourceBytes(resource_id));
+ }
+}