Index: Source/modules/navigatorconnect/NavigatorConnect.cpp |
diff --git a/Source/modules/navigatorconnect/NavigatorConnect.cpp b/Source/modules/navigatorconnect/NavigatorConnect.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..16411feefb375d33627ad864aeb3797fab1ec338 |
--- /dev/null |
+++ b/Source/modules/navigatorconnect/NavigatorConnect.cpp |
@@ -0,0 +1,73 @@ |
+// 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 "config.h" |
+#include "modules/navigatorconnect/NavigatorConnect.h" |
+ |
+#include "bindings/core/v8/ScriptPromise.h" |
+#include "bindings/core/v8/ScriptPromiseResolver.h" |
+#include "core/dom/DOMException.h" |
+#include "core/dom/ExceptionCode.h" |
+#include "core/dom/MessageChannel.h" |
+#include "core/dom/MessagePort.h" |
+#include "public/platform/Platform.h" |
+#include "public/platform/WebCallbacks.h" |
+#include "public/platform/WebNavigatorConnectProvider.h" |
+ |
+namespace blink { |
+ |
+namespace { |
+ |
+class ConnectCallbacks : public WebCallbacks<void, void> { |
+public: |
+ ConnectCallbacks(PassRefPtr<ScriptPromiseResolver> resolver, PassRefPtrWillBeRawPtr<MessagePort> port) |
+ : m_resolver(resolver), m_port(port) |
+ { |
+ ASSERT(m_resolver); |
+ } |
+ ~ConnectCallbacks() override { } |
+ |
+ void onSuccess() override |
+ { |
+ if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { |
+ return; |
+ } |
+ m_resolver->resolve(m_port); |
scheib
2014/12/05 00:16:40
The lifetime of the port, and I assume then the ch
Marijn Kruisselbrink
2014/12/05 09:23:42
What do you mean with "channel instance"? Is it th
scheib
2014/12/05 17:39:35
I'm not familiar with details of the MessagePort|C
|
+ } |
+ |
+ void onError() override |
+ { |
+ if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) { |
+ return; |
+ } |
+ m_resolver->reject(DOMException::create(AbortError)); |
+ } |
+ |
+private: |
+ RefPtr<ScriptPromiseResolver> m_resolver; |
+ RefPtrWillBeMember<MessagePort> m_port; |
+ WTF_MAKE_NONCOPYABLE(ConnectCallbacks); |
+}; |
+ |
+} // namespace |
+ |
+ScriptPromise NavigatorConnect::connect(ScriptState* scriptState, Navigator&, const String& url) |
+{ |
+ WebNavigatorConnectProvider* provider = Platform::current()->navigatorConnectProvider(); |
+ if (!provider) |
+ return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
+ |
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
+ ScriptPromise promise = resolver->promise(); |
+ RefPtrWillBeRawPtr<MessageChannel> channel(MessageChannel::create(scriptState->executionContext())); |
scheib
2014/12/05 00:16:40
Object lifetime is a little obscure here, some cod
Marijn Kruisselbrink
2014/12/05 09:23:42
MessageChannel really is just a std::pair<RefPtr<M
scheib
2014/12/05 17:39:34
Acknowledged.
|
+ OwnPtr<WebMessagePortChannel> webchannel = channel->port2()->disentangle(); |
+ provider->connect( |
+ scriptState->executionContext()->completeURL(url), |
+ webchannel.leakPtr(), |
+ new ConnectCallbacks(resolver, channel->port1())); |
+ return promise; |
+} |
+ |
+ |
+} // namespace blink |