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

Unified Diff: Source/modules/navigatorconnect/AcceptConnectionObserver.cpp

Issue 1210633002: Update navigator.services API to use the new services.onconnect event [1/3]. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@serviceport-part3
Patch Set: rebase Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: Source/modules/navigatorconnect/AcceptConnectionObserver.cpp
diff --git a/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp b/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp
index 9807f0dde6d0391eac241ebcaf67ae3939dcdaa8..f8511c6c40b0d14be80d9e7fc16860c9cb5c2ff2 100644
--- a/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp
+++ b/Source/modules/navigatorconnect/AcceptConnectionObserver.cpp
@@ -9,7 +9,11 @@
#include "bindings/core/v8/ScriptFunction.h"
#include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptValue.h"
+#include "bindings/core/v8/SerializedScriptValueFactory.h"
+#include "core/dom/DOMException.h"
#include "core/dom/ExceptionCode.h"
+#include "modules/navigatorconnect/ServicePort.h"
+#include "modules/navigatorconnect/ServicePortConnectResponse.h"
#include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
namespace blink {
@@ -49,9 +53,9 @@ private:
ASSERT(m_observer);
ASSERT(m_resolveType == Fulfilled || m_resolveType == Rejected);
if (m_resolveType == Rejected)
- m_observer->connectionWasRejected();
+ m_observer->responseWasRejected();
else
- m_observer->connectionWasAccepted(value);
+ m_observer->responseWasResolved(value);
m_observer = nullptr;
return value;
}
@@ -65,6 +69,11 @@ AcceptConnectionObserver* AcceptConnectionObserver::create(ExecutionContext* con
return new AcceptConnectionObserver(context, eventID);
}
+AcceptConnectionObserver* AcceptConnectionObserver::create(ServicePortCollection* collection, PassOwnPtr<WebServicePortConnectEventCallbacks> callbacks, WebServicePortID portID, const KURL& targetURL)
+{
+ return new AcceptConnectionObserver(collection, callbacks, portID, targetURL);
+}
+
void AcceptConnectionObserver::contextDestroyed()
{
ContextLifecycleObserver::contextDestroyed();
@@ -76,7 +85,7 @@ void AcceptConnectionObserver::didDispatchEvent()
ASSERT(executionContext());
if (m_state != Initial)
return;
- connectionWasRejected();
+ responseWasRejected();
}
void AcceptConnectionObserver::acceptConnection(ScriptState* scriptState, ScriptPromise value, ExceptionState& exceptionState)
@@ -92,33 +101,105 @@ void AcceptConnectionObserver::acceptConnection(ScriptState* scriptState, Script
ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected));
}
-void AcceptConnectionObserver::connectionWasRejected()
+ScriptPromise AcceptConnectionObserver::respondWith(ScriptState* scriptState, ScriptPromise value, ExceptionState& exceptionState)
+{
+ if (m_state != Initial) {
+ return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "respondWith was already called."));
+ }
+
+ m_state = Pending;
+ m_resolver = ScriptPromiseResolver::create(scriptState);
+ ScriptPromise promise = m_resolver->promise();
+ value.then(
+ ThenFunction::createFunction(scriptState, this, ThenFunction::Fulfilled),
+ ThenFunction::createFunction(scriptState, this, ThenFunction::Rejected));
+ return promise;
+}
+
+void AcceptConnectionObserver::responseWasRejected()
{
ASSERT(executionContext());
- ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleCrossOriginConnectEvent(m_eventID, false);
+ if (m_resolver)
+ m_resolver->reject(DOMException::create(AbortError));
+ if (m_callbacks) {
+ m_callbacks->onError();
+ } else {
+ ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleCrossOriginConnectEvent(m_eventID, false);
+ }
m_state = Done;
}
-void AcceptConnectionObserver::connectionWasAccepted(const ScriptValue& value)
+void AcceptConnectionObserver::responseWasResolved(const ScriptValue& value)
{
ASSERT(executionContext());
- if (!value.v8Value()->IsTrue()) {
- connectionWasRejected();
+ if (!m_resolver) {
+ // TODO(mek): Get rid of this block when observer is only used for
+ // service port connect events.
+ if (!value.v8Value()->IsTrue()) {
+ responseWasRejected();
+ return;
+ }
+ ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleCrossOriginConnectEvent(m_eventID, true);
+ m_state = Done;
+ return;
+ }
+
+ ScriptState* scriptState = m_resolver->scriptState();
+ ExceptionState exceptionState(ExceptionState::UnknownContext, nullptr, nullptr, scriptState->context()->Global(), scriptState->isolate());
+ ServicePortConnectResponse response = ScriptValue::to<ServicePortConnectResponse>(scriptState->isolate(), value, exceptionState);
+ if (exceptionState.hadException()) {
+ exceptionState.reject(m_resolver.get());
+ m_resolver = nullptr;
+ responseWasRejected();
+ return;
+ }
+ if (!response.hasAccept() || !response.accept()) {
+ responseWasRejected();
return;
}
- ServiceWorkerGlobalScopeClient::from(executionContext())->didHandleCrossOriginConnectEvent(m_eventID, true);
+ WebServicePort webPort;
+ webPort.targetUrl = m_targetURL;
+ if (response.hasName())
+ webPort.name = response.name();
+ if (response.hasData()) {
+ webPort.data = SerializedScriptValueFactory::instance().create(scriptState->isolate(), response.data(), nullptr, exceptionState)->toWireString();
+ if (exceptionState.hadException()) {
+ exceptionState.reject(m_resolver.get());
+ m_resolver = nullptr;
+ responseWasRejected();
+ return;
+ }
+ }
+ webPort.id = m_portID;
+ ServicePort* port = ServicePort::create(m_collection, webPort);
+ m_collection->addPort(port);
+ m_resolver->resolve(port);
+ m_callbacks->onSuccess(&webPort);
m_state = Done;
}
AcceptConnectionObserver::AcceptConnectionObserver(ExecutionContext* context, int eventID)
: ContextLifecycleObserver(context)
, m_eventID(eventID)
+ , m_portID(-1)
+ , m_state(Initial)
+{
+}
+
+AcceptConnectionObserver::AcceptConnectionObserver(ServicePortCollection* collection, PassOwnPtr<WebServicePortConnectEventCallbacks> callbacks, WebServicePortID portID, const KURL& targetURL)
+ : ContextLifecycleObserver(collection->executionContext())
+ , m_eventID(-1)
+ , m_callbacks(callbacks)
+ , m_collection(collection)
+ , m_portID(portID)
+ , m_targetURL(targetURL)
, m_state(Initial)
{
}
DEFINE_TRACE(AcceptConnectionObserver)
{
+ visitor->trace(m_collection);
ContextLifecycleObserver::trace(visitor);
}
« no previous file with comments | « Source/modules/navigatorconnect/AcceptConnectionObserver.h ('k') | Source/modules/navigatorconnect/ServicePortCollection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698