| Index: chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| index 27e62da0b5b5d4e74e3cf01463c52a65aa3ecded..c8e62bb56fbb8558a831ceb03372b02043a8fc7c 100644
|
| --- a/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| +++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
|
| @@ -536,7 +536,7 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
|
| gesture->source_device = blink::kWebGestureDeviceTouchpad;
|
| gesture->x = 0;
|
| gesture->y = 0;
|
| - SendGesture(InputTarget::CONTENT, std::move(gesture));
|
| + SendGestureToContent(std::move(gesture));
|
| DVLOG(1) << __FUNCTION__ << ": sent CLICK gesture";
|
| }
|
| }
|
| @@ -586,11 +586,12 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
|
| // Determine which UI element (if any) intersects the line between the eyes
|
| // and the controller target position.
|
| float closest_element_distance = (target_point_ - kOrigin).Length();
|
| + previous_target_element_ = target_element_;
|
| target_element_ = nullptr;
|
| float target_x;
|
| float target_y;
|
|
|
| - for (const auto& plane : scene_->GetUiElements()) {
|
| + for (auto& plane : scene_->GetUiElements()) {
|
| if (!plane->IsHitTestable())
|
| continue;
|
|
|
| @@ -618,12 +619,11 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
|
| target_y = y;
|
| }
|
|
|
| - // Treat UI elements, which do not show web content, as NONE input
|
| - // targets since they cannot make use of the input anyway.
|
| + // Handle input targeting on the content quad, ignoring any other elements.
|
| + // Content is treated specially to accomodate scrolling, flings, etc.
|
| InputTarget input_target = InputTarget::NONE;
|
| int pixel_x = 0;
|
| int pixel_y = 0;
|
| -
|
| if (target_element_ != nullptr && target_element_->fill == Fill::CONTENT) {
|
| input_target = InputTarget::CONTENT;
|
| gfx::RectF pixel_rect(0, 0, content_tex_css_width_,
|
| @@ -631,7 +631,10 @@ void VrShellGl::HandleControllerInput(const gfx::Vector3dF& forward_vector) {
|
| pixel_x = pixel_rect.x() + pixel_rect.width() * target_x;
|
| pixel_y = pixel_rect.y() + pixel_rect.height() * target_y;
|
| }
|
| - SendEventsToTarget(input_target, pixel_x, pixel_y);
|
| + SendInputToContent(input_target, pixel_x, pixel_y);
|
| +
|
| + // Handle input targeting on all non-content elements.
|
| + SendInputToUiElements(target_element_);
|
| }
|
|
|
| void VrShellGl::HandleControllerAppButtonActivity(
|
| @@ -668,7 +671,7 @@ void VrShellGl::HandleControllerAppButtonActivity(
|
| }
|
| }
|
|
|
| -void VrShellGl::SendEventsToTarget(InputTarget input_target,
|
| +void VrShellGl::SendInputToContent(InputTarget input_target,
|
| int pixel_x,
|
| int pixel_y) {
|
| std::vector<std::unique_ptr<WebGestureEvent>> gesture_list =
|
| @@ -697,37 +700,37 @@ void VrShellGl::SendEventsToTarget(InputTarget input_target,
|
| case WebInputEvent::kGestureScrollBegin:
|
| current_scroll_target_ = input_target;
|
| if (current_scroll_target_ != InputTarget::NONE) {
|
| - SendGesture(current_scroll_target_, std::move(movableGesture));
|
| + SendGestureToContent(std::move(movableGesture));
|
| }
|
| break;
|
| case WebInputEvent::kGestureScrollEnd:
|
| if (current_scroll_target_ != InputTarget::NONE) {
|
| - SendGesture(current_scroll_target_, std::move(movableGesture));
|
| + SendGestureToContent(std::move(movableGesture));
|
| }
|
| current_fling_target_ = current_scroll_target_;
|
| current_scroll_target_ = InputTarget::NONE;
|
| break;
|
| case WebInputEvent::kGestureScrollUpdate:
|
| if (current_scroll_target_ != InputTarget::NONE) {
|
| - SendGesture(current_scroll_target_, std::move(movableGesture));
|
| + SendGestureToContent(std::move(movableGesture));
|
| }
|
| break;
|
| case WebInputEvent::kGestureFlingStart:
|
| if (current_fling_target_ != InputTarget::NONE) {
|
| - SendGesture(current_fling_target_, std::move(movableGesture));
|
| + SendGestureToContent(std::move(movableGesture));
|
| }
|
| current_fling_target_ = InputTarget::NONE;
|
| break;
|
| case WebInputEvent::kGestureFlingCancel:
|
| current_fling_target_ = InputTarget::NONE;
|
| if (input_target != InputTarget::NONE) {
|
| - SendGesture(input_target, std::move(movableGesture));
|
| + SendGestureToContent(std::move(movableGesture));
|
| }
|
| break;
|
| case WebInputEvent::kGestureTapDown:
|
| current_fling_target_ = InputTarget::NONE;
|
| if (input_target != InputTarget::NONE) {
|
| - SendGesture(input_target, std::move(movableGesture));
|
| + SendGestureToContent(std::move(movableGesture));
|
| }
|
| break;
|
| case WebInputEvent::kUndefined:
|
| @@ -741,21 +744,54 @@ void VrShellGl::SendEventsToTarget(InputTarget input_target,
|
| bool new_target = input_target != current_input_target_;
|
| if (new_target && current_input_target_ != InputTarget::NONE) {
|
| // Send a move event indicating that the pointer moved off of an element.
|
| - SendGesture(current_input_target_,
|
| - MakeMouseEvent(WebInputEvent::kMouseLeave, timestamp, 0, 0));
|
| + SendGestureToContent(
|
| + MakeMouseEvent(WebInputEvent::kMouseLeave, timestamp, 0, 0));
|
| }
|
| current_input_target_ = input_target;
|
| if (current_input_target_ != InputTarget::NONE) {
|
| WebInputEvent::Type type =
|
| new_target ? WebInputEvent::kMouseEnter : WebInputEvent::kMouseMove;
|
| - SendGesture(input_target,
|
| - MakeMouseEvent(type, timestamp, pixel_x, pixel_y));
|
| + SendGestureToContent(MakeMouseEvent(type, timestamp, pixel_x, pixel_y));
|
| + }
|
| +}
|
| +
|
| +void VrShellGl::SendInputToUiElements(UiElement* target_element) {
|
| + if (target_element != previous_target_element_) {
|
| + if (previous_target_element_ &&
|
| + previous_target_element_->fill != Fill::CONTENT) {
|
| + task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&UiElement::OnHoverLeave,
|
| + base::Unretained(previous_target_element_)));
|
| + }
|
| + if (target_element && target_element->fill != Fill::CONTENT) {
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&UiElement::OnHoverEnter,
|
| + base::Unretained(target_element)));
|
| + }
|
| + click_target_element_ = nullptr;
|
| + }
|
| + if (target_element && target_element->fill != Fill::CONTENT) {
|
| + if (controller_->ButtonDownHappened(
|
| + gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) {
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&UiElement::OnButtonDown,
|
| + base::Unretained(target_element)));
|
| + click_target_element_ = target_element;
|
| + }
|
| + if (controller_->ButtonUpHappened(
|
| + gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) {
|
| + if (click_target_element_ == target_element) {
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&UiElement::OnButtonUp,
|
| + base::Unretained(target_element)));
|
| + }
|
| + click_target_element_ = nullptr;
|
| + }
|
| }
|
| }
|
|
|
| -void VrShellGl::SendGesture(InputTarget input_target,
|
| - std::unique_ptr<blink::WebInputEvent> event) {
|
| - DCHECK(input_target != InputTarget::NONE);
|
| +void VrShellGl::SendGestureToContent(
|
| + std::unique_ptr<blink::WebInputEvent> event) {
|
| main_thread_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&VrShell::ProcessContentGesture, weak_vr_shell_,
|
| base::Passed(std::move(event))));
|
|
|