| 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 822977d9d67b6d9cf3eee8cd6ca83e212cb03f75..d7b3e4bb2682da239fca5efffde2edb70a0094e3 100644
|
| --- a/chrome/browser/extensions/active_script_controller.cc
|
| +++ b/chrome/browser/extensions/active_script_controller.cc
|
| @@ -110,7 +110,7 @@ void ActiveScriptController::OnActiveTabPermissionGranted(
|
| }
|
|
|
| void ActiveScriptController::OnAdInjectionDetected(
|
| - const std::set<std::string> ad_injectors) {
|
| + const std::set<std::string>& ad_injectors) {
|
| // We're only interested in data if there are ad injectors detected.
|
| if (ad_injectors.empty())
|
| return;
|
| @@ -213,9 +213,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;
|
| @@ -229,18 +230,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;
|
|
|