summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-24 22:32:16 +0000
committertony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-24 22:32:16 +0000
commit26d7ca2a3b70f96e0571295b0919be152598beaa (patch)
tree80ff7fe9878f8eb305f73f7d4d096d64a124a2d8
parent85e67bff2224246e3d991acbf9492d222ab34d05 (diff)
downloadchromium_src-26d7ca2a3b70f96e0571295b0919be152598beaa.zip
chromium_src-26d7ca2a3b70f96e0571295b0919be152598beaa.tar.gz
chromium_src-26d7ca2a3b70f96e0571295b0919be152598beaa.tar.bz2
Move some theme images to being serviced on the IO thread. For
Linux Release builds on my machine, all the chrome://theme/ image requests block for 300-400ms during browser startup (it's faster after startup). Something is blocking the UI thread so move image requests that aren't themed off the UI thread. This is safe to do because ResourceBundle is thread safe. I still see chrome://theme/theme_ntp_attribution and chrome://theme/theme_ntp_background blocking so I will look into those next (I think with the default theme, they shouldn't be loaded at all). Review URL: http://codereview.chromium.org/440009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32985 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--app/resource_bundle.cc2
-rw-r--r--app/resource_bundle.h2
-rw-r--r--chrome/browser/browser_theme_provider.cc7
-rw-r--r--chrome/browser/browser_theme_provider.h5
-rw-r--r--chrome/browser/dom_ui/dom_ui_theme_source.cc21
5 files changed, 28 insertions, 9 deletions
diff --git a/app/resource_bundle.cc b/app/resource_bundle.cc
index 2b60c78..e3174d8 100644
--- a/app/resource_bundle.cc
+++ b/app/resource_bundle.cc
@@ -87,7 +87,7 @@ std::string ResourceBundle::GetDataResource(int resource_id) {
}
RefCountedStaticMemory* ResourceBundle::LoadDataResourceBytes(
- int resource_id) {
+ int resource_id) const {
return LoadResourceBytes(resources_data_, resource_id);
}
diff --git a/app/resource_bundle.h b/app/resource_bundle.h
index e608ccd..5c3afb2 100644
--- a/app/resource_bundle.h
+++ b/app/resource_bundle.h
@@ -87,7 +87,7 @@ class ResourceBundle {
// Loads the raw bytes of a data resource into |bytes|,
// without doing any processing or interpretation of
// the resource. Returns whether we successfully read the resource.
- RefCountedStaticMemory* LoadDataResourceBytes(int resource_id);
+ RefCountedStaticMemory* LoadDataResourceBytes(int resource_id) const;
// Return the contents of a file in a string given the resource id.
// This will copy the data from the resource and return it as a string.
diff --git a/chrome/browser/browser_theme_provider.cc b/chrome/browser/browser_theme_provider.cc
index 7f598a7..6bc9e97 100644
--- a/chrome/browser/browser_theme_provider.cc
+++ b/chrome/browser/browser_theme_provider.cc
@@ -223,7 +223,6 @@ bool HasThemeableImage(int themeable_image_id) {
}
-
class WriteImagesToDiskTask : public Task {
public:
WriteImagesToDiskTask(
@@ -270,10 +269,16 @@ class WriteImagesToDiskTask : public Task {
} // namespace
+bool BrowserThemeProvider::IsThemeableImage(int resource_id) {
+ return HasThemeableImage(resource_id);
+}
+
BrowserThemeProvider::BrowserThemeProvider()
: rb_(ResourceBundle::GetSharedInstance()),
profile_(NULL),
process_images_(false) {
+ // Initialize the themeable image map so we can use it on other threads.
+ HasThemeableImage(0);
resource_names_[IDR_THEME_FRAME] = "theme_frame";
resource_names_[IDR_THEME_FRAME_INACTIVE] = "theme_frame_inactive";
resource_names_[IDR_THEME_FRAME_OVERLAY] = "theme_frame_overlay";
diff --git a/chrome/browser/browser_theme_provider.h b/chrome/browser/browser_theme_provider.h
index 228cf53..04117b4 100644
--- a/chrome/browser/browser_theme_provider.h
+++ b/chrome/browser/browser_theme_provider.h
@@ -104,7 +104,10 @@ class BrowserThemeProvider : public NonThreadSafe,
static const char* kDefaultThemeID;
- public:
+ // Returns true if the image is themeable. Safe to call on any thread.
+ static bool IsThemeableImage(int resource_id);
+
+
BrowserThemeProvider();
virtual ~BrowserThemeProvider();
diff --git a/chrome/browser/dom_ui/dom_ui_theme_source.cc b/chrome/browser/dom_ui/dom_ui_theme_source.cc
index 3640c40..9fa4f25 100644
--- a/chrome/browser/dom_ui/dom_ui_theme_source.cc
+++ b/chrome/browser/dom_ui/dom_ui_theme_source.cc
@@ -79,6 +79,11 @@ MessageLoop* DOMUIThemeSource::MessageLoopForRequestPath(
return NULL;
}
+ // If it's not a themeable image, we don't need to go to the UI thread.
+ int resource_id = ThemeResourcesUtil::GetId(uncached_path);
+ if (!BrowserThemeProvider::IsThemeableImage(resource_id))
+ return NULL;
+
return DataSource::MessageLoopForRequestPath(path);
}
@@ -86,10 +91,16 @@ MessageLoop* DOMUIThemeSource::MessageLoopForRequestPath(
// DOMUIThemeSource, private:
void DOMUIThemeSource::SendThemeBitmap(int request_id, int resource_id) {
- DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
- ThemeProvider* tp = profile_->GetThemeProvider();
- DCHECK(tp);
+ 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);
+ 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));
+ }
}