kMaxBlockSize -> kMaxHeaderBlockSize to avoid shadowing warning on VS2015
[chromium-blink-merge.git] / extensions / renderer / programmatic_script_injector.cc
blobfc7b72bf077aba53f9e1141874911df67bef6f86
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
3 // found in the LICENSE file.
5 #include "extensions/renderer/programmatic_script_injector.h"
7 #include <vector>
9 #include "base/values.h"
10 #include "content/public/renderer/render_view.h"
11 #include "extensions/common/error_utils.h"
12 #include "extensions/common/extension.h"
13 #include "extensions/common/extension_messages.h"
14 #include "extensions/common/manifest_constants.h"
15 #include "extensions/common/permissions/permissions_data.h"
16 #include "extensions/renderer/script_context.h"
17 #include "third_party/WebKit/public/platform/WebString.h"
18 #include "third_party/WebKit/public/web/WebDocument.h"
19 #include "third_party/WebKit/public/web/WebFrame.h"
20 #include "third_party/WebKit/public/web/WebScriptSource.h"
22 namespace extensions {
24 ProgrammaticScriptInjector::ProgrammaticScriptInjector(
25 const ExtensionMsg_ExecuteCode_Params& params,
26 blink::WebFrame* web_frame)
27 : params_(new ExtensionMsg_ExecuteCode_Params(params)),
28 url_(ScriptContext::GetDataSourceURLForFrame(web_frame)),
29 render_view_(content::RenderView::FromWebView(web_frame->view())),
30 results_(new base::ListValue()),
31 finished_(false) {
34 ProgrammaticScriptInjector::~ProgrammaticScriptInjector() {
37 UserScript::InjectionType ProgrammaticScriptInjector::script_type()
38 const {
39 return UserScript::PROGRAMMATIC_SCRIPT;
42 bool ProgrammaticScriptInjector::ShouldExecuteInChildFrames() const {
43 return params_->all_frames;
46 bool ProgrammaticScriptInjector::ShouldExecuteInMainWorld() const {
47 return params_->in_main_world;
50 bool ProgrammaticScriptInjector::IsUserGesture() const {
51 return params_->user_gesture;
54 bool ProgrammaticScriptInjector::ExpectsResults() const {
55 return params_->wants_result;
58 bool ProgrammaticScriptInjector::ShouldInjectJs(
59 UserScript::RunLocation run_location) const {
60 return GetRunLocation() == run_location && params_->is_javascript;
63 bool ProgrammaticScriptInjector::ShouldInjectCss(
64 UserScript::RunLocation run_location) const {
65 return GetRunLocation() == run_location && !params_->is_javascript;
68 PermissionsData::AccessType ProgrammaticScriptInjector::CanExecuteOnFrame(
69 const Extension* extension,
70 blink::WebFrame* frame,
71 int tab_id,
72 const GURL& top_url) const {
73 GURL effective_document_url = ScriptContext::GetEffectiveDocumentURL(
74 frame, frame->document().url(), params_->match_about_blank);
75 if (params_->is_web_view) {
76 if (frame->parent()) {
77 // This is a subframe inside <webview>, so allow it.
78 return PermissionsData::ACCESS_ALLOWED;
81 return effective_document_url == params_->webview_src
82 ? PermissionsData::ACCESS_ALLOWED
83 : PermissionsData::ACCESS_DENIED;
86 return extension->permissions_data()->GetPageAccess(extension,
87 effective_document_url,
88 top_url,
89 tab_id,
90 -1, // no process ID.
91 NULL /* ignore error */);
94 std::vector<blink::WebScriptSource> ProgrammaticScriptInjector::GetJsSources(
95 UserScript::RunLocation run_location) const {
96 DCHECK_EQ(GetRunLocation(), run_location);
97 DCHECK(params_->is_javascript);
99 return std::vector<blink::WebScriptSource>(
101 blink::WebScriptSource(
102 blink::WebString::fromUTF8(params_->code), params_->file_url));
105 std::vector<std::string> ProgrammaticScriptInjector::GetCssSources(
106 UserScript::RunLocation run_location) const {
107 DCHECK_EQ(GetRunLocation(), run_location);
108 DCHECK(!params_->is_javascript);
110 return std::vector<std::string>(1, params_->code);
113 void ProgrammaticScriptInjector::OnInjectionComplete(
114 scoped_ptr<base::ListValue> execution_results,
115 ScriptsRunInfo* scripts_run_info,
116 UserScript::RunLocation run_location) {
117 results_ = execution_results.Pass();
118 Finish(std::string());
121 void ProgrammaticScriptInjector::OnWillNotInject(InjectFailureReason reason) {
122 std::string error;
123 switch (reason) {
124 case NOT_ALLOWED:
125 error = ErrorUtils::FormatErrorMessage(manifest_errors::kCannotAccessPage,
126 url_.spec());
127 break;
128 case EXTENSION_REMOVED: // no special error here.
129 case WONT_INJECT:
130 break;
132 Finish(error);
135 UserScript::RunLocation ProgrammaticScriptInjector::GetRunLocation() const {
136 return static_cast<UserScript::RunLocation>(params_->run_at);
139 void ProgrammaticScriptInjector::Finish(const std::string& error) {
140 DCHECK(!finished_);
141 finished_ = true;
143 render_view_->Send(new ExtensionHostMsg_ExecuteCodeFinished(
144 render_view_->GetRoutingID(),
145 params_->request_id,
146 error,
147 url_,
148 *results_));
151 } // namespace extensions