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

Side by Side Diff: third_party/WebKit/Source/modules/serviceworkers/PaymentRequestRespondWithObserver.cpp

Issue 2705293010: PaymentApp: Implement respondWith() in PaymentRequestEvent. (blink side) (Closed)
Patch Set: PaymentApp: Implement respondWith() in PaymentRequestEvent. (blink side) Created 3 years, 9 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
(Empty)
1 // Copyright 2017 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 "modules/serviceworkers/PaymentRequestRespondWithObserver.h"
6
7 #include <v8.h>
8 #include "bindings/core/v8/ScriptValue.h"
9 #include "bindings/core/v8/V8Binding.h"
10 #include "bindings/modules/v8/V8PaymentAppResponse.h"
11 #include "core/dom/ExecutionContext.h"
12 #include "core/inspector/ConsoleMessage.h"
13 #include "modules/payments/PaymentAppResponse.h"
14 #include "modules/serviceworkers/ServiceWorkerGlobalScopeClient.h"
15 #include "modules/serviceworkers/WaitUntilObserver.h"
16 #include "public/platform/modules/payments/WebPaymentAppResponse.h"
17
18 namespace blink {
19 namespace {
20
21 // Returns the error message to let the developer know about the reason of the
22 // unusual failures.
23 const String getMessageForResponseError(WebServiceWorkerResponseError error) {
24 String errorMessage =
25 "The PaymentRequestEvent resulted in a network error response: ";
26 switch (error) {
27 case WebServiceWorkerResponseErrorPromiseRejected:
28 errorMessage = errorMessage + "the promise was rejected.";
29 break;
30 case WebServiceWorkerResponseErrorDefaultPrevented:
31 errorMessage =
32 errorMessage +
33 "preventDefault() was called without calling respondWith().";
34 break;
35 case WebServiceWorkerResponseErrorNoV8Instance:
36 errorMessage = errorMessage +
37 "an object that was not a PaymentResponse was passed to "
38 "respondWith().";
39 break;
40 case WebServiceWorkerResponseErrorResponseTypeError:
41 errorMessage = errorMessage +
42 "the promise was resolved with an error response object.";
43 break;
44 case WebServiceWorkerResponseErrorUnknown:
45 default:
nhiroki 2017/03/08 02:28:16 I'd recommend not to use 'default' for WebServiceW
zino 2017/03/10 17:57:52 Done.
46 errorMessage = errorMessage + "an unexpected error occurred.";
47 break;
48 }
49 return errorMessage;
50 }
51
52 } // namespace
53
54 PaymentRequestRespondWithObserver::~PaymentRequestRespondWithObserver() {}
55
56 PaymentRequestRespondWithObserver* PaymentRequestRespondWithObserver::create(
57 ExecutionContext* context,
58 int eventID,
59 WaitUntilObserver* observer) {
60 return new PaymentRequestRespondWithObserver(context, eventID, observer);
61 }
62
63 void PaymentRequestRespondWithObserver::didDispatchEvent(
64 DispatchEventResult dispatchResult) {
65 DCHECK(getExecutionContext());
66 if (m_state != Initial)
67 return;
68
69 if (dispatchResult != DispatchEventResult::NotCanceled) {
70 m_observer->incrementPendingActivity();
71 responseWasRejected(WebServiceWorkerResponseErrorDefaultPrevented);
72 return;
73 }
74
75 WebPaymentAppResponse webData;
76 ServiceWorkerGlobalScopeClient::from(getExecutionContext())
77 ->respondToPaymentRequestEvent(m_eventID, webData, m_eventDispatchTime);
78 m_state = Done;
79 m_observer.clear();
80 }
81
82 void PaymentRequestRespondWithObserver::responseWasRejected(
83 WebServiceWorkerResponseError error) {
84 DCHECK(getExecutionContext());
85
86 getExecutionContext()->addConsoleMessage(ConsoleMessage::create(
87 JSMessageSource, WarningMessageLevel, getMessageForResponseError(error)));
88
89 WebPaymentAppResponse webData;
90 ServiceWorkerGlobalScopeClient::from(getExecutionContext())
91 ->respondToPaymentRequestEvent(m_eventID, webData, m_eventDispatchTime);
92 RespondWithObserver::responseWasRejected(error);
93 }
94
95 void PaymentRequestRespondWithObserver::responseWasFulfilled(
96 const ScriptValue& value) {
97 DCHECK(getExecutionContext());
98
99 PaymentAppResponse response;
100 DummyExceptionStateForTesting exceptionState;
nhiroki 2017/03/08 02:28:16 Using a dummy exception state looks strange. I don
zino 2017/03/10 17:57:52 Done.
101 V8PaymentAppResponse::toImpl(toIsolate(getExecutionContext()),
102 value.v8Value(), response, exceptionState);
103
104 if (exceptionState.hadException()) {
105 responseWasRejected(WebServiceWorkerResponseErrorNoV8Instance);
106 return;
107 }
108
109 WebPaymentAppResponse webData;
110 webData.methodName = WebString(AtomicString(response.methodName()));
111
112 v8::Local<v8::String> detailsValue;
113 if (!v8::JSON::Stringify(response.details().context(),
114 response.details().v8Value().As<v8::Object>())
115 .ToLocal(&detailsValue)) {
116 responseWasRejected(WebServiceWorkerResponseErrorUnknown);
117 return;
118 }
119 webData.stringifiedDetails = WebString(AtomicString(
120 v8StringToWebCoreString<String>(detailsValue, DoNotExternalize)));
121 ServiceWorkerGlobalScopeClient::from(getExecutionContext())
122 ->respondToPaymentRequestEvent(m_eventID, webData, m_eventDispatchTime);
123 RespondWithObserver::responseWasFulfilled(value);
124 }
125
126 PaymentRequestRespondWithObserver::PaymentRequestRespondWithObserver(
127 ExecutionContext* context,
128 int eventID,
129 WaitUntilObserver* observer)
130 : RespondWithObserver(context, eventID, observer) {}
131
132 DEFINE_TRACE(PaymentRequestRespondWithObserver) {
133 RespondWithObserver::trace(visitor);
134 }
135
136 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698