Refactoring: de-couple Extensions from "script injection System" [render side]:3

- Introduce WebUIInjectionHost class and plumb InjectionHost interface
  to replace Extension in script injection system in the render.
- Store InjectionHost in ScriptInjection to avoid constructing InjectionHost
  objects everywhere.

BUG=459234

Review URL: https://codereview.chromium.org/934763003

Cr-Commit-Position: refs/heads/master@{#319067}
diff --git a/extensions/renderer/script_injection.cc b/extensions/renderer/script_injection.cc
index 58cf328..3bb279a7 100644
--- a/extensions/renderer/script_injection.cc
+++ b/extensions/renderer/script_injection.cc
@@ -108,16 +108,17 @@
 ScriptInjection::ScriptInjection(
     scoped_ptr<ScriptInjector> injector,
     blink::WebLocalFrame* web_frame,
-    const HostID& host_id,
+    scoped_ptr<const InjectionHost> injection_host,
     UserScript::RunLocation run_location,
     int tab_id)
     : injector_(injector.Pass()),
       web_frame_(web_frame),
-      host_id_(host_id),
+      injection_host_(injection_host.Pass()),
       run_location_(run_location),
       tab_id_(tab_id),
       request_id_(kInvalidRequestId),
       complete_(false) {
+  CHECK(injection_host_.get());
 }
 
 ScriptInjection::~ScriptInjection() {
@@ -126,7 +127,6 @@
 }
 
 bool ScriptInjection::TryToInject(UserScript::RunLocation current_location,
-                                  const InjectionHost* injection_host,
                                   ScriptsRunInfo* scripts_run_info) {
   if (current_location < run_location_)
     return false;  // Wait for the right location.
@@ -134,13 +134,14 @@
   if (request_id_ != kInvalidRequestId)
     return false;  // We're waiting for permission right now, try again later.
 
-  if (!injection_host) {
+  if (!injection_host_) {
     NotifyWillNotInject(ScriptInjector::EXTENSION_REMOVED);
     return true;  // We're done.
   }
 
-  switch (injector_->CanExecuteOnFrame(injection_host, web_frame_, tab_id_,
-                                       web_frame_->top()->document().url())) {
+  switch (injector_->CanExecuteOnFrame(
+      injection_host_.get(), web_frame_, tab_id_,
+      web_frame_->top()->document().url())) {
     case PermissionsData::ACCESS_DENIED:
       NotifyWillNotInject(ScriptInjector::NOT_ALLOWED);
       return true;  // We're done.
@@ -148,7 +149,7 @@
       SendInjectionMessage(true /* request permission */);
       return false;  // Wait around for permission.
     case PermissionsData::ACCESS_ALLOWED:
-      Inject(injection_host, scripts_run_info);
+      Inject(scripts_run_info);
       return true;  // We're done!
   }
 
@@ -156,17 +157,20 @@
   return false;
 }
 
-bool ScriptInjection::OnPermissionGranted(const InjectionHost* injection_host,
-                                          ScriptsRunInfo* scripts_run_info) {
-  if (!injection_host) {
+bool ScriptInjection::OnPermissionGranted(ScriptsRunInfo* scripts_run_info) {
+  if (!injection_host_) {
     NotifyWillNotInject(ScriptInjector::EXTENSION_REMOVED);
     return false;
   }
 
-  Inject(injection_host, scripts_run_info);
+  Inject(scripts_run_info);
   return true;
 }
 
+void ScriptInjection::OnHostRemoved() {
+  injection_host_.reset(nullptr);
+}
+
 void ScriptInjection::SendInjectionMessage(bool request_permission) {
   content::RenderView* render_view =
       content::RenderView::FromWebView(web_frame()->top()->view());
@@ -176,7 +180,7 @@
   request_id_ = request_permission ? g_next_pending_id++ : kInvalidRequestId;
   render_view->Send(new ExtensionHostMsg_RequestScriptInjectionPermission(
       render_view->GetRoutingID(),
-      host_id_.id(),
+      host_id().id(),
       injector_->script_type(),
       request_id_));
 }
@@ -187,13 +191,12 @@
   injector_->OnWillNotInject(reason);
 }
 
-void ScriptInjection::Inject(const InjectionHost* injection_host,
-                             ScriptsRunInfo* scripts_run_info) {
-  DCHECK(injection_host);
+void ScriptInjection::Inject(ScriptsRunInfo* scripts_run_info) {
+  DCHECK(injection_host_);
   DCHECK(scripts_run_info);
   DCHECK(!complete_);
 
-  if (injection_host->ShouldNotifyBrowserOfInjection())
+  if (injection_host_->ShouldNotifyBrowserOfInjection())
     SendInjectionMessage(false /* don't request permission */);
 
   std::vector<blink::WebFrame*> frame_vector;
@@ -226,13 +229,14 @@
     // Note: we don't consider ACCESS_WITHHELD because there is nowhere to
     // surface a request for a child frame.
     // TODO(rdevlin.cronin): We should ask for permission somehow.
-    if (injector_->CanExecuteOnFrame(injection_host, frame, tab_id_, top_url) ==
-        PermissionsData::ACCESS_DENIED) {
+    if (injector_->CanExecuteOnFrame(
+        injection_host_.get(), frame, tab_id_, top_url) ==
+            PermissionsData::ACCESS_DENIED) {
       DCHECK(frame->parent());
       continue;
     }
     if (inject_js)
-      InjectJs(injection_host, frame, execution_results.get());
+      InjectJs(frame, execution_results.get());
     if (inject_css)
       InjectCss(frame);
   }
@@ -245,20 +249,20 @@
                                  run_location_);
 }
 
-void ScriptInjection::InjectJs(const InjectionHost* injection_host,
-                               blink::WebLocalFrame* frame,
+void ScriptInjection::InjectJs(blink::WebLocalFrame* frame,
                                base::ListValue* execution_results) {
   std::vector<blink::WebScriptSource> sources =
       injector_->GetJsSources(run_location_);
   bool in_main_world = injector_->ShouldExecuteInMainWorld();
   int world_id = in_main_world
                      ? DOMActivityLogger::kMainWorldId
-                     : GetIsolatedWorldIdForInstance(injection_host, frame);
+                     : GetIsolatedWorldIdForInstance(injection_host_.get(),
+                                                     frame);
   bool expects_results = injector_->ExpectsResults();
 
   base::ElapsedTimer exec_timer;
-  if (injection_host->id().type() == HostID::EXTENSIONS)
-    DOMActivityLogger::AttachToWorld(world_id, injection_host->id().id());
+  if (injection_host_->id().type() == HostID::EXTENSIONS)
+    DOMActivityLogger::AttachToWorld(world_id, injection_host_->id().id());
   v8::HandleScope scope(v8::Isolate::GetCurrent());
   v8::Local<v8::Value> script_value;
   if (in_main_world) {
@@ -283,7 +287,7 @@
       script_value = (*results)[0];
   }
 
-  if (injection_host->id().type() == HostID::EXTENSIONS)
+  if (injection_host_->id().type() == HostID::EXTENSIONS)
     UMA_HISTOGRAM_TIMES("Extensions.InjectScriptTime", exec_timer.Elapsed());
 
   if (expects_results) {