diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-16 00:54:41 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-16 00:54:41 +0000 |
commit | 6451d8737f7c36dda01ace43d450f425598daf91 (patch) | |
tree | be1f597ad96f799a399cdb6f95e03e1c8e3e98e7 /chrome/renderer | |
parent | 8117fefbf48185d531c6a6d36c707a2114490686 (diff) | |
download | chromium_src-6451d8737f7c36dda01ace43d450f425598daf91.zip chromium_src-6451d8737f7c36dda01ace43d450f425598daf91.tar.gz chromium_src-6451d8737f7c36dda01ace43d450f425598daf91.tar.bz2 |
Use WebCore's built in support for user styles instead of the
hack we were doing before.
This has a side-effect of fixing a bunch of content-interaction
bugs because we will be using real user-level styles (in the
CSS sense) rather than content-level styles.
BUG=29995
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=52581
Review URL: http://codereview.chromium.org/2932007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52584 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/user_script_slave.cc | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/chrome/renderer/user_script_slave.cc b/chrome/renderer/user_script_slave.cc index e064093..7a2f521 100644 --- a/chrome/renderer/user_script_slave.cc +++ b/chrome/renderer/user_script_slave.cc @@ -14,15 +14,20 @@ #include "base/string_util.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension.h" +#include "chrome/common/url_constants.h" #include "chrome/renderer/extension_groups.h" #include "chrome/renderer/render_thread.h" #include "googleurl/src/gurl.h" #include "third_party/WebKit/WebKit/chromium/public/WebFrame.h" +#include "third_party/WebKit/WebKit/chromium/public/WebVector.h" +#include "third_party/WebKit/WebKit/chromium/public/WebView.h" #include "grit/renderer_resources.h" using WebKit::WebFrame; using WebKit::WebString; +using WebKit::WebVector; +using WebKit::WebView; // These two strings are injected before and after the Greasemonkey API and // user script to wrap it in an anonymous scope. @@ -128,6 +133,42 @@ bool UserScriptSlave::UpdateScripts(base::SharedMemoryHandle shared_memory) { } } + // Push user styles down into WebCore + WebView::removeAllUserContent(); + for (size_t i = 0; i < scripts_.size(); ++i) { + UserScript* script = scripts_[i]; + if (script->css_scripts().empty()) + continue; + + WebVector<WebString> patterns; + std::vector<WebString> temp_patterns; + for (size_t k = 0; k < script->url_patterns().size(); ++k) { + std::vector<URLPattern> explicit_patterns = + script->url_patterns()[k].ConvertToExplicitSchemes(); + for (size_t m = 0; m < explicit_patterns.size(); ++m) { + // Only include file schemes if the user has opted into that. + if (!explicit_patterns[m].MatchesScheme(chrome::kFileScheme) || + script->allow_file_access()) { + temp_patterns.push_back(WebString::fromUTF8( + explicit_patterns[m].GetAsString())); + } + } + } + patterns.assign(temp_patterns); + + for (size_t j = 0; j < script->css_scripts().size(); ++j) { + const UserScript::File& file = scripts_[i]->css_scripts()[j]; + std::string content = file.GetContent().as_string(); + + WebView::addUserStyleSheet( + WebString::fromUTF8(content), + patterns, + script->match_all_frames() ? + WebView::UserContentInjectInAllFrames : + WebView::UserContentInjectInTopFrameOnly); + } + } + return true; } @@ -174,17 +215,11 @@ void UserScriptSlave::InjectScripts(WebFrame* frame, if (frame_url.SchemeIsFile() && !script->allow_file_access()) continue; // This script isn't allowed to run on file URLs. - // CSS files are always injected on document start before js scripts. - if (location == UserScript::DOCUMENT_START) { + // We rely on WebCore for CSS injection, but it's still useful to know how + // many css files there are. + if (location == UserScript::DOCUMENT_START) num_css += script->css_scripts().size(); - for (size_t j = 0; j < script->css_scripts().size(); ++j) { - PerfTimer insert_timer; - UserScript::File& file = script->css_scripts()[j]; - frame->insertStyleText( - WebString::fromUTF8(file.GetContent().as_string()), WebString()); - UMA_HISTOGRAM_TIMES("Extensions.InjectCssTime", insert_timer.Elapsed()); - } - } + if (script->run_location() == location) { num_scripts += script->js_scripts().size(); for (size_t j = 0; j < script->js_scripts().size(); ++j) { |