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

Side by Side Diff: Source/modules/navigatorconnect/NavigatorConnect.cpp

Issue 782463002: Expose navigator.connect client side API in blink. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: also expose to workers Created 6 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "modules/navigatorconnect/NavigatorConnect.h"
7
8 #include "bindings/core/v8/ScriptPromiseResolver.h"
9 #include "core/dom/DOMException.h"
10 #include "core/dom/ExceptionCode.h"
11 #include "core/dom/MessageChannel.h"
12 #include "core/dom/MessagePort.h"
13 #include "public/platform/Platform.h"
14 #include "public/platform/WebCallbacks.h"
15 #include "public/platform/WebNavigatorConnectProvider.h"
16
17 namespace blink {
18
19 namespace {
20
21 class ConnectCallbacks : public WebCallbacks<void, void> {
22 public:
23 ConnectCallbacks(PassRefPtr<ScriptPromiseResolver> resolver, PassRefPtrWillB eRawPtr<MessagePort> port)
24 : m_resolver(resolver), m_port(port)
25 {
26 ASSERT(m_resolver);
27 }
28 ~ConnectCallbacks() override { }
29
30 void onSuccess() override
31 {
32 if (!m_resolver->executionContext() || m_resolver->executionContext()->a ctiveDOMObjectsAreStopped()) {
33 return;
34 }
35 m_resolver->resolve(m_port);
36 }
37
38 void onError() override
39 {
40 if (!m_resolver->executionContext() || m_resolver->executionContext()->a ctiveDOMObjectsAreStopped()) {
41 return;
42 }
43 m_resolver->reject(DOMException::create(AbortError));
44 }
45
46 private:
47 RefPtr<ScriptPromiseResolver> m_resolver;
48 RefPtrWillBeMember<MessagePort> m_port;
49 WTF_MAKE_NONCOPYABLE(ConnectCallbacks);
50 };
51
52 } // namespace
53
54 ScriptPromise NavigatorConnect::connect(ScriptState* scriptState, const String& url)
55 {
56 WebNavigatorConnectProvider* provider = Platform::current()->navigatorConnec tProvider();
57 if (!provider)
58 return ScriptPromise::rejectWithDOMException(scriptState, DOMException:: create(NotSupportedError));
59
60 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip tState);
61 ScriptPromise promise = resolver->promise();
62 // Create a new MessageChannel, but immediately disentangle port2 (extract
63 // the WebMessagePortChannel from the port and mark it as being transfered).
64 // This way we have:
65 // - Ownership of port1 is kept in the ConnectCallbacks and later passed to
66 // javascript (or released if the connection is not accepted).
67 // - Ownership of port2 (or more precisely the WebMessagePortChannel backing
68 // it) is passed to the content layer to be transfered to the service
69 // provider.
70 // - Ownership of the MessageChannel object itself will be released at the
71 // end of this method. This is okay as it's the ports themselves that
72 // represent the actual message channel. MessageChannel is only used to
73 // create a pair of ports.
74 RefPtrWillBeRawPtr<MessageChannel> channel(MessageChannel::create(scriptStat e->executionContext()));
75 OwnPtr<WebMessagePortChannel> webchannel = channel->port2()->disentangle();
76 provider->connect(
77 scriptState->executionContext()->completeURL(url),
78 webchannel.leakPtr(),
79 new ConnectCallbacks(resolver, channel->port1()));
80 return promise;
81 }
82
83
84 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/navigatorconnect/NavigatorConnect.h ('k') | Source/modules/navigatorconnect/NavigatorConnect.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698