1// Copyright (c) 2013 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.
4
5#include "chrome/browser/extensions/api/webview/webview_api.h"
6
7#include "chrome/browser/extensions/tab_helper.h"
8#include "chrome/browser/guestview/webview/webview_guest.h"
9#include "chrome/common/extensions/api/webview.h"
10#include "content/public/browser/render_process_host.h"
11#include "content/public/browser/render_view_host.h"
12#include "content/public/browser/user_metrics.h"
13#include "content/public/browser/web_contents.h"
14#include "extensions/common/error_utils.h"
15
16using extensions::api::tabs::InjectDetails;
17
18WebviewExecuteCodeFunction::WebviewExecuteCodeFunction()
19    : guest_instance_id_(0) {
20}
21
22WebviewExecuteCodeFunction::~WebviewExecuteCodeFunction() {
23}
24
25bool WebviewExecuteCodeFunction::Init() {
26  if (details_.get())
27    return true;
28
29  if (!args_->GetInteger(0, &guest_instance_id_))
30    return false;
31
32  if (!guest_instance_id_)
33    return false;
34
35  base::DictionaryValue* details_value = NULL;
36  if (!args_->GetDictionary(1, &details_value))
37    return false;
38  scoped_ptr<InjectDetails> details(new InjectDetails());
39  if (!InjectDetails::Populate(*details_value, details.get()))
40    return false;
41
42  details_ = details.Pass();
43  return true;
44}
45
46bool WebviewExecuteCodeFunction::ShouldInsertCSS() const {
47  return false;
48}
49
50bool WebviewExecuteCodeFunction::CanExecuteScriptOnPage() {
51  return true;
52}
53
54extensions::ScriptExecutor* WebviewExecuteCodeFunction::GetScriptExecutor() {
55  WebViewGuest* guest = WebViewGuest::From(
56      render_view_host()->GetProcess()->GetID(), guest_instance_id_);
57  if (!guest)
58    return NULL;
59
60  return guest->script_executor();
61}
62
63bool WebviewExecuteCodeFunction::IsWebView() const {
64  return true;
65}
66
67WebviewExecuteScriptFunction::WebviewExecuteScriptFunction() {
68}
69
70void WebviewExecuteScriptFunction::OnExecuteCodeFinished(
71    const std::string& error,
72    int32 on_page_id,
73    const GURL& on_url,
74    const base::ListValue& result) {
75  content::RecordAction(content::UserMetricsAction("WebView.ExecuteScript"));
76  if (error.empty())
77    SetResult(result.DeepCopy());
78  WebviewExecuteCodeFunction::OnExecuteCodeFinished(error, on_page_id, on_url,
79                                                    result);
80}
81
82WebviewInsertCSSFunction::WebviewInsertCSSFunction() {
83}
84
85bool WebviewInsertCSSFunction::ShouldInsertCSS() const {
86  return true;
87}
88
89WebviewGoFunction::WebviewGoFunction() {
90}
91
92WebviewGoFunction::~WebviewGoFunction() {
93}
94
95bool WebviewGoFunction::RunImpl() {
96  int instance_id = 0;
97  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &instance_id));
98
99  int relative_index = 0;
100  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &relative_index));
101
102  WebViewGuest* guest = WebViewGuest::From(
103      render_view_host()->GetProcess()->GetID(), instance_id);
104  if (!guest)
105    return false;
106
107  guest->Go(relative_index);
108  return true;
109}
110
111WebviewReloadFunction::WebviewReloadFunction() {
112}
113
114WebviewReloadFunction::~WebviewReloadFunction() {
115}
116
117bool WebviewReloadFunction::RunImpl() {
118  int instance_id = 0;
119  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &instance_id));
120
121  WebViewGuest* guest = WebViewGuest::From(
122      render_view_host()->GetProcess()->GetID(), instance_id);
123  if (!guest)
124    return false;
125
126  guest->Reload();
127  return true;
128}
129
130WebviewSetPermissionFunction::WebviewSetPermissionFunction() {
131}
132
133WebviewSetPermissionFunction::~WebviewSetPermissionFunction() {
134}
135
136bool WebviewSetPermissionFunction::RunImpl() {
137  int instance_id = 0;
138  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &instance_id));
139
140  int request_id = 0;
141  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &request_id));
142
143  bool should_allow = false;
144  EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(2, &should_allow));
145
146  std::string user_input;
147  EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &user_input));
148
149  WebViewGuest* guest = WebViewGuest::From(
150      render_view_host()->GetProcess()->GetID(), instance_id);
151  if (!guest)
152    return false;
153
154  EXTENSION_FUNCTION_VALIDATE(
155      guest->SetPermission(request_id, should_allow, user_input));
156  return true;
157}
158
159WebviewStopFunction::WebviewStopFunction() {
160}
161
162WebviewStopFunction::~WebviewStopFunction() {
163}
164
165bool WebviewStopFunction::RunImpl() {
166  int instance_id = 0;
167  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &instance_id));
168
169  WebViewGuest* guest = WebViewGuest::From(
170      render_view_host()->GetProcess()->GetID(), instance_id);
171  if (!guest)
172    return false;
173
174  guest->Stop();
175  return true;
176}
177
178WebviewTerminateFunction::WebviewTerminateFunction() {
179}
180
181WebviewTerminateFunction::~WebviewTerminateFunction() {
182}
183
184bool WebviewTerminateFunction::RunImpl() {
185  int instance_id = 0;
186  EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &instance_id));
187
188  WebViewGuest* guest = WebViewGuest::From(
189      render_view_host()->GetProcess()->GetID(), instance_id);
190  if (!guest)
191    return false;
192
193  guest->Terminate();
194  return true;
195}
196