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..b51c05dfa7f5704a02f5bdb81aa711596dccec1f 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,60 @@ |
#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. |
+ std::string uncached_path = StripQueryParams(path); |
+ if (scale_factor) |
+ *scale_factor = ui::SCALE_FACTOR_100P; |
+ |
+ // 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 +86,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; |
+ std::string uncached_path = ParsePathAndScale(path, &scale_factor); |
if (uncached_path == kNewTabCSSPath || |
uncached_path == kNewIncognitoTabCSSPath) { |
@@ -60,7 +101,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 +110,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 +122,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 +148,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)); |
} |
} |