Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Side by Side Diff: extensions/renderer/native_extension_bindings_system.cc

Issue 2598123002: [Extensions Bindings] Add support for updateArgumentsPreValidate (Closed)
Patch Set: rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/native_extension_bindings_system.h" 5 #include "extensions/renderer/native_extension_bindings_system.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "content/public/common/content_switches.h" 9 #include "content/public/common/content_switches.h"
10 #include "extensions/common/constants.h" 10 #include "extensions/common/constants.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 void CallJsFunction(v8::Local<v8::Function> function, 75 void CallJsFunction(v8::Local<v8::Function> function,
76 v8::Local<v8::Context> context, 76 v8::Local<v8::Context> context,
77 int argc, 77 int argc,
78 v8::Local<v8::Value> argv[]) { 78 v8::Local<v8::Value> argv[]) {
79 ScriptContext* script_context = 79 ScriptContext* script_context =
80 ScriptContextSet::GetContextByV8Context(context); 80 ScriptContextSet::GetContextByV8Context(context);
81 CHECK(script_context); 81 CHECK(script_context);
82 script_context->SafeCallFunction(function, argc, argv); 82 script_context->SafeCallFunction(function, argc, argv);
83 } 83 }
84 84
85 // A helper class for calling JS function synchronously.
86 class CallJsSyncHelper {
87 public:
88 CallJsSyncHelper(v8::Isolate* isolate) : isolate_(isolate),
89 weak_factory_(this) {}
90 ~CallJsSyncHelper() {}
91
92 ScriptInjectionCallback::CompleteCallback GetCallback() {
93 return base::Bind(&CallJsSyncHelper::OnJsComplete,
94 weak_factory_.GetWeakPtr());
95 }
96
97 bool did_complete() const { return did_complete_; }
98 v8::Global<v8::Value> take_result() { return std::move(result_); }
99
100 private:
101 void OnJsComplete(const std::vector<v8::Local<v8::Value>>& results) {
102 did_complete_ = true;
103 // The locals are released after the callback is executed, so we need to
104 // grab a persistent handle.
105 if (!results.empty() && !results[0].IsEmpty())
106 result_.Reset(isolate_, results[0]);
107 }
108
109 bool did_complete_ = false;
110 v8::Isolate* isolate_;
111 v8::Global<v8::Value> result_;
112 base::WeakPtrFactory<CallJsSyncHelper> weak_factory_;
113
114 DISALLOW_COPY_AND_ASSIGN(CallJsSyncHelper);
115 };
116
117 v8::Global<v8::Value> CallJsFunctionSync(v8::Local<v8::Function> function,
118 v8::Local<v8::Context> context,
119 int argc,
120 v8::Local<v8::Value> argv[]) {
121 CallJsSyncHelper helper(context->GetIsolate());
122 ScriptContext* script_context =
123 ScriptContextSet::GetContextByV8Context(context);
124 CHECK(script_context);
125 script_context->SafeCallFunction(function, argc, argv, helper.GetCallback());
jbroman 2017/01/02 19:46:38 WDYT of this, which seems to do the same but be so
Devlin 2017/01/04 17:57:02 I like it. Done. I've also added a TODO to expre
126 // If the JS did not, in fact, execute synchronously, there's a big problem.
127 CHECK(helper.did_complete());
128 return helper.take_result();
129 }
130
85 // Returns the API schema indicated by |api_name|. 131 // Returns the API schema indicated by |api_name|.
86 const base::DictionaryValue& GetAPISchema(const std::string& api_name) { 132 const base::DictionaryValue& GetAPISchema(const std::string& api_name) {
87 const base::DictionaryValue* schema = 133 const base::DictionaryValue* schema =
88 ExtensionAPI::GetSharedInstance()->GetSchema(api_name); 134 ExtensionAPI::GetSharedInstance()->GetSchema(api_name);
89 CHECK(schema); 135 CHECK(schema);
90 return *schema; 136 return *schema;
91 } 137 }
92 138
93 // Returns true if the method specified by |method_name| is available to the 139 // Returns true if the method specified by |method_name| is available to the
94 // given |context|. 140 // given |context|.
95 bool IsAPIMethodAvailable(ScriptContext* context, 141 bool IsAPIMethodAvailable(ScriptContext* context,
96 const std::string& method_name) { 142 const std::string& method_name) {
97 return context->GetAvailability(method_name).is_available(); 143 return context->GetAvailability(method_name).is_available();
98 } 144 }
99 145
100 } // namespace 146 } // namespace
101 147
102 NativeExtensionBindingsSystem::NativeExtensionBindingsSystem( 148 NativeExtensionBindingsSystem::NativeExtensionBindingsSystem(
103 const SendIPCMethod& send_ipc) 149 const SendIPCMethod& send_ipc)
104 : send_ipc_(send_ipc), 150 : send_ipc_(send_ipc),
105 api_system_(base::Bind(&CallJsFunction), 151 api_system_(base::Bind(&CallJsFunction),
152 base::Bind(&CallJsFunctionSync),
106 base::Bind(&GetAPISchema), 153 base::Bind(&GetAPISchema),
107 base::Bind(&NativeExtensionBindingsSystem::SendRequest, 154 base::Bind(&NativeExtensionBindingsSystem::SendRequest,
108 base::Unretained(this))), 155 base::Unretained(this))),
109 weak_factory_(this) {} 156 weak_factory_(this) {}
110 157
111 NativeExtensionBindingsSystem::~NativeExtensionBindingsSystem() {} 158 NativeExtensionBindingsSystem::~NativeExtensionBindingsSystem() {}
112 159
113 void NativeExtensionBindingsSystem::DidCreateScriptContext( 160 void NativeExtensionBindingsSystem::DidCreateScriptContext(
114 ScriptContext* context) {} 161 ScriptContext* context) {}
115 162
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 params.has_callback = request->has_callback; 337 params.has_callback = request->has_callback;
291 params.user_gesture = request->has_user_gesture; 338 params.user_gesture = request->has_user_gesture;
292 // TODO(devlin): Make this work in ServiceWorkers. 339 // TODO(devlin): Make this work in ServiceWorkers.
293 params.worker_thread_id = -1; 340 params.worker_thread_id = -1;
294 params.service_worker_version_id = kInvalidServiceWorkerVersionId; 341 params.service_worker_version_id = kInvalidServiceWorkerVersionId;
295 342
296 send_ipc_.Run(script_context, params); 343 send_ipc_.Run(script_context, params);
297 } 344 }
298 345
299 } // namespace extensions 346 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698