Chromium Code Reviews| Index: chrome/browser/ui/webui/theme_source.cc |
| diff --git a/chrome/browser/ui/webui/theme_source.cc b/chrome/browser/ui/webui/theme_source.cc |
| index 2c2a59b35ef102b3ff145593fbe81552a50441bb..c9b6dead1f81e774036460e38a7c76bcb9763a55 100644 |
| --- a/chrome/browser/ui/webui/theme_source.cc |
| +++ b/chrome/browser/ui/webui/theme_source.cc |
| @@ -6,6 +6,7 @@ |
| #include "base/memory/ref_counted_memory.h" |
| #include "base/message_loop.h" |
| +#include "base/string_number_conversions.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/resources_util.h" |
| #include "chrome/browser/themes/theme_service.h" |
| @@ -15,21 +16,58 @@ |
| #include "chrome/common/url_constants.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "googleurl/src/gurl.h" |
| +#include "ui/base/layout.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/base/theme_provider.h" |
| using content::BrowserThread; |
| +namespace { |
| + |
| // use a resource map rather than hard-coded strings. |
| static const char* kNewTabCSSPath = "css/new_tab_theme.css"; |
| static const char* kNewIncognitoTabCSSPath = "css/incognito_new_tab_theme.css"; |
| -static std::string StripQueryParams(const std::string& path) { |
| +struct ScaleFactorMap { |
| + const char* name; |
| + ui::ScaleFactor scale_factor; |
| +}; |
| + |
| +const ScaleFactorMap kScaleFactorMap[] = { |
| + { "1x", ui::SCALE_FACTOR_100P }, |
| + { "2x", ui::SCALE_FACTOR_200P }, |
| +}; |
| + |
| +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 '/'. |
| } |
| +std::string ParsePathAndScale(const std::string& path, |
| + ui::ScaleFactor* scale_factor) { |
| + // Our path may include cachebuster arguments, so trim them off. |
|
sky
2012/05/16 14:21:21
Set *scale_factor up here so that its always set.
flackr
2012/05/16 14:37:12
Done.
|
| + std::string uncached_path = StripQueryParams(path); |
| + |
| + // Detect and parse resource string ending in @<scale>x. |
| + std::size_t pos = uncached_path.rfind('@'); |
| + if (pos != std::string::npos) { |
| + if (scale_factor) { |
| + for (size_t i = 0; i < arraysize(kScaleFactorMap); i++) { |
| + if (uncached_path.compare(pos + 1, uncached_path.length() - pos - 1, |
| + kScaleFactorMap[i].name) == 0) { |
| + *scale_factor = kScaleFactorMap[i].scale_factor; |
| + } |
| + } |
| + } |
| + // Strip scale factor specification from path. |
| + uncached_path = uncached_path.substr(0, pos); |
| + } |
| + return uncached_path; |
| +} |
| + |
| +} // namespace |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // ThemeSource, public: |
| @@ -46,8 +84,9 @@ ThemeSource::~ThemeSource() { |
| void ThemeSource::StartDataRequest(const std::string& path, |
| bool is_incognito, |
| int request_id) { |
| - // Our path may include cachebuster arguments, so trim them off. |
| - std::string uncached_path = StripQueryParams(path); |
| + // Default scale factor if not specified. |
| + ui::ScaleFactor scale_factor = ui::SCALE_FACTOR_100P; |
| + std::string uncached_path = ParsePathAndScale(path, &scale_factor); |
| if (uncached_path == kNewTabCSSPath || |
| uncached_path == kNewIncognitoTabCSSPath) { |
| @@ -60,7 +99,7 @@ void ThemeSource::StartDataRequest(const std::string& path, |
| } else { |
| int resource_id = ResourcesUtil::GetThemeResourceId(uncached_path); |
| if (resource_id != -1) { |
| - SendThemeBitmap(request_id, resource_id); |
| + SendThemeBitmap(request_id, resource_id, scale_factor); |
| return; |
| } |
| } |
| @@ -69,7 +108,7 @@ void ThemeSource::StartDataRequest(const std::string& path, |
| } |
| std::string ThemeSource::GetMimeType(const std::string& path) const { |
| - std::string uncached_path = StripQueryParams(path); |
| + std::string uncached_path = ParsePathAndScale(path, NULL); |
| if (uncached_path == kNewTabCSSPath || |
| uncached_path == kNewIncognitoTabCSSPath) { |
| @@ -81,7 +120,7 @@ std::string ThemeSource::GetMimeType(const std::string& path) const { |
| MessageLoop* ThemeSource::MessageLoopForRequestPath( |
| const std::string& path) const { |
| - std::string uncached_path = StripQueryParams(path); |
| + std::string uncached_path = ParsePathAndScale(path, NULL); |
| if (uncached_path == kNewTabCSSPath || |
| uncached_path == kNewIncognitoTabCSSPath) { |
| @@ -107,18 +146,22 @@ bool ThemeSource::ShouldReplaceExistingSource() const { |
| //////////////////////////////////////////////////////////////////////////////// |
| // ThemeSource, private: |
| -void ThemeSource::SendThemeBitmap(int request_id, int resource_id) { |
| +void ThemeSource::SendThemeBitmap(int request_id, |
| + int resource_id, |
| + ui::ScaleFactor scale_factor) { |
| if (ThemeService::IsThemeableImage(resource_id)) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| ui::ThemeProvider* tp = ThemeServiceFactory::GetForProfile(profile_); |
| DCHECK(tp); |
| + // TODO(flackr): Pass scale factor when fetching themeable images. |
| scoped_refptr<base::RefCountedMemory> image_data(tp->GetRawData( |
| resource_id)); |
| SendResponse(request_id, image_data); |
| } else { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| const ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| - SendResponse(request_id, rb.LoadDataResourceBytes(resource_id)); |
| + SendResponse(request_id, |
| + rb.LoadDataResourceBytes(resource_id, scale_factor)); |
| } |
| } |