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