Index: content/renderer/mojo/interface_provider_js_wrapper.cc |
diff --git a/content/renderer/mojo/interface_provider_js_wrapper.cc b/content/renderer/mojo/interface_provider_js_wrapper.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1ced038009d02ec9940abf120630ed88d09b4650 |
--- /dev/null |
+++ b/content/renderer/mojo/interface_provider_js_wrapper.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/mojo/interface_provider_js_wrapper.h" |
+ |
+#include <memory> |
+#include <utility> |
+ |
+#include "content/common/mojo/service_registry_impl.h" |
+#include "mojo/edk/js/handle.h" |
+#include "services/shell/public/cpp/interface_provider.h" |
+#include "third_party/WebKit/public/web/WebLocalFrame.h" |
+ |
+namespace content { |
+ |
+gin::WrapperInfo InterfaceProviderJsWrapper::kWrapperInfo = { |
+ gin::kEmbedderNativeGin}; |
+const char InterfaceProviderJsWrapper::kPerFrameModuleName[] = |
+ "content/public/renderer/frame_service_registry"; |
+const char InterfaceProviderJsWrapper::kPerProcessModuleName[] = |
+ "content/public/renderer/service_registry"; |
+ |
+InterfaceProviderJsWrapper::~InterfaceProviderJsWrapper() { |
+} |
+ |
+// static |
+gin::Handle<InterfaceProviderJsWrapper> |
+InterfaceProviderJsWrapper::Create( |
+ v8::Isolate* isolate, |
+ v8::Handle<v8::Context> context, |
+ shell::InterfaceProvider* remote_interfaces) { |
+ return gin::CreateHandle( |
+ isolate, |
+ new InterfaceProviderJsWrapper( |
+ isolate, context, |
+ remote_interfaces->GetWeakPtr())); |
+} |
+ |
+gin::ObjectTemplateBuilder |
+InterfaceProviderJsWrapper::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
+ return Wrappable<InterfaceProviderJsWrapper>::GetObjectTemplateBuilder( |
+ isolate) |
+ .SetMethod("connectToService", |
+ &InterfaceProviderJsWrapper::GetInterface) |
+ .SetMethod("addServiceOverrideForTesting", |
+ &InterfaceProviderJsWrapper::AddOverrideForTesting) |
+ .SetMethod("clearServiceOverridesForTesting", |
+ &InterfaceProviderJsWrapper::ClearOverridesForTesting); |
+} |
+ |
+mojo::Handle InterfaceProviderJsWrapper::GetInterface( |
+ const std::string& interface_name) { |
+ mojo::MessagePipe pipe; |
+ if (remote_interfaces_) { |
+ remote_interfaces_->GetInterface( |
+ interface_name, std::move(pipe.handle0)); |
+ } |
+ return pipe.handle1.release(); |
+} |
+ |
+void InterfaceProviderJsWrapper::AddOverrideForTesting( |
+ const std::string& interface_name, |
+ v8::Local<v8::Function> service_factory) { |
+ ScopedJsFactory factory(v8::Isolate::GetCurrent(), service_factory); |
+ shell::InterfaceProvider::TestApi test_api(remote_interfaces_.get()); |
+ test_api.SetBinderForName( |
+ interface_name, |
+ base::Bind(&InterfaceProviderJsWrapper::CallJsFactory, |
+ weak_factory_.GetWeakPtr(), factory)); |
+} |
+ |
+void InterfaceProviderJsWrapper::ClearOverridesForTesting() { |
+ shell::InterfaceProvider::TestApi test_api(remote_interfaces_.get()); |
+ test_api.ClearBinders(); |
+} |
+ |
+InterfaceProviderJsWrapper::InterfaceProviderJsWrapper( |
+ v8::Isolate* isolate, |
+ v8::Handle<v8::Context> context, |
+ base::WeakPtr<shell::InterfaceProvider> remote_interfaces) |
+ : isolate_(isolate), |
+ context_(isolate, context), |
+ remote_interfaces_(remote_interfaces), |
+ weak_factory_(this) { |
+ context_.SetWeak(this, &InterfaceProviderJsWrapper::ClearContext, |
+ v8::WeakCallbackType::kParameter); |
+} |
+ |
+void InterfaceProviderJsWrapper::CallJsFactory( |
+ const ScopedJsFactory& factory, |
+ mojo::ScopedMessagePipeHandle pipe) { |
+ if (context_.IsEmpty()) |
+ return; |
+ |
+ v8::HandleScope handle_scope(isolate_); |
+ v8::Handle<v8::Context> context = context_.Get(isolate_); |
+ v8::Context::Scope context_scope(context); |
+ v8::Local<v8::Value> argv[] = { |
+ gin::ConvertToV8(isolate_, mojo::Handle(pipe.release().value()))}; |
+ blink::WebLocalFrame::frameForContext(context) |
+ ->callFunctionEvenIfScriptDisabled(factory.Get(isolate_), |
+ v8::Undefined(isolate_), 1, argv); |
+} |
+ |
+// static |
+void InterfaceProviderJsWrapper::ClearContext( |
+ const v8::WeakCallbackInfo<InterfaceProviderJsWrapper>& data) { |
+ InterfaceProviderJsWrapper* registry = data.GetParameter(); |
+ registry->context_.Reset(); |
+} |
+ |
+} // namespace content |