OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "extensions/renderer/runtime_custom_bindings.h" | 5 #include "extensions/renderer/runtime_custom_bindings.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/values.h" | 12 #include "base/values.h" |
13 #include "content/public/child/v8_value_converter.h" | 13 #include "content/public/child/v8_value_converter.h" |
14 #include "content/public/renderer/render_frame.h" | 14 #include "content/public/renderer/render_frame.h" |
15 #include "extensions/common/extension.h" | 15 #include "extensions/common/extension.h" |
16 #include "extensions/common/extension_messages.h" | 16 #include "extensions/common/extension_messages.h" |
17 #include "extensions/common/manifest.h" | 17 #include "extensions/common/manifest.h" |
18 #include "extensions/renderer/extension_frame_helper.h" | 18 #include "extensions/renderer/extension_frame_helper.h" |
19 #include "extensions/renderer/script_context.h" | 19 #include "extensions/renderer/script_context.h" |
20 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 20 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
21 | 21 |
22 namespace extensions { | 22 namespace extensions { |
23 | 23 |
24 RuntimeCustomBindings::RuntimeCustomBindings(ScriptContext* context) | 24 RuntimeCustomBindings::RuntimeCustomBindings(ScriptContext* context) |
25 : ObjectBackedNativeHandler(context) { | 25 : ObjectBackedNativeHandler(context) { |
26 RouteFunction( | 26 RouteFunction( |
27 "GetManifest", | 27 "GetManifest", |
28 base::Bind(&RuntimeCustomBindings::GetManifest, base::Unretained(this))); | 28 base::Bind(&RuntimeCustomBindings::GetManifest, base::Unretained(this))); |
29 RouteFunction("OpenChannelToExtension", "runtime.connect", | |
30 base::Bind(&RuntimeCustomBindings::OpenChannelToExtension, | |
31 base::Unretained(this))); | |
32 RouteFunction("OpenChannelToNativeApp", "runtime.connectNative", | |
33 base::Bind(&RuntimeCustomBindings::OpenChannelToNativeApp, | |
34 base::Unretained(this))); | |
35 RouteFunction("GetExtensionViews", | 29 RouteFunction("GetExtensionViews", |
36 base::Bind(&RuntimeCustomBindings::GetExtensionViews, | 30 base::Bind(&RuntimeCustomBindings::GetExtensionViews, |
37 base::Unretained(this))); | 31 base::Unretained(this))); |
38 } | 32 } |
39 | 33 |
40 RuntimeCustomBindings::~RuntimeCustomBindings() { | 34 RuntimeCustomBindings::~RuntimeCustomBindings() { |
41 } | 35 } |
42 | 36 |
43 void RuntimeCustomBindings::OpenChannelToExtension( | |
44 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
45 // Get the current RenderFrame so that we can send a routed IPC message from | |
46 // the correct source. | |
47 content::RenderFrame* renderframe = context()->GetRenderFrame(); | |
48 if (!renderframe) | |
49 return; | |
50 | |
51 // The Javascript code should validate/fill the arguments. | |
52 CHECK_EQ(args.Length(), 3); | |
53 CHECK(args[0]->IsString() && args[1]->IsString() && args[2]->IsBoolean()); | |
54 | |
55 ExtensionMsg_ExternalConnectionInfo info; | |
56 | |
57 // For messaging APIs, hosted apps should be considered a web page so hide | |
58 // its extension ID. | |
59 const Extension* extension = context()->extension(); | |
60 if (extension && !extension->is_hosted_app()) | |
61 info.source_id = extension->id(); | |
62 | |
63 info.target_id = *v8::String::Utf8Value(args[0]); | |
64 info.source_url = context()->url(); | |
65 std::string channel_name = *v8::String::Utf8Value(args[1]); | |
66 bool include_tls_channel_id = | |
67 args.Length() > 2 ? args[2]->BooleanValue() : false; | |
68 int port_id = -1; | |
69 // TODO(devlin): This file is littered with sync IPCs. Yuck. | |
70 renderframe->Send(new ExtensionHostMsg_OpenChannelToExtension( | |
71 renderframe->GetRoutingID(), info, channel_name, include_tls_channel_id, | |
72 &port_id)); | |
73 args.GetReturnValue().Set(static_cast<int32_t>(port_id)); | |
74 } | |
75 | |
76 void RuntimeCustomBindings::OpenChannelToNativeApp( | |
77 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
78 // The Javascript code should validate/fill the arguments. | |
79 CHECK_EQ(args.Length(), 1); | |
80 CHECK(args[0]->IsString()); | |
81 | |
82 // Verify that the extension has permission to use native messaging. | |
83 if (!context()->GetAvailability("runtime.connectNative").is_available()) | |
84 return; | |
85 | |
86 content::RenderFrame* render_frame = context()->GetRenderFrame(); | |
87 if (!render_frame) | |
88 return; | |
89 | |
90 std::string native_app_name = *v8::String::Utf8Value(args[0]); | |
91 | |
92 int port_id = -1; | |
93 render_frame->Send(new ExtensionHostMsg_OpenChannelToNativeApp( | |
94 render_frame->GetRoutingID(), native_app_name, &port_id)); | |
95 args.GetReturnValue().Set(static_cast<int32_t>(port_id)); | |
96 } | |
97 | |
98 void RuntimeCustomBindings::GetManifest( | 37 void RuntimeCustomBindings::GetManifest( |
99 const v8::FunctionCallbackInfo<v8::Value>& args) { | 38 const v8::FunctionCallbackInfo<v8::Value>& args) { |
100 CHECK(context()->extension()); | 39 CHECK(context()->extension()); |
101 | 40 |
102 std::unique_ptr<content::V8ValueConverter> converter( | 41 std::unique_ptr<content::V8ValueConverter> converter( |
103 content::V8ValueConverter::create()); | 42 content::V8ValueConverter::create()); |
104 args.GetReturnValue().Set(converter->ToV8Value( | 43 args.GetReturnValue().Set(converter->ToV8Value( |
105 context()->extension()->manifest()->value(), context()->v8_context())); | 44 context()->extension()->manifest()->value(), context()->v8_context())); |
106 } | 45 } |
107 | 46 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 v8::Maybe<bool> maybe = | 108 v8::Maybe<bool> maybe = |
170 v8_views->CreateDataProperty(v8_context, v8_index++, window); | 109 v8_views->CreateDataProperty(v8_context, v8_index++, window); |
171 CHECK(maybe.IsJust() && maybe.FromJust()); | 110 CHECK(maybe.IsJust() && maybe.FromJust()); |
172 } | 111 } |
173 } | 112 } |
174 | 113 |
175 args.GetReturnValue().Set(v8_views); | 114 args.GetReturnValue().Set(v8_views); |
176 } | 115 } |
177 | 116 |
178 } // namespace extensions | 117 } // namespace extensions |
OLD | NEW |