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