| 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 } | 381 } |
| 375 | 382 |
| 376 // TODO(mcasas): support ConstrainBooleanParameters where applicable. | 383 // TODO(mcasas): support ConstrainBooleanParameters where applicable. |
| 377 settings->has_torch = | 384 settings->has_torch = |
| 378 constraints.hasTorch() && constraints.torch().isBoolean(); | 385 constraints.hasTorch() && constraints.torch().isBoolean(); |
| 379 if (settings->has_torch) { | 386 if (settings->has_torch) { |
| 380 current_constraints_.setTorch(constraints.torch()); | 387 current_constraints_.setTorch(constraints.torch()); |
| 381 settings->torch = constraints.torch().getAsBoolean(); | 388 settings->torch = constraints.torch().getAsBoolean(); |
| 382 } | 389 } |
| 383 | 390 |
| 384 service_->SetOptions(stream_track_->Component()->Source()->Id(), | 391 service_->SetOptions( |
| 385 std::move(settings), | 392 stream_track_->Component()->Source()->Id(), std::move(settings), |
| 386 ConvertToBaseCallback(WTF::Bind( | 393 ConvertToBaseCallback( |
| 387 &ImageCapture::OnSetOptions, WrapPersistent(this), | 394 WTF::Bind(&ImageCapture::OnMojoSetOptions, WrapPersistent(this), |
| 388 WrapPersistent(resolver)))); | 395 WrapPersistent(resolver), false /* trigger_take_photo */))); |
| 389 } | 396 } |
| 390 | 397 |
| 391 const MediaTrackConstraintSet& ImageCapture::GetMediaTrackConstraints() const { | 398 const MediaTrackConstraintSet& ImageCapture::GetMediaTrackConstraints() const { |
| 392 return current_constraints_; | 399 return current_constraints_; |
| 393 } | 400 } |
| 394 | 401 |
| 395 void ImageCapture::ClearMediaTrackConstraints(ScriptPromiseResolver* resolver) { | 402 void ImageCapture::ClearMediaTrackConstraints(ScriptPromiseResolver* resolver) { |
| 396 current_constraints_ = MediaTrackConstraintSet(); | 403 current_constraints_ = MediaTrackConstraintSet(); |
| 397 resolver->Resolve(); | 404 resolver->Resolve(); |
| 398 | 405 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 Platform::Current()->GetInterfaceProvider()->GetInterface( | 476 Platform::Current()->GetInterfaceProvider()->GetInterface( |
| 470 mojo::MakeRequest(&service_)); | 477 mojo::MakeRequest(&service_)); |
| 471 | 478 |
| 472 service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( | 479 service_.set_connection_error_handler(ConvertToBaseCallback(WTF::Bind( |
| 473 &ImageCapture::OnServiceConnectionError, WrapWeakPersistent(this)))); | 480 &ImageCapture::OnServiceConnectionError, WrapWeakPersistent(this)))); |
| 474 | 481 |
| 475 // Launch a retrieval of the current capabilities, which arrive asynchronously | 482 // Launch a retrieval of the current capabilities, which arrive asynchronously |
| 476 // to avoid blocking the main UI thread. | 483 // to avoid blocking the main UI thread. |
| 477 service_->GetCapabilities( | 484 service_->GetCapabilities( |
| 478 stream_track_->Component()->Source()->Id(), | 485 stream_track_->Component()->Source()->Id(), |
| 479 ConvertToBaseCallback(WTF::Bind(&ImageCapture::OnCapabilitiesUpdate, | 486 ConvertToBaseCallback(WTF::Bind( |
| 480 WrapPersistent(this)))); | 487 &ImageCapture::UpdateMediaTrackCapabilities, WrapPersistent(this)))); |
| 481 } | 488 } |
| 482 | 489 |
| 483 void ImageCapture::OnPhotoCapabilities( | 490 void ImageCapture::OnMojoPhotoCapabilities( |
| 484 ScriptPromiseResolver* resolver, | 491 ScriptPromiseResolver* resolver, |
| 492 bool trigger_take_photo, |
| 485 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 493 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
| 486 if (!service_requests_.Contains(resolver)) | 494 if (!service_requests_.Contains(resolver)) |
| 487 return; | 495 return; |
| 496 |
| 488 if (capabilities.is_null()) { | 497 if (capabilities.is_null()) { |
| 489 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); | 498 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); |
| 490 } else { | 499 service_requests_.erase(resolver); |
| 491 // Update the local capabilities cache. | 500 return; |
| 492 OnCapabilitiesUpdateInternal(*capabilities); | 501 } |
| 493 | 502 |
| 494 PhotoCapabilities* caps = PhotoCapabilities::Create(); | 503 PhotoCapabilities* caps = PhotoCapabilities::Create(); |
| 504 caps->SetRedEyeReduction(capabilities->red_eye_reduction); |
| 505 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
| 506 // mojo::StructTraits supports garbage-collected mappings, |
| 507 // https://crbug.com/700180. |
| 508 if (capabilities->height->min != 0 || capabilities->height->max != 0) { |
| 509 caps->SetImageHeight( |
| 510 MediaSettingsRange::Create(std::move(capabilities->height))); |
| 511 } |
| 512 if (capabilities->width->min != 0 || capabilities->width->max != 0) { |
| 513 caps->SetImageWidth( |
| 514 MediaSettingsRange::Create(std::move(capabilities->width))); |
| 515 } |
| 516 if (!capabilities->fill_light_mode.IsEmpty()) |
| 517 caps->SetFillLightMode(capabilities->fill_light_mode); |
| 495 | 518 |
| 496 caps->SetRedEyeReduction(capabilities->red_eye_reduction); | 519 // Update the local track capabilities cache. |
| 497 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 520 UpdateMediaTrackCapabilities(std::move(capabilities)); |
| 498 // mojo::StructTraits supports garbage-collected mappings, | |
| 499 // https://crbug.com/700180. | |
| 500 if (capabilities->height->min != 0 || capabilities->height->max != 0) { | |
| 501 caps->SetImageHeight( | |
| 502 MediaSettingsRange::Create(std::move(capabilities->height))); | |
| 503 } | |
| 504 if (capabilities->width->min != 0 || capabilities->width->max != 0) { | |
| 505 caps->SetImageWidth( | |
| 506 MediaSettingsRange::Create(std::move(capabilities->width))); | |
| 507 } | |
| 508 | 521 |
| 509 if (!capabilities->fill_light_mode.IsEmpty()) | 522 if (trigger_take_photo) { |
| 510 caps->SetFillLightMode(capabilities->fill_light_mode); | 523 service_->TakePhoto(stream_track_->Component()->Source()->Id(), |
| 524 ConvertToBaseCallback(WTF::Bind( |
| 525 &ImageCapture::OnMojoTakePhoto, |
| 526 WrapPersistent(this), WrapPersistent(resolver)))); |
| 527 return; |
| 528 } |
| 511 | 529 |
| 512 resolver->Resolve(caps); | 530 resolver->Resolve(caps); |
| 513 } | |
| 514 service_requests_.erase(resolver); | 531 service_requests_.erase(resolver); |
| 515 } | 532 } |
| 516 | 533 |
| 517 void ImageCapture::OnSetOptions(ScriptPromiseResolver* resolver, bool result) { | 534 void ImageCapture::OnMojoSetOptions(ScriptPromiseResolver* resolver, |
| 535 bool trigger_take_photo, |
| 536 bool result) { |
| 518 if (!service_requests_.Contains(resolver)) | 537 if (!service_requests_.Contains(resolver)) |
| 519 return; | 538 return; |
| 520 | 539 |
| 521 if (!result) { | 540 if (!result) { |
| 522 resolver->Reject(DOMException::Create(kUnknownError, "setOptions failed")); | 541 resolver->Reject(DOMException::Create(kUnknownError, "setOptions failed")); |
| 523 service_requests_.erase(resolver); | 542 service_requests_.erase(resolver); |
| 524 return; | 543 return; |
| 525 } | 544 } |
| 526 | 545 |
| 527 // Retrieve the current device status after setting the options. | 546 // Retrieve the current device status after setting the options. |
| 528 service_->GetCapabilities( | 547 service_->GetCapabilities( |
| 529 stream_track_->Component()->Source()->Id(), | 548 stream_track_->Component()->Source()->Id(), |
| 530 ConvertToBaseCallback(WTF::Bind(&ImageCapture::OnPhotoCapabilities, | 549 ConvertToBaseCallback(WTF::Bind( |
| 531 WrapPersistent(this), | 550 &ImageCapture::OnMojoPhotoCapabilities, WrapPersistent(this), |
| 532 WrapPersistent(resolver)))); | 551 WrapPersistent(resolver), trigger_take_photo))); |
| 533 } | 552 } |
| 534 | 553 |
| 535 void ImageCapture::OnTakePhoto(ScriptPromiseResolver* resolver, | 554 void ImageCapture::OnMojoTakePhoto(ScriptPromiseResolver* resolver, |
| 536 media::mojom::blink::BlobPtr blob) { | 555 media::mojom::blink::BlobPtr blob) { |
| 537 if (!service_requests_.Contains(resolver)) | 556 if (!service_requests_.Contains(resolver)) |
| 538 return; | 557 return; |
| 539 | 558 |
| 540 // TODO(mcasas): Should be using a mojo::StructTraits. | 559 // TODO(mcasas): Should be using a mojo::StructTraits. |
| 541 if (blob->data.IsEmpty()) | 560 if (blob->data.IsEmpty()) { |
| 542 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); | 561 resolver->Reject(DOMException::Create(kUnknownError, "platform error")); |
| 543 else | 562 } else { |
| 544 resolver->Resolve( | 563 resolver->Resolve( |
| 545 Blob::Create(blob->data.data(), blob->data.size(), blob->mime_type)); | 564 Blob::Create(blob->data.data(), blob->data.size(), blob->mime_type)); |
| 565 } |
| 546 service_requests_.erase(resolver); | 566 service_requests_.erase(resolver); |
| 547 } | 567 } |
| 548 | 568 |
| 549 void ImageCapture::OnCapabilitiesUpdate( | 569 void ImageCapture::UpdateMediaTrackCapabilities( |
| 550 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { | 570 media::mojom::blink::PhotoCapabilitiesPtr capabilities) { |
| 551 if (!capabilities.is_null()) | 571 if (!capabilities) |
| 552 OnCapabilitiesUpdateInternal(*capabilities); | 572 return; |
| 553 } | |
| 554 | 573 |
| 555 void ImageCapture::OnCapabilitiesUpdateInternal( | |
| 556 const media::mojom::blink::PhotoCapabilities& capabilities) { | |
| 557 WTF::Vector<WTF::String> supported_white_balance_modes; | 574 WTF::Vector<WTF::String> supported_white_balance_modes; |
| 558 supported_white_balance_modes.ReserveInitialCapacity( | 575 supported_white_balance_modes.ReserveInitialCapacity( |
| 559 capabilities.supported_white_balance_modes.size()); | 576 capabilities->supported_white_balance_modes.size()); |
| 560 for (const auto& supported_mode : capabilities.supported_white_balance_modes) | 577 for (const auto& supported_mode : capabilities->supported_white_balance_modes) |
| 561 supported_white_balance_modes.push_back(ToString(supported_mode)); | 578 supported_white_balance_modes.push_back(ToString(supported_mode)); |
| 562 if (!supported_white_balance_modes.IsEmpty()) { | 579 if (!supported_white_balance_modes.IsEmpty()) { |
| 563 capabilities_.setWhiteBalanceMode(std::move(supported_white_balance_modes)); | 580 capabilities_.setWhiteBalanceMode(std::move(supported_white_balance_modes)); |
| 564 settings_.setWhiteBalanceMode( | 581 settings_.setWhiteBalanceMode( |
| 565 ToString(capabilities.current_white_balance_mode)); | 582 ToString(capabilities->current_white_balance_mode)); |
| 566 } | 583 } |
| 567 | 584 |
| 568 WTF::Vector<WTF::String> supported_exposure_modes; | 585 WTF::Vector<WTF::String> supported_exposure_modes; |
| 569 supported_exposure_modes.ReserveInitialCapacity( | 586 supported_exposure_modes.ReserveInitialCapacity( |
| 570 capabilities.supported_exposure_modes.size()); | 587 capabilities->supported_exposure_modes.size()); |
| 571 for (const auto& supported_mode : capabilities.supported_exposure_modes) | 588 for (const auto& supported_mode : capabilities->supported_exposure_modes) |
| 572 supported_exposure_modes.push_back(ToString(supported_mode)); | 589 supported_exposure_modes.push_back(ToString(supported_mode)); |
| 573 if (!supported_exposure_modes.IsEmpty()) { | 590 if (!supported_exposure_modes.IsEmpty()) { |
| 574 capabilities_.setExposureMode(std::move(supported_exposure_modes)); | 591 capabilities_.setExposureMode(std::move(supported_exposure_modes)); |
| 575 settings_.setExposureMode(ToString(capabilities.current_exposure_mode)); | 592 settings_.setExposureMode(ToString(capabilities->current_exposure_mode)); |
| 576 } | 593 } |
| 577 | 594 |
| 578 WTF::Vector<WTF::String> supported_focus_modes; | 595 WTF::Vector<WTF::String> supported_focus_modes; |
| 579 supported_focus_modes.ReserveInitialCapacity( | 596 supported_focus_modes.ReserveInitialCapacity( |
| 580 capabilities.supported_focus_modes.size()); | 597 capabilities->supported_focus_modes.size()); |
| 581 for (const auto& supported_mode : capabilities.supported_focus_modes) | 598 for (const auto& supported_mode : capabilities->supported_focus_modes) |
| 582 supported_focus_modes.push_back(ToString(supported_mode)); | 599 supported_focus_modes.push_back(ToString(supported_mode)); |
| 583 if (!supported_focus_modes.IsEmpty()) { | 600 if (!supported_focus_modes.IsEmpty()) { |
| 584 capabilities_.setFocusMode(std::move(supported_focus_modes)); | 601 capabilities_.setFocusMode(std::move(supported_focus_modes)); |
| 585 settings_.setFocusMode(ToString(capabilities.current_focus_mode)); | 602 settings_.setFocusMode(ToString(capabilities->current_focus_mode)); |
| 586 } | 603 } |
| 587 | 604 |
| 588 HeapVector<Point2D> current_points_of_interest; | 605 HeapVector<Point2D> current_points_of_interest; |
| 589 if (!capabilities.points_of_interest.IsEmpty()) { | 606 if (!capabilities->points_of_interest.IsEmpty()) { |
| 590 for (const auto& point : capabilities.points_of_interest) { | 607 for (const auto& point : capabilities->points_of_interest) { |
| 591 Point2D web_point; | 608 Point2D web_point; |
| 592 web_point.setX(point->x); | 609 web_point.setX(point->x); |
| 593 web_point.setY(point->y); | 610 web_point.setY(point->y); |
| 594 current_points_of_interest.push_back(mojo::Clone(web_point)); | 611 current_points_of_interest.push_back(mojo::Clone(web_point)); |
| 595 } | 612 } |
| 596 } | 613 } |
| 597 settings_.setPointsOfInterest(std::move(current_points_of_interest)); | 614 settings_.setPointsOfInterest(std::move(current_points_of_interest)); |
| 598 | 615 |
| 599 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when | 616 // TODO(mcasas): Remove the explicit MediaSettingsRange::create() when |
| 600 // mojo::StructTraits supports garbage-collected mappings, | 617 // mojo::StructTraits supports garbage-collected mappings, |
| 601 // https://crbug.com/700180. | 618 // https://crbug.com/700180. |
| 602 if (capabilities.exposure_compensation->max != | 619 if (capabilities->exposure_compensation->max != |
| 603 capabilities.exposure_compensation->min) { | 620 capabilities->exposure_compensation->min) { |
| 604 capabilities_.setExposureCompensation( | 621 capabilities_.setExposureCompensation( |
| 605 MediaSettingsRange::Create(*capabilities.exposure_compensation)); | 622 MediaSettingsRange::Create(*capabilities->exposure_compensation)); |
| 606 settings_.setExposureCompensation( | 623 settings_.setExposureCompensation( |
| 607 capabilities.exposure_compensation->current); | 624 capabilities->exposure_compensation->current); |
| 608 } | 625 } |
| 609 if (capabilities.color_temperature->max != | 626 if (capabilities->color_temperature->max != |
| 610 capabilities.color_temperature->min) { | 627 capabilities->color_temperature->min) { |
| 611 capabilities_.setColorTemperature( | 628 capabilities_.setColorTemperature( |
| 612 MediaSettingsRange::Create(*capabilities.color_temperature)); | 629 MediaSettingsRange::Create(*capabilities->color_temperature)); |
| 613 settings_.setColorTemperature(capabilities.color_temperature->current); | 630 settings_.setColorTemperature(capabilities->color_temperature->current); |
| 614 } | 631 } |
| 615 if (capabilities.iso->max != capabilities.iso->min) { | 632 if (capabilities->iso->max != capabilities->iso->min) { |
| 616 capabilities_.setIso(MediaSettingsRange::Create(*capabilities.iso)); | 633 capabilities_.setIso(MediaSettingsRange::Create(*capabilities->iso)); |
| 617 settings_.setIso(capabilities.iso->current); | 634 settings_.setIso(capabilities->iso->current); |
| 618 } | 635 } |
| 619 | 636 |
| 620 if (capabilities.brightness->max != capabilities.brightness->min) { | 637 if (capabilities->brightness->max != capabilities->brightness->min) { |
| 621 capabilities_.setBrightness( | 638 capabilities_.setBrightness( |
| 622 MediaSettingsRange::Create(*capabilities.brightness)); | 639 MediaSettingsRange::Create(*capabilities->brightness)); |
| 623 settings_.setBrightness(capabilities.brightness->current); | 640 settings_.setBrightness(capabilities->brightness->current); |
| 624 } | 641 } |
| 625 if (capabilities.contrast->max != capabilities.contrast->min) { | 642 if (capabilities->contrast->max != capabilities->contrast->min) { |
| 626 capabilities_.setContrast( | 643 capabilities_.setContrast( |
| 627 MediaSettingsRange::Create(*capabilities.contrast)); | 644 MediaSettingsRange::Create(*capabilities->contrast)); |
| 628 settings_.setContrast(capabilities.contrast->current); | 645 settings_.setContrast(capabilities->contrast->current); |
| 629 } | 646 } |
| 630 if (capabilities.saturation->max != capabilities.saturation->min) { | 647 if (capabilities->saturation->max != capabilities->saturation->min) { |
| 631 capabilities_.setSaturation( | 648 capabilities_.setSaturation( |
| 632 MediaSettingsRange::Create(*capabilities.saturation)); | 649 MediaSettingsRange::Create(*capabilities->saturation)); |
| 633 settings_.setSaturation(capabilities.saturation->current); | 650 settings_.setSaturation(capabilities->saturation->current); |
| 634 } | 651 } |
| 635 if (capabilities.sharpness->max != capabilities.sharpness->min) { | 652 if (capabilities->sharpness->max != capabilities->sharpness->min) { |
| 636 capabilities_.setSharpness( | 653 capabilities_.setSharpness( |
| 637 MediaSettingsRange::Create(*capabilities.sharpness)); | 654 MediaSettingsRange::Create(*capabilities->sharpness)); |
| 638 settings_.setSharpness(capabilities.sharpness->current); | 655 settings_.setSharpness(capabilities->sharpness->current); |
| 639 } | 656 } |
| 640 | 657 |
| 641 if (capabilities.zoom->max != capabilities.zoom->min) { | 658 if (capabilities->zoom->max != capabilities->zoom->min) { |
| 642 capabilities_.setZoom(MediaSettingsRange::Create(*capabilities.zoom)); | 659 capabilities_.setZoom(MediaSettingsRange::Create(*capabilities->zoom)); |
| 643 settings_.setZoom(capabilities.zoom->current); | 660 settings_.setZoom(capabilities->zoom->current); |
| 644 } | 661 } |
| 645 | 662 |
| 646 if (capabilities.supports_torch) | 663 if (capabilities->supports_torch) |
| 647 capabilities_.setTorch(capabilities.supports_torch); | 664 capabilities_.setTorch(capabilities->supports_torch); |
| 648 if (capabilities.supports_torch) | 665 if (capabilities->supports_torch) |
| 649 settings_.setTorch(capabilities.torch); | 666 settings_.setTorch(capabilities->torch); |
| 650 } | 667 } |
| 651 | 668 |
| 652 void ImageCapture::OnServiceConnectionError() { | 669 void ImageCapture::OnServiceConnectionError() { |
| 653 service_.reset(); | 670 service_.reset(); |
| 654 for (ScriptPromiseResolver* resolver : service_requests_) | 671 for (ScriptPromiseResolver* resolver : service_requests_) |
| 655 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); | 672 resolver->Reject(DOMException::Create(kNotFoundError, kNoServiceError)); |
| 656 service_requests_.clear(); | 673 service_requests_.clear(); |
| 657 } | 674 } |
| 658 | 675 |
| 659 DEFINE_TRACE(ImageCapture) { | 676 DEFINE_TRACE(ImageCapture) { |
| 660 visitor->Trace(stream_track_); | 677 visitor->Trace(stream_track_); |
| 661 visitor->Trace(capabilities_); | 678 visitor->Trace(capabilities_); |
| 662 visitor->Trace(settings_); | 679 visitor->Trace(settings_); |
| 663 visitor->Trace(current_constraints_); | 680 visitor->Trace(current_constraints_); |
| 664 visitor->Trace(service_requests_); | 681 visitor->Trace(service_requests_); |
| 665 EventTargetWithInlineData::Trace(visitor); | 682 EventTargetWithInlineData::Trace(visitor); |
| 666 ContextLifecycleObserver::Trace(visitor); | 683 ContextLifecycleObserver::Trace(visitor); |
| 667 } | 684 } |
| 668 | 685 |
| 669 } // namespace blink | 686 } // namespace blink |
| OLD | NEW |