[email protected] | dcceaa5 | 2012-02-28 20:22:20 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | fd42ac30f | 2011-02-27 19:33:36 | [diff] [blame] | 5 | #include "chrome/browser/ui/webui/theme_source.h" |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 6 | |
[email protected] | 3b63f8f4 | 2011-03-28 01:54:15 | [diff] [blame] | 7 | #include "base/memory/ref_counted_memory.h" |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 8 | #include "base/message_loop.h" |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 9 | #include "base/string_number_conversions.h" |
[email protected] | 8ecad5e | 2010-12-02 21:18:33 | [diff] [blame] | 10 | #include "chrome/browser/profiles/profile.h" |
[email protected] | 1faee3f0 | 2010-06-21 07:01:34 | [diff] [blame] | 11 | #include "chrome/browser/resources_util.h" |
[email protected] | 1828037 | 2011-03-22 18:05:22 | [diff] [blame] | 12 | #include "chrome/browser/themes/theme_service.h" |
[email protected] | a0ea76c | 2011-03-23 17:36:42 | [diff] [blame] | 13 | #include "chrome/browser/themes/theme_service_factory.h" |
[email protected] | 7c5c6f3a | 2011-04-28 19:56:49 | [diff] [blame] | 14 | #include "chrome/browser/ui/webui/ntp/ntp_resource_cache.h" |
[email protected] | 60100b2 | 2011-06-29 23:37:25 | [diff] [blame] | 15 | #include "chrome/browser/ui/webui/ntp/ntp_resource_cache_factory.h" |
[email protected] | daf19c5 | 2012-07-13 19:01:32 | [diff] [blame] | 16 | #include "chrome/browser/ui/webui/web_ui_util.h" |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 17 | #include "chrome/common/url_constants.h" |
[email protected] | c38831a1 | 2011-10-28 12:44:49 | [diff] [blame] | 18 | #include "content/public/browser/browser_thread.h" |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 19 | #include "googleurl/src/gurl.h" |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 20 | #include "ui/base/layout.h" |
[email protected] | 42ce29d | 2011-01-20 23:19:46 | [diff] [blame] | 21 | #include "ui/base/resource/resource_bundle.h" |
[email protected] | 9dd7e3d7 | 2011-01-20 18:27:06 | [diff] [blame] | 22 | #include "ui/base/theme_provider.h" |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 23 | |
[email protected] | 631bb74 | 2011-11-02 11:29:39 | [diff] [blame] | 24 | using content::BrowserThread; |
| 25 | |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 26 | namespace { |
| 27 | |
[email protected] | daf19c5 | 2012-07-13 19:01:32 | [diff] [blame] | 28 | std::string GetThemePath() { |
| 29 | return std::string(chrome::kChromeUIScheme) + |
| 30 | "://" + std::string(chrome::kChromeUIThemePath) + "/"; |
| 31 | } |
| 32 | |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 33 | // use a resource map rather than hard-coded strings. |
[email protected] | dcceaa5 | 2012-02-28 20:22:20 | [diff] [blame] | 34 | static const char* kNewTabCSSPath = "css/new_tab_theme.css"; |
| 35 | static const char* kNewIncognitoTabCSSPath = "css/incognito_new_tab_theme.css"; |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 36 | |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 37 | } // namespace |
| 38 | |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 39 | //////////////////////////////////////////////////////////////////////////////// |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 40 | // ThemeSource, public: |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 41 | |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 42 | ThemeSource::ThemeSource(Profile* profile) |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 43 | : DataSource(chrome::kChromeUIThemePath, MessageLoop::current()), |
[email protected] | 9e3a9a50 | 2009-11-24 20:35:59 | [diff] [blame] | 44 | profile_(profile->GetOriginalProfile()) { |
[email protected] | 60100b2 | 2011-06-29 23:37:25 | [diff] [blame] | 45 | css_bytes_ = NTPResourceCacheFactory::GetForProfile(profile)->GetNewTabCSS( |
[email protected] | 156ed27b | 2009-11-23 18:31:25 | [diff] [blame] | 46 | profile->IsOffTheRecord()); |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 47 | } |
| 48 | |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 49 | ThemeSource::~ThemeSource() { |
[email protected] | 307175443 | 2010-07-28 00:09:54 | [diff] [blame] | 50 | } |
| 51 | |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 52 | void ThemeSource::StartDataRequest(const std::string& path, |
[email protected] | b088811 | 2011-03-31 13:23:25 | [diff] [blame] | 53 | bool is_incognito, |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 54 | int request_id) { |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 55 | // Default scale factor if not specified. |
| 56 | ui::ScaleFactor scale_factor; |
[email protected] | daf19c5 | 2012-07-13 19:01:32 | [diff] [blame] | 57 | std::string uncached_path; |
| 58 | web_ui_util::ParsePathAndScale(GURL(GetThemePath() + path), |
| 59 | &uncached_path, |
| 60 | &scale_factor); |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 61 | |
[email protected] | 156ed27b | 2009-11-23 18:31:25 | [diff] [blame] | 62 | if (uncached_path == kNewTabCSSPath || |
| 63 | uncached_path == kNewIncognitoTabCSSPath) { |
[email protected] | 2dc383ce | 2010-10-09 03:54:00 | [diff] [blame] | 64 | DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
[email protected] | b088811 | 2011-03-31 13:23:25 | [diff] [blame] | 65 | DCHECK((uncached_path == kNewTabCSSPath && !is_incognito) || |
| 66 | (uncached_path == kNewIncognitoTabCSSPath && is_incognito)); |
[email protected] | 156ed27b | 2009-11-23 18:31:25 | [diff] [blame] | 67 | |
| 68 | SendResponse(request_id, css_bytes_); |
[email protected] | a5badef | 2009-08-06 16:37:56 | [diff] [blame] | 69 | return; |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 70 | } else { |
[email protected] | 1faee3f0 | 2010-06-21 07:01:34 | [diff] [blame] | 71 | int resource_id = ResourcesUtil::GetThemeResourceId(uncached_path); |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 72 | if (resource_id != -1) { |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 73 | SendThemeBitmap(request_id, resource_id, scale_factor); |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 74 | return; |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 75 | } |
| 76 | } |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 77 | // We don't have any data to send back. |
| 78 | SendResponse(request_id, NULL); |
| 79 | } |
| 80 | |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 81 | std::string ThemeSource::GetMimeType(const std::string& path) const { |
[email protected] | daf19c5 | 2012-07-13 19:01:32 | [diff] [blame] | 82 | std::string uncached_path; |
| 83 | web_ui_util::ParsePathAndScale(GURL(GetThemePath() + path), |
| 84 | &uncached_path, NULL); |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 85 | |
[email protected] | 40da87c1 | 2009-09-02 20:32:45 | [diff] [blame] | 86 | if (uncached_path == kNewTabCSSPath || |
| 87 | uncached_path == kNewIncognitoTabCSSPath) { |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 88 | return "text/css"; |
[email protected] | 40da87c1 | 2009-09-02 20:32:45 | [diff] [blame] | 89 | } |
| 90 | |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 91 | return "image/png"; |
| 92 | } |
| 93 | |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 94 | MessageLoop* ThemeSource::MessageLoopForRequestPath( |
[email protected] | 5d383ab | 2009-11-20 21:43:07 | [diff] [blame] | 95 | const std::string& path) const { |
[email protected] | daf19c5 | 2012-07-13 19:01:32 | [diff] [blame] | 96 | std::string uncached_path; |
| 97 | web_ui_util::ParsePathAndScale(GURL(GetThemePath() + path), |
| 98 | &uncached_path, NULL); |
[email protected] | 5d383ab | 2009-11-20 21:43:07 | [diff] [blame] | 99 | |
| 100 | if (uncached_path == kNewTabCSSPath || |
| 101 | uncached_path == kNewIncognitoTabCSSPath) { |
[email protected] | 156ed27b | 2009-11-23 18:31:25 | [diff] [blame] | 102 | // We generated and cached this when we initialized the object. We don't |
| 103 | // have to go back to the UI thread to send the data. |
[email protected] | 5d383ab | 2009-11-20 21:43:07 | [diff] [blame] | 104 | return NULL; |
| 105 | } |
| 106 | |
[email protected] | 26d7ca2a | 2009-11-24 22:32:16 | [diff] [blame] | 107 | // If it's not a themeable image, we don't need to go to the UI thread. |
[email protected] | 1faee3f0 | 2010-06-21 07:01:34 | [diff] [blame] | 108 | int resource_id = ResourcesUtil::GetThemeResourceId(uncached_path); |
[email protected] | a0ea76c | 2011-03-23 17:36:42 | [diff] [blame] | 109 | if (!ThemeService::IsThemeableImage(resource_id)) |
[email protected] | 26d7ca2a | 2009-11-24 22:32:16 | [diff] [blame] | 110 | return NULL; |
| 111 | |
[email protected] | 5d383ab | 2009-11-20 21:43:07 | [diff] [blame] | 112 | return DataSource::MessageLoopForRequestPath(path); |
| 113 | } |
| 114 | |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 115 | bool ThemeSource::ShouldReplaceExistingSource() const { |
[email protected] | f7e0ab7 | 2011-03-10 15:04:47 | [diff] [blame] | 116 | // We currently get the css_bytes_ in the ThemeSource constructor, so we need |
| 117 | // to recreate the source itself when a theme changes. |
| 118 | return true; |
[email protected] | ffe3d6f | 2011-02-23 16:42:52 | [diff] [blame] | 119 | } |
| 120 | |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 121 | //////////////////////////////////////////////////////////////////////////////// |
[email protected] | 6599259 | 2011-02-24 02:25:15 | [diff] [blame] | 122 | // ThemeSource, private: |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 123 | |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 124 | void ThemeSource::SendThemeBitmap(int request_id, |
| 125 | int resource_id, |
| 126 | ui::ScaleFactor scale_factor) { |
[email protected] | a0ea76c | 2011-03-23 17:36:42 | [diff] [blame] | 127 | if (ThemeService::IsThemeableImage(resource_id)) { |
[email protected] | 2dc383ce | 2010-10-09 03:54:00 | [diff] [blame] | 128 | DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
[email protected] | 1828037 | 2011-03-22 18:05:22 | [diff] [blame] | 129 | ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_); |
[email protected] | 26d7ca2a | 2009-11-24 22:32:16 | [diff] [blame] | 130 | DCHECK(tp); |
[email protected] | dff6d13 | 2009-05-15 22:40:57 | [diff] [blame] | 131 | |
[email protected] | 68c7630b | 2012-05-02 22:37:42 | [diff] [blame] | 132 | scoped_refptr<base::RefCountedMemory> image_data(tp->GetRawData( |
[email protected] | 0a3e3c611 | 2012-08-05 20:07:45 | [diff] [blame^] | 133 | resource_id, scale_factor)); |
[email protected] | 26d7ca2a | 2009-11-24 22:32:16 | [diff] [blame] | 134 | SendResponse(request_id, image_data); |
| 135 | } else { |
[email protected] | 2dc383ce | 2010-10-09 03:54:00 | [diff] [blame] | 136 | DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
[email protected] | 26d7ca2a | 2009-11-24 22:32:16 | [diff] [blame] | 137 | const ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
[email protected] | c49201a | 2012-05-24 11:04:57 | [diff] [blame] | 138 | SendResponse(request_id, |
| 139 | rb.LoadDataResourceBytes(resource_id, scale_factor)); |
[email protected] | 26d7ca2a | 2009-11-24 22:32:16 | [diff] [blame] | 140 | } |
[email protected] | 4a19063 | 2009-05-09 01:07:42 | [diff] [blame] | 141 | } |