1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/renderer/programmatic_script_injector.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/values.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/renderer/render_view.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/error_utils.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension_messages.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/manifest_constants.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/permissions/permissions_data.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/renderer/script_context.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/platform/WebString.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/web/WebDocument.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/web/WebFrame.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/web/WebScriptSource.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace extensions { 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24116680a4aac90f2aa7413d9095a592090648e557Ben MurdochProgrammaticScriptInjector::ProgrammaticScriptInjector( 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ExtensionMsg_ExecuteCode_Params& params, 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebFrame* web_frame) 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : params_(new ExtensionMsg_ExecuteCode_Params(params)), 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_(ScriptContext::GetDataSourceURLForFrame(web_frame)), 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_(content::RenderView::FromWebView(web_frame->view())), 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch results_(new base::ListValue()), 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch finished_(false) { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34116680a4aac90f2aa7413d9095a592090648e557Ben MurdochProgrammaticScriptInjector::~ProgrammaticScriptInjector() { 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserScript::InjectionType ProgrammaticScriptInjector::script_type() 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return UserScript::PROGRAMMATIC_SCRIPT; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProgrammaticScriptInjector::ShouldExecuteInChildFrames() const { 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return params_->all_frames; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProgrammaticScriptInjector::ShouldExecuteInMainWorld() const { 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return params_->in_main_world; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProgrammaticScriptInjector::IsUserGesture() const { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return params_->user_gesture; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProgrammaticScriptInjector::ExpectsResults() const { 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return params_->wants_result; 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProgrammaticScriptInjector::ShouldInjectJs( 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserScript::RunLocation run_location) const { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetRunLocation() == run_location && params_->is_javascript; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ProgrammaticScriptInjector::ShouldInjectCss( 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserScript::RunLocation run_location) const { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GetRunLocation() == run_location && !params_->is_javascript; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68116680a4aac90f2aa7413d9095a592090648e557Ben MurdochPermissionsData::AccessType ProgrammaticScriptInjector::CanExecuteOnFrame( 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebFrame* frame, 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int tab_id, 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& top_url) const { 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL effective_document_url = ScriptContext::GetEffectiveDocumentURL( 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame, frame->document().url(), params_->match_about_blank); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (params_->is_web_view) { 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return effective_document_url == params_->webview_src 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ? PermissionsData::ACCESS_ALLOWED 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : PermissionsData::ACCESS_DENIED; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return extension->permissions_data()->GetPageAccess(extension, 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch effective_document_url, 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch top_url, 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tab_id, 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch -1, // no process ID. 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NULL /* ignore error */); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::vector<blink::WebScriptSource> ProgrammaticScriptInjector::GetJsSources( 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserScript::RunLocation run_location) const { 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(GetRunLocation(), run_location); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(params_->is_javascript); 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return std::vector<blink::WebScriptSource>( 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1, 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebScriptSource( 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebString::fromUTF8(params_->code), params_->file_url)); 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::vector<std::string> ProgrammaticScriptInjector::GetCssSources( 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserScript::RunLocation run_location) const { 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(GetRunLocation(), run_location); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!params_->is_javascript); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return std::vector<std::string>(1, params_->code); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ProgrammaticScriptInjector::OnInjectionComplete( 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::ListValue> execution_results, 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScriptsRunInfo* scripts_run_info, 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UserScript::RunLocation run_location) { 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch results_ = execution_results.Pass(); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Finish(std::string()); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ProgrammaticScriptInjector::OnWillNotInject(InjectFailureReason reason) { 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string error; 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (reason) { 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case NOT_ALLOWED: 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch error = ErrorUtils::FormatErrorMessage(manifest_errors::kCannotAccessPage, 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_.spec()); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case EXTENSION_REMOVED: // no special error here. 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WONT_INJECT: 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Finish(error); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUserScript::RunLocation ProgrammaticScriptInjector::GetRunLocation() const { 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return static_cast<UserScript::RunLocation>(params_->run_at); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ProgrammaticScriptInjector::Finish(const std::string& error) { 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!finished_); 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch finished_ = true; 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_->Send(new ExtensionHostMsg_ExecuteCodeFinished( 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_view_->GetRoutingID(), 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch params_->request_id, 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch error, 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_, 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch *results_)); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace extensions 147