Chromium Code Reviews| 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 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 | 216 |
| 217 void validateDisplayItems(const HeapVector<PaymentItem>& items, | 217 void validateDisplayItems(const HeapVector<PaymentItem>& items, |
| 218 ExceptionState& exceptionState) { | 218 ExceptionState& exceptionState) { |
| 219 for (const auto& item : items) { | 219 for (const auto& item : items) { |
| 220 validateShippingOptionOrPaymentItem(item, exceptionState); | 220 validateShippingOptionOrPaymentItem(item, exceptionState); |
| 221 if (exceptionState.hadException()) | 221 if (exceptionState.hadException()) |
| 222 return; | 222 return; |
| 223 } | 223 } |
| 224 } | 224 } |
| 225 | 225 |
| 226 void validateShippingOptions(const HeapVector<PaymentShippingOption>& options, | 226 void validateAndFixupShippingOptions(HeapVector<PaymentShippingOption>& options, |
| 227 ExceptionState& exceptionState) { | 227 ExceptionState& exceptionState) { |
| 228 HashSet<String> uniqueIds; | 228 HashSet<String> uniqueIds; |
| 229 for (const auto& option : options) { | 229 for (const auto& option : options) { |
| 230 if (!option.hasId() || option.id().isEmpty()) { | 230 if (!option.hasId() || option.id().isEmpty()) { |
| 231 exceptionState.throwTypeError("ShippingOption id required"); | 231 exceptionState.throwTypeError("ShippingOption id required"); |
| 232 return; | 232 return; |
| 233 } | 233 } |
| 234 | 234 |
| 235 if (uniqueIds.contains(option.id())) { | 235 if (uniqueIds.contains(option.id())) { |
| 236 exceptionState.throwTypeError( | 236 options = HeapVector<PaymentShippingOption>(); |
| 237 "Duplicate shipping option identifiers are not allowed"); | |
| 238 return; | 237 return; |
| 239 } | 238 } |
| 240 uniqueIds.add(option.id()); | 239 uniqueIds.add(option.id()); |
| 241 | 240 |
| 242 validateShippingOptionOrPaymentItem(option, exceptionState); | 241 validateShippingOptionOrPaymentItem(option, exceptionState); |
| 243 if (exceptionState.hadException()) | 242 if (exceptionState.hadException()) |
| 244 return; | 243 return; |
| 245 } | 244 } |
| 246 } | 245 } |
| 247 | 246 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 284 } | 283 } |
| 285 | 284 |
| 286 if (modifier.hasAdditionalDisplayItems()) { | 285 if (modifier.hasAdditionalDisplayItems()) { |
| 287 validateDisplayItems(modifier.additionalDisplayItems(), exceptionState); | 286 validateDisplayItems(modifier.additionalDisplayItems(), exceptionState); |
| 288 if (exceptionState.hadException()) | 287 if (exceptionState.hadException()) |
| 289 return; | 288 return; |
| 290 } | 289 } |
| 291 } | 290 } |
| 292 } | 291 } |
| 293 | 292 |
| 294 void validatePaymentDetails(const PaymentDetails& details, | 293 void validateAndFixupPaymentDetails(PaymentDetails& details, |
| 295 ExceptionState& exceptionState) { | 294 ExceptionState& exceptionState) { |
| 296 if (!details.hasTotal()) { | 295 if (!details.hasTotal()) { |
| 297 exceptionState.throwTypeError("Must specify total"); | 296 exceptionState.throwTypeError("Must specify total"); |
| 298 return; | 297 return; |
| 299 } | 298 } |
| 300 | 299 |
| 301 validateShippingOptionOrPaymentItem(details.total(), exceptionState); | 300 validateShippingOptionOrPaymentItem(details.total(), exceptionState); |
| 302 if (exceptionState.hadException()) | 301 if (exceptionState.hadException()) |
| 303 return; | 302 return; |
| 304 | 303 |
| 305 if (details.total().amount().value()[0] == '-') { | 304 if (details.total().amount().value()[0] == '-') { |
| 306 exceptionState.throwTypeError("Total amount value should be non-negative"); | 305 exceptionState.throwTypeError("Total amount value should be non-negative"); |
| 307 return; | 306 return; |
| 308 } | 307 } |
| 309 | 308 |
| 310 if (details.hasDisplayItems()) { | 309 if (details.hasDisplayItems()) { |
| 311 validateDisplayItems(details.displayItems(), exceptionState); | 310 validateDisplayItems(details.displayItems(), exceptionState); |
| 312 if (exceptionState.hadException()) | 311 if (exceptionState.hadException()) |
| 313 return; | 312 return; |
| 314 } | 313 } |
| 315 | 314 |
| 316 if (details.hasShippingOptions()) { | 315 if (details.hasShippingOptions()) { |
| 317 validateShippingOptions(details.shippingOptions(), exceptionState); | 316 HeapVector<PaymentShippingOption> fixedShippingOptions = |
|
please use gerrit instead
2016/10/12 23:19:10
Don't break this line. There's no character limit
zino
2016/10/13 01:46:24
Good point.
But there *was* no character limit in
| |
| 317 details.shippingOptions(); | |
| 318 validateAndFixupShippingOptions(fixedShippingOptions, exceptionState); | |
| 319 details.setShippingOptions(fixedShippingOptions); | |
| 318 if (exceptionState.hadException()) | 320 if (exceptionState.hadException()) |
| 319 return; | 321 return; |
| 320 } | 322 } |
| 321 | 323 |
| 322 if (details.hasModifiers()) { | 324 if (details.hasModifiers()) { |
| 323 validatePaymentDetailsModifiers(details.modifiers(), exceptionState); | 325 validatePaymentDetailsModifiers(details.modifiers(), exceptionState); |
| 324 } | 326 } |
| 325 | 327 |
| 326 String errorMessage; | 328 String errorMessage; |
| 327 if (!PaymentsValidators::isValidErrorMsgFormat(details.error(), | 329 if (!PaymentsValidators::isValidErrorMsgFormat(details.error(), |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 517 V8PaymentDetails::toImpl(detailsScriptValue.isolate(), | 519 V8PaymentDetails::toImpl(detailsScriptValue.isolate(), |
| 518 detailsScriptValue.v8Value(), details, | 520 detailsScriptValue.v8Value(), details, |
| 519 exceptionState); | 521 exceptionState); |
| 520 if (exceptionState.hadException()) { | 522 if (exceptionState.hadException()) { |
| 521 m_showResolver->reject( | 523 m_showResolver->reject( |
| 522 DOMException::create(SyntaxError, exceptionState.message())); | 524 DOMException::create(SyntaxError, exceptionState.message())); |
| 523 clearResolversAndCloseMojoConnection(); | 525 clearResolversAndCloseMojoConnection(); |
| 524 return; | 526 return; |
| 525 } | 527 } |
| 526 | 528 |
| 527 validatePaymentDetails(details, exceptionState); | 529 validateAndFixupPaymentDetails(details, exceptionState); |
| 528 if (exceptionState.hadException()) { | 530 if (exceptionState.hadException()) { |
| 529 m_showResolver->reject( | 531 m_showResolver->reject( |
| 530 DOMException::create(SyntaxError, exceptionState.message())); | 532 DOMException::create(SyntaxError, exceptionState.message())); |
| 531 clearResolversAndCloseMojoConnection(); | 533 clearResolversAndCloseMojoConnection(); |
| 532 return; | 534 return; |
| 533 } | 535 } |
| 534 | 536 |
| 535 if (m_options.requestShipping()) | 537 if (m_options.requestShipping()) |
| 536 m_shippingOption = getSelectedShippingOption(details); | 538 m_shippingOption = getSelectedShippingOption(details); |
| 537 | 539 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 582 return; | 584 return; |
| 583 } | 585 } |
| 584 | 586 |
| 585 if (!scriptState->domWindow()->frame() || | 587 if (!scriptState->domWindow()->frame() || |
| 586 !scriptState->domWindow()->frame()->isMainFrame()) { | 588 !scriptState->domWindow()->frame()->isMainFrame()) { |
| 587 exceptionState.throwSecurityError( | 589 exceptionState.throwSecurityError( |
| 588 "Must be in a top-level browsing context"); | 590 "Must be in a top-level browsing context"); |
| 589 return; | 591 return; |
| 590 } | 592 } |
| 591 | 593 |
| 592 validatePaymentDetails(details, exceptionState); | 594 PaymentDetails fixedDetails(details); |
| 595 validateAndFixupPaymentDetails(fixedDetails, exceptionState); | |
| 593 if (exceptionState.hadException()) | 596 if (exceptionState.hadException()) |
| 594 return; | 597 return; |
| 595 | 598 |
| 596 if (details.hasError() && !details.error().isEmpty()) { | 599 if (fixedDetails.hasError() && !fixedDetails.error().isEmpty()) { |
| 597 exceptionState.throwTypeError("Error value should be empty"); | 600 exceptionState.throwTypeError("Error value should be empty"); |
| 598 return; | 601 return; |
| 599 } | 602 } |
| 600 | 603 |
| 601 if (m_options.requestShipping()) { | 604 if (m_options.requestShipping()) { |
| 602 m_shippingOption = getSelectedShippingOption(details); | 605 m_shippingOption = getSelectedShippingOption(fixedDetails); |
| 603 m_shippingType = getValidShippingType(m_options.shippingType()); | 606 m_shippingType = getValidShippingType(m_options.shippingType()); |
| 604 } | 607 } |
| 605 | 608 |
| 606 scriptState->domWindow()->frame()->interfaceProvider()->getInterface( | 609 scriptState->domWindow()->frame()->interfaceProvider()->getInterface( |
| 607 mojo::GetProxy(&m_paymentProvider)); | 610 mojo::GetProxy(&m_paymentProvider)); |
| 608 m_paymentProvider.set_connection_error_handler(convertToBaseCallback( | 611 m_paymentProvider.set_connection_error_handler(convertToBaseCallback( |
| 609 WTF::bind(&PaymentRequest::OnError, wrapWeakPersistent(this), | 612 WTF::bind(&PaymentRequest::OnError, wrapWeakPersistent(this), |
| 610 mojom::blink::PaymentErrorReason::UNKNOWN))); | 613 mojom::blink::PaymentErrorReason::UNKNOWN))); |
| 611 m_paymentProvider->Init( | 614 m_paymentProvider->Init( |
| 612 m_clientBinding.CreateInterfacePtrAndBind(), | 615 m_clientBinding.CreateInterfacePtrAndBind(), |
| 613 mojo::WTFArray<mojom::blink::PaymentMethodDataPtr>::From( | 616 mojo::WTFArray<mojom::blink::PaymentMethodDataPtr>::From( |
| 614 validatedMethodData), | 617 validatedMethodData), |
| 615 mojom::blink::PaymentDetails::From(details), | 618 mojom::blink::PaymentDetails::From(fixedDetails), |
| 616 mojom::blink::PaymentOptions::From(m_options)); | 619 mojom::blink::PaymentOptions::From(m_options)); |
| 617 } | 620 } |
| 618 | 621 |
| 619 void PaymentRequest::contextDestroyed() { | 622 void PaymentRequest::contextDestroyed() { |
| 620 clearResolversAndCloseMojoConnection(); | 623 clearResolversAndCloseMojoConnection(); |
| 621 } | 624 } |
| 622 | 625 |
| 623 void PaymentRequest::OnShippingAddressChange( | 626 void PaymentRequest::OnShippingAddressChange( |
| 624 mojom::blink::PaymentAddressPtr address) { | 627 mojom::blink::PaymentAddressPtr address) { |
| 625 DCHECK(m_showResolver); | 628 DCHECK(m_showResolver); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 783 m_completeTimer.stop(); | 786 m_completeTimer.stop(); |
| 784 m_completeResolver.clear(); | 787 m_completeResolver.clear(); |
| 785 m_showResolver.clear(); | 788 m_showResolver.clear(); |
| 786 m_abortResolver.clear(); | 789 m_abortResolver.clear(); |
| 787 if (m_clientBinding.is_bound()) | 790 if (m_clientBinding.is_bound()) |
| 788 m_clientBinding.Close(); | 791 m_clientBinding.Close(); |
| 789 m_paymentProvider.reset(); | 792 m_paymentProvider.reset(); |
| 790 } | 793 } |
| 791 | 794 |
| 792 } // namespace blink | 795 } // namespace blink |
| OLD | NEW |