OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/renderer/extensions/app_bindings.h" | 5 #include "chrome/renderer/extensions/app_bindings.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/string16.h" | 8 #include "base/string16.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 if (!IsCheckoutURL(frame->document().url().spec())) { | 44 if (!IsCheckoutURL(frame->document().url().spec())) { |
45 std::string error("Access denied for URL: "); | 45 std::string error("Access denied for URL: "); |
46 error += frame->document().url().spec(); | 46 error += frame->document().url().spec(); |
47 v8::ThrowException(v8::String::New(error.c_str())); | 47 v8::ThrowException(v8::String::New(error.c_str())); |
48 return false; | 48 return false; |
49 } | 49 } |
50 | 50 |
51 return true; | 51 return true; |
52 } | 52 } |
53 | 53 |
54 const char* kMissingClientIdError = "Missing clientId parameter"; | |
55 const char* kInvalidClientIdError = "Invalid clientId"; | |
56 const char* kInvalidCallbackIdError = "Invalid callbackId"; | 54 const char* kInvalidCallbackIdError = "Invalid callbackId"; |
57 | 55 |
58 } // namespace | 56 } // namespace |
59 | 57 |
60 AppBindings::AppBindings(Dispatcher* dispatcher, ChromeV8Context* context) | 58 AppBindings::AppBindings(Dispatcher* dispatcher, ChromeV8Context* context) |
61 : ChromeV8Extension(dispatcher, context->v8_context()), | 59 : ChromeV8Extension(dispatcher, context->v8_context()), |
62 ChromeV8ExtensionHandler(context) { | 60 ChromeV8ExtensionHandler(context) { |
63 RouteFunction("GetIsInstalled", | 61 RouteFunction("GetIsInstalled", |
64 base::Bind(&AppBindings::GetIsInstalled, base::Unretained(this))); | 62 base::Bind(&AppBindings::GetIsInstalled, base::Unretained(this))); |
65 RouteFunction("Install", | 63 RouteFunction("Install", |
66 base::Bind(&AppBindings::Install, base::Unretained(this))); | 64 base::Bind(&AppBindings::Install, base::Unretained(this))); |
67 RouteFunction("GetDetails", | 65 RouteFunction("GetDetails", |
68 base::Bind(&AppBindings::GetDetails, base::Unretained(this))); | 66 base::Bind(&AppBindings::GetDetails, base::Unretained(this))); |
69 RouteFunction("GetDetailsForFrame", | 67 RouteFunction("GetDetailsForFrame", |
70 base::Bind(&AppBindings::GetDetailsForFrame, base::Unretained(this))); | 68 base::Bind(&AppBindings::GetDetailsForFrame, base::Unretained(this))); |
71 RouteFunction("GetAppNotifyChannel", | |
72 base::Bind(&AppBindings::GetAppNotifyChannel, base::Unretained(this))); | |
73 RouteFunction("GetInstallState", | 69 RouteFunction("GetInstallState", |
74 base::Bind(&AppBindings::GetInstallState, base::Unretained(this))); | 70 base::Bind(&AppBindings::GetInstallState, base::Unretained(this))); |
75 RouteFunction("GetRunningState", | 71 RouteFunction("GetRunningState", |
76 base::Bind(&AppBindings::GetRunningState, base::Unretained(this))); | 72 base::Bind(&AppBindings::GetRunningState, base::Unretained(this))); |
77 } | 73 } |
78 | 74 |
79 v8::Handle<v8::Value> AppBindings::GetIsInstalled( | 75 v8::Handle<v8::Value> AppBindings::GetIsInstalled( |
80 const v8::Arguments& args) { | 76 const v8::Arguments& args) { |
81 const Extension* extension = context_->extension(); | 77 const Extension* extension = context_->extension(); |
82 | 78 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 return v8::Null(); | 139 return v8::Null(); |
144 | 140 |
145 scoped_ptr<DictionaryValue> manifest_copy( | 141 scoped_ptr<DictionaryValue> manifest_copy( |
146 extension->manifest()->value()->DeepCopy()); | 142 extension->manifest()->value()->DeepCopy()); |
147 manifest_copy->SetString("id", extension->id()); | 143 manifest_copy->SetString("id", extension->id()); |
148 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); | 144 scoped_ptr<V8ValueConverter> converter(V8ValueConverter::create()); |
149 return converter->ToV8Value(manifest_copy.get(), | 145 return converter->ToV8Value(manifest_copy.get(), |
150 frame->mainWorldScriptContext()); | 146 frame->mainWorldScriptContext()); |
151 } | 147 } |
152 | 148 |
153 v8::Handle<v8::Value> AppBindings::GetAppNotifyChannel( | |
154 const v8::Arguments& args) { | |
155 // Read the required 'clientId' value out of the object at args[0]. | |
156 std::string client_id; | |
157 if (args.Length() < 1 || !args[0]->IsObject()) { | |
158 v8::ThrowException(v8::String::New(kMissingClientIdError)); | |
159 return v8::Undefined(); | |
160 } | |
161 v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(args[0]); | |
162 v8::Local<v8::String> client_id_key = v8::String::New("clientId"); | |
163 if (obj->Has(client_id_key)) { | |
164 v8::String::Utf8Value id_value(obj->Get(client_id_key)); | |
165 if (id_value.length() > 0) | |
166 client_id = std::string(*id_value); | |
167 } | |
168 if (client_id.empty()) { | |
169 v8::ThrowException(v8::String::New(kInvalidClientIdError)); | |
170 return v8::Undefined(); | |
171 } | |
172 | |
173 // Get the callbackId if specified. | |
174 int callback_id = 0; | |
175 if (args.Length() > 1) { | |
176 if (!args[1]->IsInt32()) { | |
177 v8::ThrowException(v8::String::New(kInvalidCallbackIdError)); | |
178 return v8::Undefined(); | |
179 } | |
180 callback_id = args[1]->Int32Value(); | |
181 } | |
182 | |
183 content::RenderView* render_view = context_->GetRenderView(); | |
184 CHECK(render_view); | |
185 | |
186 Send(new ExtensionHostMsg_GetAppNotifyChannel( | |
187 render_view->GetRoutingID(), context_->web_frame()->document().url(), | |
188 client_id, GetRoutingID(), callback_id)); | |
189 return v8::Undefined(); | |
190 } | |
191 | |
192 v8::Handle<v8::Value> AppBindings::GetInstallState(const v8::Arguments& args) { | 149 v8::Handle<v8::Value> AppBindings::GetInstallState(const v8::Arguments& args) { |
193 // Get the callbackId. | 150 // Get the callbackId. |
194 int callback_id = 0; | 151 int callback_id = 0; |
195 if (args.Length() == 1) { | 152 if (args.Length() == 1) { |
196 if (!args[0]->IsInt32()) { | 153 if (!args[0]->IsInt32()) { |
197 v8::ThrowException(v8::String::New(kInvalidCallbackIdError)); | 154 v8::ThrowException(v8::String::New(kInvalidCallbackIdError)); |
198 return v8::Undefined(); | 155 return v8::Undefined(); |
199 } | 156 } |
200 callback_id = args[0]->Int32Value(); | 157 callback_id = args[0]->Int32Value(); |
201 } | 158 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 state = extension_misc::kAppStateReadyToRun; | 196 state = extension_misc::kAppStateReadyToRun; |
240 } else { | 197 } else { |
241 state = extension_misc::kAppStateCannotRun; | 198 state = extension_misc::kAppStateCannotRun; |
242 } | 199 } |
243 | 200 |
244 return v8::String::New(state); | 201 return v8::String::New(state); |
245 } | 202 } |
246 | 203 |
247 bool AppBindings::OnMessageReceived(const IPC::Message& message) { | 204 bool AppBindings::OnMessageReceived(const IPC::Message& message) { |
248 IPC_BEGIN_MESSAGE_MAP(AppBindings, message) | 205 IPC_BEGIN_MESSAGE_MAP(AppBindings, message) |
249 IPC_MESSAGE_HANDLER(ExtensionMsg_GetAppNotifyChannelResponse, | |
250 OnGetAppNotifyChannelResponse) | |
251 IPC_MESSAGE_HANDLER(ExtensionMsg_GetAppInstallStateResponse, | 206 IPC_MESSAGE_HANDLER(ExtensionMsg_GetAppInstallStateResponse, |
252 OnAppInstallStateResponse) | 207 OnAppInstallStateResponse) |
253 IPC_MESSAGE_UNHANDLED(CHECK(false) << "Unhandled IPC message") | 208 IPC_MESSAGE_UNHANDLED(CHECK(false) << "Unhandled IPC message") |
254 IPC_END_MESSAGE_MAP() | 209 IPC_END_MESSAGE_MAP() |
255 return true; | 210 return true; |
256 } | 211 } |
257 | 212 |
258 void AppBindings::OnGetAppNotifyChannelResponse( | |
259 const std::string& channel_id, const std::string& error, int callback_id) { | |
260 v8::HandleScope handle_scope; | |
261 v8::Context::Scope context_scope(context_->v8_context()); | |
262 v8::Handle<v8::Value> argv[3]; | |
263 argv[0] = v8::String::New(channel_id.c_str()); | |
264 argv[1] = v8::String::New(error.c_str()); | |
265 argv[2] = v8::Integer::New(callback_id); | |
266 CHECK(context_->CallChromeHiddenMethod("app.onGetAppNotifyChannelResponse", | |
267 arraysize(argv), argv, NULL)); | |
268 } | |
269 | |
270 void AppBindings::OnAppInstallStateResponse( | 213 void AppBindings::OnAppInstallStateResponse( |
271 const std::string& state, int callback_id) { | 214 const std::string& state, int callback_id) { |
272 v8::HandleScope handle_scope; | 215 v8::HandleScope handle_scope; |
273 v8::Context::Scope context_scope(context_->v8_context()); | 216 v8::Context::Scope context_scope(context_->v8_context()); |
274 v8::Handle<v8::Value> argv[2]; | 217 v8::Handle<v8::Value> argv[2]; |
275 argv[0] = v8::String::New(state.c_str()); | 218 argv[0] = v8::String::New(state.c_str()); |
276 argv[1] = v8::Integer::New(callback_id); | 219 argv[1] = v8::Integer::New(callback_id); |
277 CHECK(context_->CallChromeHiddenMethod("app.onInstallStateResponse", | 220 CHECK(context_->CallChromeHiddenMethod("app.onInstallStateResponse", |
278 arraysize(argv), argv, NULL)); | 221 arraysize(argv), argv, NULL)); |
279 } | 222 } |
280 | 223 |
281 } // namespace extensions | 224 } // namespace extensions |
OLD | NEW |