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..95af046ebb772be30ea11cecf6fdfcdea2c2b209 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" |
@@ -20,16 +21,41 @@ |
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) { |
+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, float* scale_factor) { |
+ // Our path may include cachebuster arguments, so trim them off. |
+ 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 && |
+ uncached_path[uncached_path.length()-1] == 'x') { |
+ double scale_d; |
+ if (scale_factor && |
+ base::StringToDouble( |
+ uncached_path.substr(pos + 1, uncached_path.length() - pos - 2), |
+ &scale_d)) { |
+ *scale_factor = scale_d; |
+ } |
+ // Strip scale factor specification from path. |
+ uncached_path = uncached_path.substr(0, pos); |
+ } |
+ return uncached_path; |
+} |
+ |
+} // namespace |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// ThemeSource, public: |
@@ -46,8 +72,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. |
+ float scale_factor = 1; |
+ std::string uncached_path = ParsePathAndScale(path, &scale_factor); |
if (uncached_path == kNewTabCSSPath || |
uncached_path == kNewIncognitoTabCSSPath) { |
@@ -60,7 +87,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 +96,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 +108,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 +134,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, |
+ float 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.LoadImageResourceBytes(resource_id, scale_factor)); |
} |
} |