| 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/imagecapture/ImageCapture.h" | 5 #include "modules/imagecapture/ImageCapture.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" | 7 #include "bindings/core/v8/CallbackPromiseAdapter.h" |
| 8 #include "bindings/core/v8/ScriptPromiseResolver.h" | 8 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 9 #include "core/dom/DOMException.h" | 9 #include "core/dom/DOMException.h" |
| 10 #include "core/dom/ExceptionCode.h" | 10 #include "core/dom/ExceptionCode.h" |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 return promise; | 129 return promise; |
| 130 } | 130 } |
| 131 service_requests_.insert(resolver); | 131 service_requests_.insert(resolver); |
| 132 | 132 |
| 133 // m_streamTrack->component()->source()->id() is the renderer "name" of the | 133 // m_streamTrack->component()->source()->id() is the renderer "name" of the |
| 134 // camera; | 134 // camera; |
| 135 // TODO(mcasas) consider sending the security origin as well: | 135 // TODO(mcasas) consider sending the security origin as well: |
| 136 // scriptState->getExecutionContext()->getSecurityOrigin()->toString() | 136 // scriptState->getExecutionContext()->getSecurityOrigin()->toString() |
| 137 service_->GetCapabilities( | 137 service_->GetCapabilities( |
| 138 stream_track_->Component()->Source()->Id(), | 138 stream_track_->Component()->Source()->Id(), |
| 139 ConvertToBaseCallback(WTF::Bind(&ImageCapture::OnPhotoCapabilities, | 139 ConvertToBaseCallback(WTF::Bind( |
| 140 WrapPersistent(this), | 140 &ImageCapture::OnMojoPhotoCapabilities, WrapPersistent(this), |
| 141 WrapPersistent(resolver)))); | 141 WrapPersistent(resolver), false /* trigger_take_photo */))); |
| 142 return promise; | 142 return promise; |
| 143 } | 143 } |
| 144 | 144 |
| 145 ScriptPromise ImageCapture::setOptions(ScriptState* script_state, | 145 ScriptPromise ImageCapture::setOptions(ScriptState* script_state, |
| 146 const PhotoSettings& photo_settings) { | 146 const PhotoSettings& photo_settings, |
| 147 bool trigger_take_photo /* = false */) { |
| 147 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); | 148 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); |
| 148 ScriptPromise promise = resolver->Promise(); | 149 ScriptPromise promise = resolver->Promise(); |
| 149 | 150 |
| 150 if (TrackIsInactive(*stream_track_)) { | 151 if (TrackIsInactive(*stream_track_)) { |
| 151 resolver->Reject(DOMException::Create( | 152 resolver->Reject(DOMException::Create( |
| 152 kInvalidStateError, "The associated Track is in an invalid state.")); | 153 kInvalidStateError, "The associated Track is in an invalid state.")); |
| 153 return promise; | 154 return promise; |
| 154 } | 155 } |
| 155 | 156 |
| 156 if (!service_) { | 157 if (!service_) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 171 | 172 |
| 172 settings->has_red_eye_reduction = photo_settings.hasRedEyeReduction(); | 173 settings->has_red_eye_reduction = photo_settings.hasRedEyeReduction(); |
| 173 if (settings->has_red_eye_reduction) | 174 if (settings->has_red_eye_reduction) |
| 174 settings->red_eye_reduction = photo_settings.redEyeReduction(); | 175 settings->red_eye_reduction = photo_settings.redEyeReduction(); |
| 175 settings->has_fill_light_mode = photo_settings.hasFillLightMode(); | 176 settings->has_fill_light_mode = photo_settings.hasFillLightMode(); |
| 176 if (settings->has_fill_light_mode) { | 177 if (settings->has_fill_light_mode) { |
| 177 settings->fill_light_mode = | 178 settings->fill_light_mode = |
| 178 ParseFillLightMode(photo_settings.fillLightMode()); | 179 ParseFillLightMode(photo_settings.fillLightMode()); |
| 179 } | 180 } |
| 180 | 181 |
| 181 service_->SetOptions(stream_track_->Component()->Source()->Id(), | 182 service_->SetOptions( |
| 182 std::move(settings), | 183 stream_track_->Component()->Source()->Id(), std::move(settings), |
| 183 ConvertToBaseCallback(WTF::Bind( | 184 ConvertToBaseCallback( |
| 184 &ImageCapture::OnSetOptions, WrapPersistent(this), | 185 WTF::Bind(&ImageCapture::OnMojoSetOptions, WrapPersistent(this), |
| 185 WrapPersistent(resolver)))); | 186 WrapPersistent(resolver), trigger_take_photo))); |
| 186 return promise; | 187 return promise; |
| 187 } | 188 } |
| 188 | 189 |
| 189 ScriptPromise ImageCapture::takePhoto(ScriptState* script_state) { | 190 ScriptPromise ImageCapture::takePhoto(ScriptState* script_state) { |
| 190 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); | 191 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); |
| 191 ScriptPromise promise = resolver->Promise(); | 192 ScriptPromise promise = resolver->Promise(); |
| 192 | 193 |
| 193 if (TrackIsInactive(*stream_track_)) { | 194 if (TrackIsInactive(*stream_track_)) { |
| 194 resolver->Reject(DOMException::Create( | 195 resolver->Reject(DOMException::Create( |
| 195 kInvalidStateError, "The associated Track is in an invalid state.")); | 196 kInvalidStateError, "The associated Track is in an invalid state.")); |
| 196 return promise; | 197 return promise; |
| 197 } | 198 } |
| 198 if (!service_) { | 199 if (!service_) { |
| 199 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); | 200 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); |
| 200 return promise; | 201 return promise; |
| 201 } | 202 } |
| 202 | 203 |
| 203 service_requests_.insert(resolver); | 204 service_requests_.insert(resolver); |
| 204 | 205 |
| 205 // m_streamTrack->component()->source()->id() is the renderer "name" of the | 206 // m_streamTrack->component()->source()->id() is the renderer "name" of the |
| 206 // camera; | 207 // camera; |
| 207 // TODO(mcasas) consider sending the security origin as well: | 208 // TODO(mcasas) consider sending the security origin as well: |
| 208 // scriptState->getExecutionContext()->getSecurityOrigin()->toString() | 209 // scriptState->getExecutionContext()->getSecurityOrigin()->toString() |
| 209 service_->TakePhoto(stream_track_->Component()->Source()->Id(), | 210 service_->TakePhoto(stream_track_->Component()->Source()->Id(), |
| 210 ConvertToBaseCallback(WTF::Bind( | 211 ConvertToBaseCallback(WTF::Bind( |
| 211 &ImageCapture::OnTakePhoto, WrapPersistent(this), | 212 &ImageCapture::OnMojoTakePhoto, WrapPersistent(this), |
| 212 WrapPersistent(resolver)))); | 213 WrapPersistent(resolver)))); |
| 213 return promise; | 214 return promise; |
| 214 } | 215 } |
| 215 | 216 |
| 217 ScriptPromise ImageCapture::takePhoto(ScriptState* script_state, |
| 218 const PhotoSettings& photo_settings) { |
| 219 return setOptions(script_state, photo_settings, |
| 220 true /* trigger_take_photo */); |
| 221 } |
| 222 |
| 216 ScriptPromise ImageCapture::grabFrame(ScriptState* script_state) { | 223 ScriptPromise ImageCapture::grabFrame(ScriptState* script_state) { |
| 217 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); | 224 ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); |
| 218 ScriptPromise promise = resolver->Promise(); | 225 ScriptPromise promise = resolver->Promise(); |
| 219 | 226 |
| 220 if (TrackIsInactive(*stream_track_)) { | 227 if (TrackIsInactive(*stream_track_)) { |
| 221 resolver->Reject(DOMException::Create( | 228 resolver->Reject(DOMException::Create( |
| 222 kInvalidStateError, "The associated Track is in an invalid state.")); | 229 kInvalidStateError, "The associated Track is in an invalid state.")); |
| 223 return promise; | 230 return promise; |
| 224 } | 231 } |
| 225 | 232 |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 } | 382 } |
| 376 | 383 |
| 377 // TODO(mcasas): support ConstrainBooleanParameters where applicable. | 384 // TODO(mcasas): support ConstrainBooleanParameters where applicable. |
| 378 settings->has_torch = | 385 settings->has_torch = |
| 379 constraints.hasTorch() && constraints.torch().isBoolean(); | 386 constraints.hasTorch() && constraints.torch().isBoolean(); |
| 380 if (settings->has_torch) { | 387 if (settings->has_torch) { |
| 381 current_constraints_.setTorch(constraints.torch()); | 388 current_constraints_.setTorch(constraints.torch()); |
| 382 settings->torch = constraints.torch().getAsBoolean(); | 389 settings->torch = constraints.torch().getAsBoolean(); |
| 383 } | 390 } |
| 384 | 391 |
| 385 service_->SetOptions(stream_track_->Component()->Source()->Id(), | 392 service_->SetOptions( |
| 386 std::move(settings), | 393 stream_track_->Component()->Source()->Id(), std::move(settings), |
| 387 ConvertToBaseCallback(WTF::Bind( | 394 ConvertToBaseCallback( |
| 388 &ImageCapture::OnSetOptions, WrapPersistent(this), | 395 WTF::Bind(&ImageCapture::OnMojoSetOptions, WrapPersistent(this), |
| 389 WrapPersistent(resolver)))); | 396 WrapPersistent(resolver), false /* trigger_take_photo */))); |
| 390 } | 397 } |
| 391 | 398 |
| 392 const MediaTrackConstraintSet& ImageCapture::GetMediaTrackConstraints() const { | 399 const MediaTrackConstraintSet& ImageCapture::GetMediaTrackConstraints() const { |
| 393 return current_constraints_; | 400 return current_constraints_; |
| 394 } | 401 } |
| 395 | 402 |
| 396 void ImageCapture::ClearMediaTrackConstraints(ScriptPromiseResolver* resolver) { | 403 void ImageCapture::ClearMediaTrackConstraints(ScriptPromiseResolver* resolver) { |
| 397 current_constraints_ = MediaTrackConstraintSet(); | 404 current_constraints_ = MediaTrackConstraintSet(); |
| 398 resolver->Resolve(); | 405 resolver->Resolve(); |
| 399 | 406 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 Platform::Current()->GetInterfaceProvider()->GetInterface( | 477 Platform::Current()->GetInterfaceProvider()->GetInterface( |
| 471 mojo::MakeRequest(&service_)); | 478 mojo::MakeRequest(&service_)); |
| 472 | 479 |
| 473 service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( | 480 service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( |
| 474 &ImageCapture::OnServiceConnectionError, WrapWeakPersistent(this)))); | 481 &ImageCapture::OnServiceConnectionError, WrapWeakPersistent(this)))); |
| 475 | 482 |
| 476 // Launch a retrieval of the current capabilities, which arrive asynchronously | 483 // Launch a retrieval of the current capabilities, which arrive asynchronously |
| 477 // to avoid blocking the main UI thread. | 484 // to avoid blocking the main UI thread. |
| 478 service_->GetCapabilities( | 485 service_->GetCapabilities( |
| 479 stream_track_->Component()->Source()->Id(), | 486 stream_track_->Component()->Source()->Id(), |
| 480 ConvertToBaseCallback(WTF::Bind(&ImageCapture::OnCapabilitiesUpdate, | 487 ConvertToBaseCallback(WTF::Bind( |
| 481 WrapPersistent(this)))); | 488 &ImageCapture::UpdateMediaTrackCapabilities, WrapPersistent(this)))); |
| 482 } | 489 } |
| 483 | 490 |
| 484 void ImageCapture::OnPhotoCapabilities( | 491 void ImageCapture::OnMojoPhotoCapabilities( |
| 485 ScriptPromiseResolver* resolver, | 492 ScriptPromiseResolver* resolver, |
| 493 bool trigger_take_photo, |
| 486 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 494 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
| 487 if (!service_requests_.Contains(resolver)) | 495 if (!service_requests_.Contains(resolver)) |
| 488 return; | 496 return; |
| 497 |
| 489 if (capabilities.is_null()) { | 498 if (capabilities.is_null()) { |
| 490 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); | 499 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); |
| 491 } else { | 500 service_requests_.erase(resolver); |
| 492 // Update the local capabilities cache. | 501 return; |
| 493 OnCapabilitiesUpdateInternal(*capabilities); | 502 } |
| 494 | 503 |
| 495 PhotoCapabilities* caps = PhotoCapabilities::Create(); | 504 PhotoCapabilities* caps = PhotoCapabilities::Create(); |
| 505 caps->SetRedEyeReduction(capabilities->red_eye_reduction); |
| 506 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
| 507 // mojo::StructTraits supports garbage-collected mappings, |
| 508 // https://crbug.com/700180. |
| 509 if (capabilities->height->min != 0 || capabilities->height->max != 0) { |
| 510 caps->SetImageHeight( |
| 511 MediaSettingsRange::Create(std::move(capabilities->height))); |
| 512 } |
| 513 if (capabilities->width->min != 0 || capabilities->width->max != 0) { |
| 514 caps->SetImageWidth( |
| 515 MediaSettingsRange::Create(std::move(capabilities->width))); |
| 516 } |
| 517 if (!capabilities->fill_light_mode.IsEmpty()) |
| 518 caps->SetFillLightMode(capabilities->fill_light_mode); |
| 496 | 519 |
| 497 caps->SetRedEyeReduction(capabilities->red_eye_reduction); | 520 // Update the local track capabilities cache. |
| 498 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 521 UpdateMediaTrackCapabilities(std::move(capabilities)); |
| 499 // mojo::StructTraits supports garbage-collected mappings, | |
| 500 // https://crbug.com/700180. | |
| 501 if (capabilities->height->min != 0 || capabilities->height->max != 0) { | |
| 502 caps->SetImageHeight( | |
| 503 MediaSettingsRange::Create(std::move(capabilities->height))); | |
| 504 } | |
| 505 if (capabilities->width->min != 0 || capabilities->width->max != 0) { | |
| 506 caps->SetImageWidth( | |
| 507 MediaSettingsRange::Create(std::move(capabilities->width))); | |
| 508 } | |
| 509 | 522 |
| 510 if (!capabilities->fill_light_mode.IsEmpty()) | 523 if (trigger_take_photo) { |
| 511 caps->SetFillLightMode(capabilities->fill_light_mode); | 524 service_->TakePhoto(stream_track_->Component()->Source()->Id(), |
| 525 ConvertToBaseCallback(WTF::Bind( |
| 526 &ImageCapture::OnMojoTakePhoto, |
| 527 WrapPersistent(this), WrapPersistent(resolver)))); |
| 528 return; |
| 529 } |
| 512 | 530 |
| 513 resolver->Resolve(caps); | 531 resolver->Resolve(caps); |
| 514 } | |
| 515 service_requests_.erase(resolver); | 532 service_requests_.erase(resolver); |
| 516 } | 533 } |
| 517 | 534 |
| 518 void ImageCapture::OnSetOptions(ScriptPromiseResolver* resolver, bool result) { | 535 void ImageCapture::OnMojoSetOptions(ScriptPromiseResolver* resolver, |
| 536 bool trigger_take_photo, |
| 537 bool result) { |
| 519 if (!service_requests_.Contains(resolver)) | 538 if (!service_requests_.Contains(resolver)) |
| 520 return; | 539 return; |
| 521 | 540 |
| 522 if (!result) { | 541 if (!result) { |
| 523 resolver->Reject(DOMException::Create(kUnknownError, "setOptions failed")); | 542 resolver->Reject(DOMException::Create(kUnknownError, "setOptions failed")); |
| 524 service_requests_.erase(resolver); | 543 service_requests_.erase(resolver); |
| 525 return; | 544 return; |
| 526 } | 545 } |
| 527 | 546 |
| 528 // Retrieve the current device status after setting the options. | 547 // Retrieve the current device status after setting the options. |
| 529 service_->GetCapabilities( | 548 service_->GetCapabilities( |
| 530 stream_track_->Component()->Source()->Id(), | 549 stream_track_->Component()->Source()->Id(), |
| 531 ConvertToBaseCallback(WTF::Bind(&ImageCapture::OnPhotoCapabilities, | 550 ConvertToBaseCallback(WTF::Bind( |
| 532 WrapPersistent(this), | 551 &ImageCapture::OnMojoPhotoCapabilities, WrapPersistent(this), |
| 533 WrapPersistent(resolver)))); | 552 WrapPersistent(resolver), trigger_take_photo))); |
| 534 } | 553 } |
| 535 | 554 |
| 536 void ImageCapture::OnTakePhoto(ScriptPromiseResolver* resolver, | 555 void ImageCapture::OnMojoTakePhoto(ScriptPromiseResolver* resolver, |
| 537 media::mojom::blink::BlobPtr blob) { | 556 media::mojom::blink::BlobPtr blob) { |
| 538 if (!service_requests_.Contains(resolver)) | 557 if (!service_requests_.Contains(resolver)) |
| 539 return; | 558 return; |
| 540 | 559 |
| 541 // TODO(mcasas): Should be using a mojo::StructTraits. | 560 // TODO(mcasas): Should be using a mojo::StructTraits. |
| 542 if (blob->data.IsEmpty()) | 561 if (blob->data.IsEmpty()) { |
| 543 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); | 562 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); |
| 544 else | 563 } else { |
| 545 resolver->Resolve( | 564 resolver->Resolve( |
| 546 Blob::Create(blob->data.Data(), blob->data.size(), blob->mime_type)); | 565 Blob::Create(blob->data.Data(), blob->data.size(), blob->mime_type)); |
| 566 } |
| 547 service_requests_.erase(resolver); | 567 service_requests_.erase(resolver); |
| 548 } | 568 } |
| 549 | 569 |
| 550 void ImageCapture::OnCapabilitiesUpdate( | 570 void ImageCapture::UpdateMediaTrackCapabilities( |
| 551 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 571 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
| 552 if (!capabilities.is_null()) | 572 if (!capabilities) |
| 553 OnCapabilitiesUpdateInternal(*capabilities); | 573 return; |
| 554 } | |
| 555 | 574 |
| 556 void ImageCapture::OnCapabilitiesUpdateInternal( | |
| 557 const media::mojom::blink::PhotoCapabilities& capabilities) { | |
| 558 WTF::Vector<WTF::String> supported_white_balance_modes; | 575 WTF::Vector<WTF::String> supported_white_balance_modes; |
| 559 supported_white_balance_modes.ReserveInitialCapacity( | 576 supported_white_balance_modes.ReserveInitialCapacity( |
| 560 capabilities.supported_white_balance_modes.size()); | 577 capabilities->supported_white_balance_modes.size()); |
| 561 for (const auto& supported_mode : capabilities.supported_white_balance_modes) | 578 for (const auto& supported_mode : capabilities->supported_white_balance_modes) |
| 562 supported_white_balance_modes.push_back(ToString(supported_mode)); | 579 supported_white_balance_modes.push_back(ToString(supported_mode)); |
| 563 if (!supported_white_balance_modes.IsEmpty()) { | 580 if (!supported_white_balance_modes.IsEmpty()) { |
| 564 capabilities_.setWhiteBalanceMode(std::move(supported_white_balance_modes)); | 581 capabilities_.setWhiteBalanceMode(std::move(supported_white_balance_modes)); |
| 565 settings_.setWhiteBalanceMode( | 582 settings_.setWhiteBalanceMode( |
| 566 ToString(capabilities.current_white_balance_mode)); | 583 ToString(capabilities->current_white_balance_mode)); |
| 567 } | 584 } |
| 568 | 585 |
| 569 WTF::Vector<WTF::String> supported_exposure_modes; | 586 WTF::Vector<WTF::String> supported_exposure_modes; |
| 570 supported_exposure_modes.ReserveInitialCapacity( | 587 supported_exposure_modes.ReserveInitialCapacity( |
| 571 capabilities.supported_exposure_modes.size()); | 588 capabilities->supported_exposure_modes.size()); |
| 572 for (const auto& supported_mode : capabilities.supported_exposure_modes) | 589 for (const auto& supported_mode : capabilities->supported_exposure_modes) |
| 573 supported_exposure_modes.push_back(ToString(supported_mode)); | 590 supported_exposure_modes.push_back(ToString(supported_mode)); |
| 574 if (!supported_exposure_modes.IsEmpty()) { | 591 if (!supported_exposure_modes.IsEmpty()) { |
| 575 capabilities_.setExposureMode(std::move(supported_exposure_modes)); | 592 capabilities_.setExposureMode(std::move(supported_exposure_modes)); |
| 576 settings_.setExposureMode(ToString(capabilities.current_exposure_mode)); | 593 settings_.setExposureMode(ToString(capabilities->current_exposure_mode)); |
| 577 } | 594 } |
| 578 | 595 |
| 579 WTF::Vector<WTF::String> supported_focus_modes; | 596 WTF::Vector<WTF::String> supported_focus_modes; |
| 580 supported_focus_modes.ReserveInitialCapacity( | 597 supported_focus_modes.ReserveInitialCapacity( |
| 581 capabilities.supported_focus_modes.size()); | 598 capabilities->supported_focus_modes.size()); |
| 582 for (const auto& supported_mode : capabilities.supported_focus_modes) | 599 for (const auto& supported_mode : capabilities->supported_focus_modes) |
| 583 supported_focus_modes.push_back(ToString(supported_mode)); | 600 supported_focus_modes.push_back(ToString(supported_mode)); |
| 584 if (!supported_focus_modes.IsEmpty()) { | 601 if (!supported_focus_modes.IsEmpty()) { |
| 585 capabilities_.setFocusMode(std::move(supported_focus_modes)); | 602 capabilities_.setFocusMode(std::move(supported_focus_modes)); |
| 586 settings_.setFocusMode(ToString(capabilities.current_focus_mode)); | 603 settings_.setFocusMode(ToString(capabilities->current_focus_mode)); |
| 587 } | 604 } |
| 588 | 605 |
| 589 HeapVector<Point2D> current_points_of_interest; | 606 HeapVector<Point2D> current_points_of_interest; |
| 590 if (!capabilities.points_of_interest.IsEmpty()) { | 607 if (!capabilities->points_of_interest.IsEmpty()) { |
| 591 for (const auto& point : capabilities.points_of_interest) { | 608 for (const auto& point : capabilities->points_of_interest) { |
| 592 Point2D web_point; | 609 Point2D web_point; |
| 593 web_point.setX(point->x); | 610 web_point.setX(point->x); |
| 594 web_point.setY(point->y); | 611 web_point.setY(point->y); |
| 595 current_points_of_interest.push_back(mojo::Clone(web_point)); | 612 current_points_of_interest.push_back(mojo::Clone(web_point)); |
| 596 } | 613 } |
| 597 } | 614 } |
| 598 settings_.setPointsOfInterest(std::move(current_points_of_interest)); | 615 settings_.setPointsOfInterest(std::move(current_points_of_interest)); |
| 599 | 616 |
| 600 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 617 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
| 601 // mojo::StructTraits supports garbage-collected mappings, | 618 // mojo::StructTraits supports garbage-collected mappings, |
| 602 // https://crbug.com/700180. | 619 // https://crbug.com/700180. |
| 603 if (capabilities.exposure_compensation->max != | 620 if (capabilities->exposure_compensation->max != |
| 604 capabilities.exposure_compensation->min) { | 621 capabilities->exposure_compensation->min) { |
| 605 capabilities_.setExposureCompensation( | 622 capabilities_.setExposureCompensation( |
| 606 MediaSettingsRange::Create(*capabilities.exposure_compensation)); | 623 MediaSettingsRange::Create(*capabilities->exposure_compensation)); |
| 607 settings_.setExposureCompensation( | 624 settings_.setExposureCompensation( |
| 608 capabilities.exposure_compensation->current); | 625 capabilities->exposure_compensation->current); |
| 609 } | 626 } |
| 610 if (capabilities.color_temperature->max != | 627 if (capabilities->color_temperature->max != |
| 611 capabilities.color_temperature->min) { | 628 capabilities->color_temperature->min) { |
| 612 capabilities_.setColorTemperature( | 629 capabilities_.setColorTemperature( |
| 613 MediaSettingsRange::Create(*capabilities.color_temperature)); | 630 MediaSettingsRange::Create(*capabilities->color_temperature)); |
| 614 settings_.setColorTemperature(capabilities.color_temperature->current); | 631 settings_.setColorTemperature(capabilities->color_temperature->current); |
| 615 } | 632 } |
| 616 if (capabilities.iso->max != capabilities.iso->min) { | 633 if (capabilities->iso->max != capabilities->iso->min) { |
| 617 capabilities_.setIso(MediaSettingsRange::Create(*capabilities.iso)); | 634 capabilities_.setIso(MediaSettingsRange::Create(*capabilities->iso)); |
| 618 settings_.setIso(capabilities.iso->current); | 635 settings_.setIso(capabilities->iso->current); |
| 619 } | 636 } |
| 620 | 637 |
| 621 if (capabilities.brightness->max != capabilities.brightness->min) { | 638 if (capabilities->brightness->max != capabilities->brightness->min) { |
| 622 capabilities_.setBrightness( | 639 capabilities_.setBrightness( |
| 623 MediaSettingsRange::Create(*capabilities.brightness)); | 640 MediaSettingsRange::Create(*capabilities->brightness)); |
| 624 settings_.setBrightness(capabilities.brightness->current); | 641 settings_.setBrightness(capabilities->brightness->current); |
| 625 } | 642 } |
| 626 if (capabilities.contrast->max != capabilities.contrast->min) { | 643 if (capabilities->contrast->max != capabilities->contrast->min) { |
| 627 capabilities_.setContrast( | 644 capabilities_.setContrast( |
| 628 MediaSettingsRange::Create(*capabilities.contrast)); | 645 MediaSettingsRange::Create(*capabilities->contrast)); |
| 629 settings_.setContrast(capabilities.contrast->current); | 646 settings_.setContrast(capabilities->contrast->current); |
| 630 } | 647 } |
| 631 if (capabilities.saturation->max != capabilities.saturation->min) { | 648 if (capabilities->saturation->max != capabilities->saturation->min) { |
| 632 capabilities_.setSaturation( | 649 capabilities_.setSaturation( |
| 633 MediaSettingsRange::Create(*capabilities.saturation)); | 650 MediaSettingsRange::Create(*capabilities->saturation)); |
| 634 settings_.setSaturation(capabilities.saturation->current); | 651 settings_.setSaturation(capabilities->saturation->current); |
| 635 } | 652 } |
| 636 if (capabilities.sharpness->max != capabilities.sharpness->min) { | 653 if (capabilities->sharpness->max != capabilities->sharpness->min) { |
| 637 capabilities_.setSharpness( | 654 capabilities_.setSharpness( |
| 638 MediaSettingsRange::Create(*capabilities.sharpness)); | 655 MediaSettingsRange::Create(*capabilities->sharpness)); |
| 639 settings_.setSharpness(capabilities.sharpness->current); | 656 settings_.setSharpness(capabilities->sharpness->current); |
| 640 } | 657 } |
| 641 | 658 |
| 642 if (capabilities.zoom->max != capabilities.zoom->min) { | 659 if (capabilities->zoom->max != capabilities->zoom->min) { |
| 643 capabilities_.setZoom(MediaSettingsRange::Create(*capabilities.zoom)); | 660 capabilities_.setZoom(MediaSettingsRange::Create(*capabilities->zoom)); |
| 644 settings_.setZoom(capabilities.zoom->current); | 661 settings_.setZoom(capabilities->zoom->current); |
| 645 } | 662 } |
| 646 | 663 |
| 647 if (capabilities.supports_torch) | 664 if (capabilities->supports_torch) |
| 648 capabilities_.setTorch(capabilities.supports_torch); | 665 capabilities_.setTorch(capabilities->supports_torch); |
| 649 if (capabilities.supports_torch) | 666 if (capabilities->supports_torch) |
| 650 settings_.setTorch(capabilities.torch); | 667 settings_.setTorch(capabilities->torch); |
| 651 } | 668 } |
| 652 | 669 |
| 653 void ImageCapture::OnServiceConnectionError() { | 670 void ImageCapture::OnServiceConnectionError() { |
| 654 service_.reset(); | 671 service_.reset(); |
| 655 for (ScriptPromiseResolver* resolver : service_requests_) | 672 for (ScriptPromiseResolver* resolver : service_requests_) |
| 656 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); | 673 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); |
| 657 service_requests_.Clear(); | 674 service_requests_.Clear(); |
| 658 } | 675 } |
| 659 | 676 |
| 660 DEFINE_TRACE(ImageCapture) { | 677 DEFINE_TRACE(ImageCapture) { |
| 661 visitor->Trace(stream_track_); | 678 visitor->Trace(stream_track_); |
| 662 visitor->Trace(capabilities_); | 679 visitor->Trace(capabilities_); |
| 663 visitor->Trace(settings_); | 680 visitor->Trace(settings_); |
| 664 visitor->Trace(current_constraints_); | 681 visitor->Trace(current_constraints_); |
| 665 visitor->Trace(service_requests_); | 682 visitor->Trace(service_requests_); |
| 666 EventTargetWithInlineData::Trace(visitor); | 683 EventTargetWithInlineData::Trace(visitor); |
| 667 ContextLifecycleObserver::Trace(visitor); | 684 ContextLifecycleObserver::Trace(visitor); |
| 668 } | 685 } |
| 669 | 686 |
| 670 } // namespace blink | 687 } // namespace blink |
| OLD | NEW |