| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/renderer/script_injection.h" | 5 #include "extensions/renderer/script_injection.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| 11 #include "base/timer/elapsed_timer.h" | 11 #include "base/timer/elapsed_timer.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "content/public/child/v8_value_converter.h" | 13 #include "content/public/child/v8_value_converter.h" |
| 14 #include "content/public/renderer/render_frame.h" | 14 #include "content/public/renderer/render_frame.h" |
| 15 #include "extensions/common/extension_messages.h" | 15 #include "extensions/common/extension_messages.h" |
| 16 #include "extensions/common/host_id.h" | 16 #include "extensions/common/host_id.h" |
| 17 #include "extensions/renderer/dom_activity_logger.h" | 17 #include "extensions/renderer/dom_activity_logger.h" |
| 18 #include "extensions/renderer/extension_frame_helper.h" |
| 18 #include "extensions/renderer/extension_groups.h" | 19 #include "extensions/renderer/extension_groups.h" |
| 19 #include "extensions/renderer/extensions_renderer_client.h" | 20 #include "extensions/renderer/extensions_renderer_client.h" |
| 20 #include "extensions/renderer/script_injection_callback.h" | 21 #include "extensions/renderer/script_injection_callback.h" |
| 21 #include "extensions/renderer/scripts_run_info.h" | 22 #include "extensions/renderer/scripts_run_info.h" |
| 22 #include "third_party/WebKit/public/platform/WebString.h" | 23 #include "third_party/WebKit/public/platform/WebString.h" |
| 23 #include "third_party/WebKit/public/web/WebDocument.h" | 24 #include "third_party/WebKit/public/web/WebDocument.h" |
| 24 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 25 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
| 25 #include "third_party/WebKit/public/web/WebScriptSource.h" | 26 #include "third_party/WebKit/public/web/WebScriptSource.h" |
| 26 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 27 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
| 27 #include "url/gurl.h" | 28 #include "url/gurl.h" |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 | 91 |
| 91 // static | 92 // static |
| 92 void ScriptInjection::RemoveIsolatedWorld(const std::string& host_id) { | 93 void ScriptInjection::RemoveIsolatedWorld(const std::string& host_id) { |
| 93 g_isolated_worlds.Get().erase(host_id); | 94 g_isolated_worlds.Get().erase(host_id); |
| 94 } | 95 } |
| 95 | 96 |
| 96 ScriptInjection::ScriptInjection( | 97 ScriptInjection::ScriptInjection( |
| 97 scoped_ptr<ScriptInjector> injector, | 98 scoped_ptr<ScriptInjector> injector, |
| 98 content::RenderFrame* render_frame, | 99 content::RenderFrame* render_frame, |
| 99 scoped_ptr<const InjectionHost> injection_host, | 100 scoped_ptr<const InjectionHost> injection_host, |
| 100 UserScript::RunLocation run_location, | 101 UserScript::RunLocation run_location) |
| 101 int tab_id) | |
| 102 : injector_(injector.Pass()), | 102 : injector_(injector.Pass()), |
| 103 render_frame_(render_frame), | 103 render_frame_(render_frame), |
| 104 injection_host_(injection_host.Pass()), | 104 injection_host_(injection_host.Pass()), |
| 105 run_location_(run_location), | 105 run_location_(run_location), |
| 106 tab_id_(tab_id), | |
| 107 request_id_(kInvalidRequestId), | 106 request_id_(kInvalidRequestId), |
| 108 complete_(false), | 107 complete_(false), |
| 109 did_inject_js_(false), | 108 did_inject_js_(false), |
| 110 weak_ptr_factory_(this) { | 109 weak_ptr_factory_(this) { |
| 111 CHECK(injection_host_.get()); | 110 CHECK(injection_host_.get()); |
| 112 } | 111 } |
| 113 | 112 |
| 114 ScriptInjection::~ScriptInjection() { | 113 ScriptInjection::~ScriptInjection() { |
| 115 if (!complete_) | 114 if (!complete_) |
| 116 injector_->OnWillNotInject(ScriptInjector::WONT_INJECT); | 115 injector_->OnWillNotInject(ScriptInjector::WONT_INJECT); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 128 return INJECTION_WAITING; | 127 return INJECTION_WAITING; |
| 129 } | 128 } |
| 130 | 129 |
| 131 if (!injection_host_) { | 130 if (!injection_host_) { |
| 132 NotifyWillNotInject(ScriptInjector::EXTENSION_REMOVED); | 131 NotifyWillNotInject(ScriptInjector::EXTENSION_REMOVED); |
| 133 return INJECTION_FINISHED; // We're done. | 132 return INJECTION_FINISHED; // We're done. |
| 134 } | 133 } |
| 135 | 134 |
| 136 blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame(); | 135 blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame(); |
| 137 switch (injector_->CanExecuteOnFrame( | 136 switch (injector_->CanExecuteOnFrame( |
| 138 injection_host_.get(), web_frame, tab_id_)) { | 137 injection_host_.get(), web_frame, |
| 138 ExtensionFrameHelper::Get(render_frame_)->tab_id())) { |
| 139 case PermissionsData::ACCESS_DENIED: | 139 case PermissionsData::ACCESS_DENIED: |
| 140 NotifyWillNotInject(ScriptInjector::NOT_ALLOWED); | 140 NotifyWillNotInject(ScriptInjector::NOT_ALLOWED); |
| 141 return INJECTION_FINISHED; // We're done. | 141 return INJECTION_FINISHED; // We're done. |
| 142 case PermissionsData::ACCESS_WITHHELD: | 142 case PermissionsData::ACCESS_WITHHELD: |
| 143 // Note: we don't consider ACCESS_WITHHELD for child frames because there | |
| 144 // is nowhere to surface a request for a child frame. | |
| 145 // TODO(devlin): We should ask for permission somehow. crbug.com/491402. | |
| 146 if (web_frame->parent()) { | |
| 147 NotifyWillNotInject(ScriptInjector::NOT_ALLOWED); | |
| 148 return INJECTION_FINISHED; | |
| 149 } | |
| 150 | |
| 151 SendInjectionMessage(true /* request permission */); | 143 SendInjectionMessage(true /* request permission */); |
| 152 return INJECTION_WAITING; // Wait around for permission. | 144 return INJECTION_WAITING; // Wait around for permission. |
| 153 case PermissionsData::ACCESS_ALLOWED: | 145 case PermissionsData::ACCESS_ALLOWED: |
| 154 InjectionResult result = Inject(scripts_run_info); | 146 InjectionResult result = Inject(scripts_run_info); |
| 155 // If the injection is blocked, we need to set the manager so we can | 147 // If the injection is blocked, we need to set the manager so we can |
| 156 // notify it upon completion. | 148 // notify it upon completion. |
| 157 if (result == INJECTION_BLOCKED) | 149 if (result == INJECTION_BLOCKED) |
| 158 async_completion_callback_ = async_completion_callback; | 150 async_completion_callback_ = async_completion_callback; |
| 159 return result; | 151 return result; |
| 160 } | 152 } |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 | 291 |
| 300 void ScriptInjection::InjectCss() { | 292 void ScriptInjection::InjectCss() { |
| 301 std::vector<std::string> css_sources = | 293 std::vector<std::string> css_sources = |
| 302 injector_->GetCssSources(run_location_); | 294 injector_->GetCssSources(run_location_); |
| 303 blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame(); | 295 blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame(); |
| 304 for (const std::string& css : css_sources) | 296 for (const std::string& css : css_sources) |
| 305 web_frame->document().insertStyleSheet(blink::WebString::fromUTF8(css)); | 297 web_frame->document().insertStyleSheet(blink::WebString::fromUTF8(css)); |
| 306 } | 298 } |
| 307 | 299 |
| 308 } // namespace extensions | 300 } // namespace extensions |
| OLD | NEW |