| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/payments/PaymentRequest.h" | 5 #include "modules/payments/PaymentRequest.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
| 8 #include "bindings/core/v8/JSONValuesForV8.h" | 8 #include "bindings/core/v8/JSONValuesForV8.h" |
| 9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 { | 372 { |
| 373 return new PaymentRequest(scriptState, methodData, details, options, excepti
onState); | 373 return new PaymentRequest(scriptState, methodData, details, options, excepti
onState); |
| 374 } | 374 } |
| 375 | 375 |
| 376 PaymentRequest::~PaymentRequest() | 376 PaymentRequest::~PaymentRequest() |
| 377 { | 377 { |
| 378 } | 378 } |
| 379 | 379 |
| 380 ScriptPromise PaymentRequest::show(ScriptState* scriptState) | 380 ScriptPromise PaymentRequest::show(ScriptState* scriptState) |
| 381 { | 381 { |
| 382 if (m_showResolver) | 382 if (!m_paymentProvider.is_bound() || m_showResolver) |
| 383 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Already called show() once")); | 383 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Already called show() once")); |
| 384 | 384 |
| 385 if (!scriptState->domWindow() || !scriptState->domWindow()->frame()) | 385 if (!scriptState->domWindow() || !scriptState->domWindow()->frame()) |
| 386 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Cannot show the payment request")); | 386 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Cannot show the payment request")); |
| 387 | 387 |
| 388 DCHECK(!m_paymentProvider.is_bound()); | 388 m_paymentProvider->Show(); |
| 389 scriptState->domWindow()->frame()->interfaceProvider()->getInterface(mojo::G
etProxy(&m_paymentProvider)); | |
| 390 m_paymentProvider.set_connection_error_handler(convertToBaseCallback(WTF::bi
nd(&PaymentRequest::OnError, wrapWeakPersistent(this), mojom::blink::PaymentErro
rReason::UNKNOWN))); | |
| 391 m_paymentProvider->SetClient(m_clientBinding.CreateInterfacePtrAndBind()); | |
| 392 m_paymentProvider->Show(mojo::WTFArray<mojom::blink::PaymentMethodDataPtr>::
From(m_methodData), mojom::blink::PaymentDetails::From(m_details), mojom::blink:
:PaymentOptions::From(m_options)); | |
| 393 | 389 |
| 394 m_showResolver = ScriptPromiseResolver::create(scriptState); | 390 m_showResolver = ScriptPromiseResolver::create(scriptState); |
| 395 return m_showResolver->promise(); | 391 return m_showResolver->promise(); |
| 396 } | 392 } |
| 397 | 393 |
| 398 ScriptPromise PaymentRequest::abort(ScriptState* scriptState) | 394 ScriptPromise PaymentRequest::abort(ScriptState* scriptState) |
| 399 { | 395 { |
| 400 if (m_abortResolver) | 396 if (m_abortResolver) |
| 401 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Cannot abort() again until the previous abort() has r
esolved or rejected")); | 397 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Cannot abort() again until the previous abort() has r
esolved or rejected")); |
| 402 | 398 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 { | 466 { |
| 471 if (m_showResolver) | 467 if (m_showResolver) |
| 472 m_showResolver->reject(DOMException::create(AbortError, error)); | 468 m_showResolver->reject(DOMException::create(AbortError, error)); |
| 473 if (m_completeResolver) | 469 if (m_completeResolver) |
| 474 m_completeResolver->reject(DOMException::create(AbortError, error)); | 470 m_completeResolver->reject(DOMException::create(AbortError, error)); |
| 475 clearResolversAndCloseMojoConnection(); | 471 clearResolversAndCloseMojoConnection(); |
| 476 } | 472 } |
| 477 | 473 |
| 478 DEFINE_TRACE(PaymentRequest) | 474 DEFINE_TRACE(PaymentRequest) |
| 479 { | 475 { |
| 480 visitor->trace(m_details); | |
| 481 visitor->trace(m_options); | 476 visitor->trace(m_options); |
| 482 visitor->trace(m_shippingAddress); | 477 visitor->trace(m_shippingAddress); |
| 483 visitor->trace(m_showResolver); | 478 visitor->trace(m_showResolver); |
| 484 visitor->trace(m_completeResolver); | 479 visitor->trace(m_completeResolver); |
| 485 visitor->trace(m_abortResolver); | 480 visitor->trace(m_abortResolver); |
| 486 EventTargetWithInlineData::trace(visitor); | 481 EventTargetWithInlineData::trace(visitor); |
| 487 ContextLifecycleObserver::trace(visitor); | 482 ContextLifecycleObserver::trace(visitor); |
| 488 } | 483 } |
| 489 | 484 |
| 490 void PaymentRequest::onCompleteTimeoutForTesting() | 485 void PaymentRequest::onCompleteTimeoutForTesting() |
| 491 { | 486 { |
| 492 m_completeTimer.stop(); | 487 m_completeTimer.stop(); |
| 493 onCompleteTimeout(0); | 488 onCompleteTimeout(0); |
| 494 } | 489 } |
| 495 | 490 |
| 496 PaymentRequest::PaymentRequest(ScriptState* scriptState, const HeapVector<Paymen
tMethodData>& methodData, const PaymentDetails& details, const PaymentOptions& o
ptions, ExceptionState& exceptionState) | 491 PaymentRequest::PaymentRequest(ScriptState* scriptState, const HeapVector<Paymen
tMethodData>& methodData, const PaymentDetails& details, const PaymentOptions& o
ptions, ExceptionState& exceptionState) |
| 497 : ContextLifecycleObserver(scriptState->getExecutionContext()) | 492 : ContextLifecycleObserver(scriptState->getExecutionContext()) |
| 498 , ActiveScriptWrappable(this) | 493 , ActiveScriptWrappable(this) |
| 499 , m_options(options) | 494 , m_options(options) |
| 500 , m_clientBinding(this) | 495 , m_clientBinding(this) |
| 501 , m_completeTimer(this, &PaymentRequest::onCompleteTimeout) | 496 , m_completeTimer(this, &PaymentRequest::onCompleteTimeout) |
| 502 { | 497 { |
| 503 validateAndConvertPaymentMethodData(methodData, &m_methodData, exceptionStat
e); | 498 Vector<MethodData> validatedMethodData; |
| 499 validateAndConvertPaymentMethodData(methodData, &validatedMethodData, except
ionState); |
| 504 if (exceptionState.hadException()) | 500 if (exceptionState.hadException()) |
| 505 return; | 501 return; |
| 506 | 502 |
| 507 if (!scriptState->getExecutionContext()->isSecureContext()) { | 503 if (!scriptState->getExecutionContext()->isSecureContext()) { |
| 508 exceptionState.throwSecurityError("Must be in a secure context"); | 504 exceptionState.throwSecurityError("Must be in a secure context"); |
| 509 return; | 505 return; |
| 510 } | 506 } |
| 511 | 507 |
| 512 if (!scriptState->domWindow()->frame() || !scriptState->domWindow()->frame()
->isMainFrame()) { | 508 if (!scriptState->domWindow()->frame() || !scriptState->domWindow()->frame()
->isMainFrame()) { |
| 513 exceptionState.throwSecurityError("Must be in a top-level browsing conte
xt"); | 509 exceptionState.throwSecurityError("Must be in a top-level browsing conte
xt"); |
| 514 return; | 510 return; |
| 515 } | 511 } |
| 516 | 512 |
| 517 validatePaymentDetails(details, exceptionState); | 513 validatePaymentDetails(details, exceptionState); |
| 518 if (exceptionState.hadException()) | 514 if (exceptionState.hadException()) |
| 519 return; | 515 return; |
| 520 m_details = details; | |
| 521 | 516 |
| 522 if (m_options.requestShipping()) | 517 if (m_options.requestShipping()) |
| 523 m_shippingOption = getSelectedShippingOption(details); | 518 m_shippingOption = getSelectedShippingOption(details); |
| 519 |
| 520 scriptState->domWindow()->frame()->interfaceProvider()->getInterface(mojo::G
etProxy(&m_paymentProvider)); |
| 521 m_paymentProvider.set_connection_error_handler(convertToBaseCallback(WTF::bi
nd(&PaymentRequest::OnError, wrapWeakPersistent(this), mojom::blink::PaymentErro
rReason::UNKNOWN))); |
| 522 m_paymentProvider->Init(m_clientBinding.CreateInterfacePtrAndBind(), mojo::W
TFArray<mojom::blink::PaymentMethodDataPtr>::From(validatedMethodData), mojom::b
link::PaymentDetails::From(details), mojom::blink::PaymentOptions::From(m_option
s)); |
| 524 } | 523 } |
| 525 | 524 |
| 526 void PaymentRequest::contextDestroyed() | 525 void PaymentRequest::contextDestroyed() |
| 527 { | 526 { |
| 528 clearResolversAndCloseMojoConnection(); | 527 clearResolversAndCloseMojoConnection(); |
| 529 } | 528 } |
| 530 | 529 |
| 531 bool PaymentRequest::hasPendingActivity() const | 530 bool PaymentRequest::hasPendingActivity() const |
| 532 { | 531 { |
| 533 return m_showResolver || m_completeResolver; | 532 return m_showResolver || m_completeResolver; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 m_completeTimer.stop(); | 696 m_completeTimer.stop(); |
| 698 m_completeResolver.clear(); | 697 m_completeResolver.clear(); |
| 699 m_showResolver.clear(); | 698 m_showResolver.clear(); |
| 700 m_abortResolver.clear(); | 699 m_abortResolver.clear(); |
| 701 if (m_clientBinding.is_bound()) | 700 if (m_clientBinding.is_bound()) |
| 702 m_clientBinding.Close(); | 701 m_clientBinding.Close(); |
| 703 m_paymentProvider.reset(); | 702 m_paymentProvider.reset(); |
| 704 } | 703 } |
| 705 | 704 |
| 706 } // namespace blink | 705 } // namespace blink |
| OLD | NEW |