Index: chrome/browser/extensions/active_script_controller.cc |
diff --git a/chrome/browser/extensions/active_script_controller.cc b/chrome/browser/extensions/active_script_controller.cc |
index c15d4781af29149a125a4c4603935b4460a314f3..39c7f353c73ff69563a969e5762040a366deb0fd 100644 |
--- a/chrome/browser/extensions/active_script_controller.cc |
+++ b/chrome/browser/extensions/active_script_controller.cc |
@@ -210,9 +210,10 @@ void ActiveScriptController::RunPendingForExtension( |
LocationBarController::NotifyChange(web_contents()); |
} |
-void ActiveScriptController::OnNotifyExtensionScriptExecution( |
+void ActiveScriptController::OnRequestContentScriptPermission( |
const std::string& extension_id, |
- int page_id) { |
+ int page_id, |
+ int request_id) { |
if (!Extension::IdIsValid(extension_id)) { |
NOTREACHED() << "'" << extension_id << "' is not a valid id."; |
return; |
@@ -226,18 +227,44 @@ void ActiveScriptController::OnNotifyExtensionScriptExecution( |
if (!extension) |
return; |
- // Right now, we allow all content scripts to execute, but notify the |
- // controller of them. |
- // TODO(rdevlin.cronin): Fix this in a future CL. |
- if (RequiresUserConsentForScriptInjection(extension)) |
- RequestScriptInjection(extension, page_id, base::Bind(&base::DoNothing)); |
+ // If the request id is -1, that signals that the content script has already |
+ // ran (because this feature is not enabled). Add the extension to the list of |
+ // permitted extensions (for metrics), and return immediately. |
+ if (request_id == -1) { |
+ DCHECK(!enabled_); |
+ permitted_extensions_.insert(extension->id()); |
+ return; |
+ } |
+ |
+ if (RequiresUserConsentForScriptInjection(extension)) { |
+ // This base::Unretained() is safe, because the callback is only invoked by |
+ // this object. |
+ RequestScriptInjection( |
+ extension, |
+ page_id, |
+ base::Bind(&ActiveScriptController::GrantContentScriptPermission, |
+ base::Unretained(this), |
+ request_id)); |
+ } else { |
+ GrantContentScriptPermission(request_id); |
+ } |
+} |
+ |
+void ActiveScriptController::GrantContentScriptPermission(int request_id) { |
+ content::RenderViewHost* render_view_host = |
+ web_contents()->GetRenderViewHost(); |
+ if (render_view_host) { |
+ render_view_host->Send(new ExtensionMsg_GrantContentScriptPermission( |
+ render_view_host->GetRoutingID(), |
+ request_id)); |
+ } |
} |
bool ActiveScriptController::OnMessageReceived(const IPC::Message& message) { |
bool handled = true; |
IPC_BEGIN_MESSAGE_MAP(ActiveScriptController, message) |
- IPC_MESSAGE_HANDLER(ExtensionHostMsg_NotifyExtensionScriptExecution, |
- OnNotifyExtensionScriptExecution) |
+ IPC_MESSAGE_HANDLER(ExtensionHostMsg_RequestContentScriptPermission, |
+ OnRequestContentScriptPermission) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
return handled; |