Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10851)

Unified Diff: chrome/renderer/extensions/extension_dispatcher.cc

Issue 8542001: Insert default stylesheet for platform apps. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/extensions/extension_dispatcher.cc
diff --git a/chrome/renderer/extensions/extension_dispatcher.cc b/chrome/renderer/extensions/extension_dispatcher.cc
index 9ed183928dfd4d046998e2a11da09f4c1641016d..3223ef559fcc42cb0489ed8688470dbc5924c393 100644
--- a/chrome/renderer/extensions/extension_dispatcher.cc
+++ b/chrome/renderer/extensions/extension_dispatcher.cc
@@ -29,6 +29,8 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityPolicy.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
+#include "ui/base/resource/resource_bundle.h"
#include "v8/include/v8.h"
namespace {
@@ -40,13 +42,16 @@ using WebKit::WebDataSource;
using WebKit::WebFrame;
using WebKit::WebSecurityPolicy;
using WebKit::WebString;
+using WebKit::WebVector;
+using WebKit::WebView;
using content::RenderThread;
ExtensionDispatcher::ExtensionDispatcher()
: is_webkit_initialized_(false),
webrequest_adblock_(false),
webrequest_adblock_plus_(false),
- webrequest_other_(false) {
+ webrequest_other_(false),
+ is_batch_load_in_progress_(false) {
const CommandLine& command_line = *(CommandLine::ForCurrentProcess());
is_extension_process_ =
command_line.HasSwitch(switches::kExtensionProcess) ||
@@ -71,6 +76,8 @@ bool ExtensionDispatcher::OnControlMessageReceived(
IPC_MESSAGE_HANDLER(ExtensionMsg_DeliverMessage, OnDeliverMessage)
IPC_MESSAGE_HANDLER(ExtensionMsg_SetFunctionNames, OnSetFunctionNames)
IPC_MESSAGE_HANDLER(ExtensionMsg_Loaded, OnLoaded)
+ IPC_MESSAGE_HANDLER(ExtensionMsg_StartBatchLoad, OnStartBatchLoad)
+ IPC_MESSAGE_HANDLER(ExtensionMsg_EndBatchLoad, OnEndBatchLoad)
IPC_MESSAGE_HANDLER(ExtensionMsg_Unloaded, OnUnloaded)
IPC_MESSAGE_HANDLER(ExtensionMsg_SetScriptingWhitelist,
OnSetScriptingWhitelist)
@@ -189,6 +196,58 @@ void ExtensionDispatcher::OnLoaded(const ExtensionMsg_Loaded_Params& params) {
}
extensions_.Insert(extension);
+
+ if (extension->is_platform_app()) {
+ extensions_needing_stylesheet_.Insert(extension);
+ if (is_batch_load_in_progress_) {
+ // Do nothing; we'll expect the ExtensionMsg_EndBatchLoad message as our
+ // signal to do the cleanup work of creating a single stylesheet matching
+ // all the platform-app URL patterns observed in the batch.
+ } else {
+ DCHECK(extensions_needing_stylesheet_.size() == 1u);
+ // This ExtensionMsg_Loaded was not sent as part of a batch. But to
+ // simplify, let's treat it as a synthetic batch of one, then run the
+ // batch-ending code.
+ is_batch_load_in_progress_ = true;
+ OnEndBatchLoad();
+ }
+ }
+}
+
+void ExtensionDispatcher::OnStartBatchLoad() {
+ DCHECK(extensions_needing_stylesheet_.size() == 0u);
+ DCHECK(!is_batch_load_in_progress_);
+ is_batch_load_in_progress_ = true;
+}
+
+void ExtensionDispatcher::OnEndBatchLoad() {
+ DCHECK(is_batch_load_in_progress_);
+
+ // We have collected a set of platform-app extensions, so let's tell WebKit
+ // about them so that it can provide a default stylesheet for them.
+ //
+ // TODO: consider enhancing WebView to allow removing single stylesheets, or
+ // else to edit the pattern set associated with one.
+ std::vector<WebString> temp_patterns;
+ for (ExtensionSet::const_iterator i = extensions_needing_stylesheet_.begin();
+ i != extensions_needing_stylesheet_.end(); ++i) {
+ temp_patterns.push_back(
+ WebString::fromUTF8(i->second->url().spec() + "*"));
+ }
+ WebVector<WebString> patterns;
+ patterns.assign(temp_patterns);
+ if (patterns.size() > 0) {
+ WebView::addUserStyleSheet(
+ WebString::fromUTF8(ResourceBundle::GetSharedInstance().
+ GetRawDataResource(IDR_PLATFORM_APP_CSS)),
+ patterns,
+ WebView::UserContentInjectInAllFrames,
+ WebView::UserStyleInjectInExistingDocuments);
+ }
+
+ // We have fully processed the batch. Clean things up for the next one.
+ extensions_needing_stylesheet_.Clear();
+ is_batch_load_in_progress_ = false;
}
void ExtensionDispatcher::OnUnloaded(const std::string& id) {
@@ -197,6 +256,10 @@ void ExtensionDispatcher::OnUnloaded(const std::string& id) {
// we'd like it to get a new isolated world ID, so that it can pick up the
// changed origin whitelist.
user_script_slave_->RemoveIsolatedWorld(id);
+
+ // We don't do anything with existing platform-app stylesheets. They will
+ // stay resident, but the URL pattern corresponding to the unloaded
+ // extension's URL just won't match anything anymore.
}
void ExtensionDispatcher::OnSetScriptingWhitelist(

Powered by Google App Engine
This is Rietveld 408576698