Commit a3e48816 authored by Ramya Nagarajan's avatar Ramya Nagarajan Committed by Commit Bot

Revert "Remove set_owned_by_client() from AutoclickScrollPositionHandler."

This reverts commit be2aab1c.

Reason for revert: Step "compile" failing on 3 builder(s)

Builder: chromeos-betty-pi-arc-cfi-thin-lto-chrome
https://ci.chromium.org/p/chrome/builders/ci/chromeos-betty-pi-arc-cfi-thin-lto-chrome
First failing build:
https://ci.chromium.org/p/chrome/builders/ci/chromeos-betty-pi-arc-cfi-thin-lto-chrome/b8879666664893307472
--------------------
Builder: chromeos-arm-generic-cfi-thin-lto-chrome
https://ci.chromium.org/p/chrome/builders/ci/chromeos-arm-generic-cfi-thin-lto-chrome
First failing build:
https://ci.chromium.org/p/chrome/builders/ci/chromeos-arm-generic-cfi-thin-lto-chrome/b8879668479378837648
--------------------
Builder: chromeos-eve-chrome
https://ci.chromium.org/p/chrome/builders/ci/chromeos-eve-chrome
First failing build:
https://ci.chromium.org/p/chrome/builders/ci/chromeos-eve-chrome/b8879665644223805168


Original change's description:
> Remove set_owned_by_client() from AutoclickScrollPositionHandler.
> 
> It's safe for the Widget to own the underlying View via
> SetContentsView().  This was not immediately obvious; much of this CL is
> adjacent refactoring and cleanup that simplifies the ownership/lifetime.
> 
> Bug: 1044687
> Change-Id: I76cbc402edb7195c42cbae679a89839384d0615a
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2210914
> Commit-Queue: Peter Kasting <pkasting@chromium.org>
> Auto-Submit: Peter Kasting <pkasting@chromium.org>
> Reviewed-by: Katie Dektar <katie@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#771122}

TBR=pkasting@chromium.org,katie@chromium.org

Change-Id: I7a18d84cfae23938b683f9a3aaf7b533781b975a
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 1044687
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2212824Reviewed-by: default avatarRamya Nagarajan <ramyan@chromium.org>
Commit-Queue: Ramya Nagarajan <ramyan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771158}
parent 4be282cb
...@@ -52,7 +52,8 @@ base::TimeDelta CalculateStartGestureDelay(base::TimeDelta total_delay) { ...@@ -52,7 +52,8 @@ base::TimeDelta CalculateStartGestureDelay(base::TimeDelta total_delay) {
} }
views::Widget::InitParams CreateAutoclickOverlayWidgetParams( views::Widget::InitParams CreateAutoclickOverlayWidgetParams(
aura::Window* root_window) { aura::Window* target) {
aura::Window* root_window = target->GetRootWindow();
views::Widget::InitParams params; views::Widget::InitParams params;
params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
params.accept_events = false; params.accept_events = false;
...@@ -127,7 +128,7 @@ void AutoclickController::SetEnabled(bool enabled, ...@@ -127,7 +128,7 @@ void AutoclickController::SetEnabled(bool enabled,
menu_bubble_controller_->ShowBubble(event_type_, menu_position_); menu_bubble_controller_->ShowBubble(event_type_, menu_position_);
if (event_type_ == AutoclickEventType::kScroll) { if (event_type_ == AutoclickEventType::kScroll) {
InitializeScrollLocation(); InitializeScrollLocation();
UpdateScrollPosition(); UpdateScrollPosition(scroll_location_);
} }
enabled_ = enabled; enabled_ = enabled;
} else { } else {
...@@ -189,7 +190,7 @@ void AutoclickController::SetAutoclickEventType(AutoclickEventType type) { ...@@ -189,7 +190,7 @@ void AutoclickController::SetAutoclickEventType(AutoclickEventType type) {
if (type == AutoclickEventType::kScroll) { if (type == AutoclickEventType::kScroll) {
InitializeScrollLocation(); InitializeScrollLocation();
UpdateScrollPosition(); UpdateScrollPosition(scroll_location_);
} else { } else {
over_scroll_button_ = false; over_scroll_button_ = false;
HideScrollPosition(); HideScrollPosition();
...@@ -289,12 +290,32 @@ void AutoclickController::UpdateAutoclickMenuBoundsIfNeeded() { ...@@ -289,12 +290,32 @@ void AutoclickController::UpdateAutoclickMenuBoundsIfNeeded() {
menu_bubble_controller_->SetPosition(menu_position_); menu_bubble_controller_->SetPosition(menu_position_);
} }
void AutoclickController::CreateAutoclickRingWidget(
const gfx::Point& point_in_screen) {
aura::Window* target = window_util::GetRootWindowAt(point_in_screen);
SetTapDownTarget(target);
ring_widget_.reset(new views::Widget);
ring_widget_->Init(CreateAutoclickOverlayWidgetParams(target));
ring_widget_->SetOpacity(1.f);
}
void AutoclickController::CreateAutoclickScrollPositionWidget(
const gfx::Point& point_in_screen) {
aura::Window* target = window_util::GetRootWindowAt(point_in_screen);
SetTapDownTarget(target);
scroll_position_widget_.reset(new views::Widget);
scroll_position_widget_->Init(CreateAutoclickOverlayWidgetParams(target));
}
void AutoclickController::UpdateAutoclickWidgetPosition( void AutoclickController::UpdateAutoclickWidgetPosition(
gfx::NativeView native_view, views::Widget* widget,
aura::Window* root_window) { const gfx::Point& point_in_screen) {
if (native_view->GetRootWindow() != root_window) { aura::Window* target = window_util::GetRootWindowAt(point_in_screen);
SetTapDownTarget(target);
aura::Window* root_window = target->GetRootWindow();
if (widget->GetNativeView()->GetRootWindow() != root_window) {
views::Widget::ReparentNativeView( views::Widget::ReparentNativeView(
native_view, widget->GetNativeView(),
Shell::GetContainer(root_window, kShellWindowId_OverlayContainer)); Shell::GetContainer(root_window, kShellWindowId_OverlayContainer));
} }
} }
...@@ -335,7 +356,7 @@ void AutoclickController::DoAutoclickAction() { ...@@ -335,7 +356,7 @@ void AutoclickController::DoAutoclickAction() {
} else { } else {
scroll_location_ = gesture_anchor_location_; scroll_location_ = gesture_anchor_location_;
is_initial_scroll_location_ = false; is_initial_scroll_location_ = false;
UpdateScrollPosition(); UpdateScrollPosition(scroll_location_);
Shell::Get() Shell::Get()
->accessibility_controller() ->accessibility_controller()
->RequestAutoclickScrollableBoundsForPoint(scroll_location_); ->RequestAutoclickScrollableBoundsForPoint(scroll_location_);
...@@ -479,17 +500,11 @@ void AutoclickController::InitClickTimers() { ...@@ -479,17 +500,11 @@ void AutoclickController::InitClickTimers() {
base::Unretained(this))); base::Unretained(this)));
} }
void AutoclickController::UpdateRingWidget() { void AutoclickController::UpdateRingWidget(const gfx::Point& point_in_screen) {
aura::Window* const target = if (!ring_widget_) {
window_util::GetRootWindowAt(last_mouse_location_); CreateAutoclickRingWidget(point_in_screen);
SetTapDownTarget(target);
aura::Window* const root_window = target->GetRootWindow();
if (ring_widget_) {
UpdateAutoclickWidgetPosition(ring_widget_->GetNativeView(), root_window);
} else { } else {
ring_widget_ = std::make_unique<views::Widget>( UpdateAutoclickWidgetPosition(ring_widget_.get(), point_in_screen);
CreateAutoclickOverlayWidgetParams(root_window));
ring_widget_->SetOpacity(1.0f);
} }
} }
...@@ -507,28 +522,29 @@ void AutoclickController::InitializeScrollLocation() { ...@@ -507,28 +522,29 @@ void AutoclickController::InitializeScrollLocation() {
->RequestAutoclickScrollableBoundsForPoint(scroll_location_); ->RequestAutoclickScrollableBoundsForPoint(scroll_location_);
} }
void AutoclickController::UpdateScrollPosition() { void AutoclickController::UpdateScrollPosition(
const gfx::Point& point_in_screen) {
if (!enabled_) if (!enabled_)
return; return;
if (!scroll_position_widget_) {
aura::Window* const target = window_util::GetRootWindowAt(scroll_location_); CreateAutoclickScrollPositionWidget(point_in_screen);
SetTapDownTarget(target);
aura::Window* const root_window = target->GetRootWindow();
if (autoclick_scroll_position_handler_) {
UpdateAutoclickWidgetPosition(
autoclick_scroll_position_handler_->GetNativeView(), root_window);
} else {
autoclick_scroll_position_handler_ = autoclick_scroll_position_handler_ =
std::make_unique<AutoclickScrollPositionHandler>( std::make_unique<AutoclickScrollPositionHandler>(
std::make_unique<views::Widget>( scroll_location_, scroll_position_widget_.get());
CreateAutoclickOverlayWidgetParams(root_window))); } else {
UpdateAutoclickWidgetPosition(scroll_position_widget_.get(),
point_in_screen);
autoclick_scroll_position_handler_->SetCenter(
scroll_location_, scroll_position_widget_.get());
} }
autoclick_scroll_position_handler_->SetScrollPointCenterInScreen(
scroll_location_);
} }
void AutoclickController::HideScrollPosition() { void AutoclickController::HideScrollPosition() {
autoclick_scroll_position_handler_.reset(); // Hide the scroll position UI if it exists.
if (autoclick_scroll_position_handler_)
autoclick_scroll_position_handler_.reset();
if (scroll_position_widget_)
scroll_position_widget_.reset();
// TODO(katie): Clear any Autoclick scroll focus rings here. // TODO(katie): Clear any Autoclick scroll focus rings here.
} }
...@@ -595,7 +611,7 @@ void AutoclickController::OnMouseEvent(ui::MouseEvent* event) { ...@@ -595,7 +611,7 @@ void AutoclickController::OnMouseEvent(ui::MouseEvent* event) {
drag_event_rewriter_->IsEnabled()))) { drag_event_rewriter_->IsEnabled()))) {
mouse_event_flags_ = event->flags(); mouse_event_flags_ = event->flags();
// Update the point even if the animation is not currently being shown. // Update the point even if the animation is not currently being shown.
UpdateRingWidget(); UpdateRingWidget(last_mouse_location_);
// The distance between the mouse location and the anchor location // The distance between the mouse location and the anchor location
// must exceed a certain threshold to initiate a new autoclick countdown. // must exceed a certain threshold to initiate a new autoclick countdown.
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include "ui/aura/window_observer.h" #include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h" #include "ui/events/event_handler.h"
#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point.h"
#include "ui/gfx/native_widget_types.h"
namespace base { namespace base {
class RetainingOneShotTimer; class RetainingOneShotTimer;
...@@ -120,17 +119,19 @@ class ASH_EXPORT AutoclickController ...@@ -120,17 +119,19 @@ class ASH_EXPORT AutoclickController
private: private:
void SetTapDownTarget(aura::Window* target); void SetTapDownTarget(aura::Window* target);
void UpdateAutoclickWidgetPosition(gfx::NativeView native_view, void CreateAutoclickRingWidget(const gfx::Point& point_in_screen);
aura::Window* root_window); void CreateAutoclickScrollPositionWidget(const gfx::Point& point_in_screen);
void UpdateAutoclickWidgetPosition(views::Widget* widget,
const gfx::Point& point_in_screen);
void DoAutoclickAction(); void DoAutoclickAction();
void StartAutoclickGesture(); void StartAutoclickGesture();
void CancelAutoclickAction(); void CancelAutoclickAction();
void OnActionCompleted(AutoclickEventType event_type); void OnActionCompleted(AutoclickEventType event_type);
void InitClickTimers(); void InitClickTimers();
void UpdateRingWidget(); void UpdateRingWidget(const gfx::Point& mouse_location);
void UpdateRingSize(); void UpdateRingSize();
void InitializeScrollLocation(); void InitializeScrollLocation();
void UpdateScrollPosition(); void UpdateScrollPosition(const gfx::Point& point_in_screen);
void HideScrollPosition(); void HideScrollPosition();
void RecordUserAction(AutoclickEventType event_type) const; void RecordUserAction(AutoclickEventType event_type) const;
bool DragInProgress() const; bool DragInProgress() const;
...@@ -199,6 +200,8 @@ class ASH_EXPORT AutoclickController ...@@ -199,6 +200,8 @@ class ASH_EXPORT AutoclickController
// The widget containing the autoclick ring. // The widget containing the autoclick ring.
std::unique_ptr<views::Widget> ring_widget_; std::unique_ptr<views::Widget> ring_widget_;
// The widget containing the autoclick scroll position indiciator.
std::unique_ptr<views::Widget> scroll_position_widget_;
base::TimeDelta delay_; base::TimeDelta delay_;
// The timer that counts down from the beginning of a gesture until a click. // The timer that counts down from the beginning of a gesture until a click.
std::unique_ptr<base::RetainingOneShotTimer> autoclick_timer_; std::unique_ptr<base::RetainingOneShotTimer> autoclick_timer_;
......
...@@ -6,82 +6,126 @@ ...@@ -6,82 +6,126 @@
#include "ash/resources/vector_icons/vector_icons.h" #include "ash/resources/vector_icons/vector_icons.h"
#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/animation/tween.h" #include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkRect.h"
#include "ui/aura/window.h"
#include "ui/compositor/layer.h"
#include "ui/gfx/animation/linear_animation.h"
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
#include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/paint_vector_icon.h"
#include "ui/views/controls/image_view.h" #include "ui/gfx/transform.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/view.h" #include "ui/views/view.h"
#include "ui/views/widget/widget.h"
namespace ash { namespace ash {
namespace {
constexpr int kScrollBackgroundSizeInDips = 32;
constexpr int kScrollIconSizeInDips = 24;
constexpr SkColor kIconBackgroundColor = SkColorSetARGB(255, 128, 134, 139);
constexpr base::TimeDelta kAnimationTime =
base::TimeDelta::FromMilliseconds(500);
constexpr float kFadedOpacity = 0.5;
} // namespace
// View of the AutoclickScrollPositionHandler. Draws the actual contents and
// maintains the views::Widget that the animation is shown in.
class AutoclickScrollPositionView : public views::View { class AutoclickScrollPositionView : public views::View {
public: public:
AutoclickScrollPositionView(); AutoclickScrollPositionView(const gfx::Point& event_location,
AutoclickScrollPositionView(const AutoclickScrollPositionView&) = delete; views::Widget* widget)
AutoclickScrollPositionView& operator=(const AutoclickScrollPositionView&) = : views::View(), widget_(widget) {
delete; image_ = gfx::CreateVectorIcon(kAutoclickScrollIcon, kScrollIconSizeInDips,
SK_ColorWHITE);
widget_->SetContentsView(this);
SetSize(
gfx::Size(kScrollBackgroundSizeInDips, kScrollBackgroundSizeInDips));
// Owned by the AutoclickScrollPositionHandler.
set_owned_by_client();
SetLocation(event_location);
}
~AutoclickScrollPositionView() override = default; ~AutoclickScrollPositionView() override = default;
protected: void SetLocation(const gfx::Point& new_event_location) {
// views::View: gfx::Point point = new_event_location;
void OnPaintBackground(gfx::Canvas* canvas) override; widget_->SetBounds(gfx::Rect(point.x() - kScrollBackgroundSizeInDips / 2,
}; point.y() - kScrollBackgroundSizeInDips / 2,
kScrollBackgroundSizeInDips,
kScrollBackgroundSizeInDips));
widget_->Show();
widget_->SetOpacity(1.0);
SchedulePaint();
}
AutoclickScrollPositionView::AutoclickScrollPositionView() { void UpdateForAnimationStep(gfx::Animation* animation) {
SetLayoutManager(std::make_unique<views::FillLayout>()); widget_->SetOpacity(animation->CurrentValueBetween(1.0, kFadedOpacity));
AddChildView(std::make_unique<views::ImageView>()) }
->SetImage(
gfx::CreateVectorIcon(kAutoclickScrollIcon, 24, SK_ColorWHITE));
}
void AutoclickScrollPositionView::OnPaintBackground(gfx::Canvas* canvas) { private:
cc::PaintFlags flags; void OnPaint(gfx::Canvas* canvas) override {
flags.setAntiAlias(true); gfx::Point center(kScrollBackgroundSizeInDips / 2,
flags.setColor(gfx::kGoogleGrey600); kScrollBackgroundSizeInDips / 2);
canvas->DrawCircle(GetLocalBounds().CenterPoint(), width() / 2, flags); canvas->Save();
}
// static cc::PaintFlags flags;
constexpr base::TimeDelta AutoclickScrollPositionHandler::kOpaqueTime; flags.setAntiAlias(true);
constexpr base::TimeDelta AutoclickScrollPositionHandler::kFadeTime;
// Draw the grey background.
flags.setStyle(cc::PaintFlags::kFill_Style);
flags.setColor(kIconBackgroundColor);
canvas->DrawCircle(center, kScrollBackgroundSizeInDips / 2, flags);
// Draw the icon on top.
canvas->DrawImageInt(image_, center.x() - kScrollIconSizeInDips / 2,
center.y() - kScrollIconSizeInDips / 2);
canvas->Restore();
}
views::Widget* widget_;
gfx::ImageSkia image_;
DISALLOW_COPY_AND_ASSIGN(AutoclickScrollPositionView);
};
AutoclickScrollPositionHandler::AutoclickScrollPositionHandler( AutoclickScrollPositionHandler::AutoclickScrollPositionHandler(
std::unique_ptr<views::Widget> widget) const gfx::Point& center_point_in_screen,
: widget_(std::move(widget)) { views::Widget* widget)
widget_->SetContentsView(std::make_unique<AutoclickScrollPositionView>()); : gfx::LinearAnimation(nullptr) {
view_ = std::make_unique<AutoclickScrollPositionView>(center_point_in_screen,
widget);
SetDuration(kAnimationTime);
animation_state_ = AnimationState::kWait;
Start();
} }
AutoclickScrollPositionHandler::~AutoclickScrollPositionHandler() = default; AutoclickScrollPositionHandler::~AutoclickScrollPositionHandler() {
view_.reset();
}
gfx::NativeView AutoclickScrollPositionHandler::GetNativeView() { void AutoclickScrollPositionHandler::SetCenter(
return widget_->GetNativeView(); const gfx::Point& center_point_in_screen,
views::Widget* widget) {
view_->SetLocation(center_point_in_screen);
animation_state_ = AnimationState::kWait;
Start();
} }
void AutoclickScrollPositionHandler::SetScrollPointCenterInScreen( void AutoclickScrollPositionHandler::AnimateToState(double state) {
const gfx::Point& scroll_point_center) { if (animation_state_ == AnimationState::kFade)
constexpr int kBackgroundSizeDips = 32; view_->UpdateForAnimationStep(this);
gfx::Rect bounds(gfx::Size(kBackgroundSizeDips, kBackgroundSizeDips));
bounds.set_origin(scroll_point_center -
bounds.CenterPoint().OffsetFromOrigin());
widget_->SetBounds(bounds);
widget_->Show();
widget_->SetOpacity(1.0f);
timer_.Reset();
} }
void AutoclickScrollPositionHandler::AnimationProgressed( void AutoclickScrollPositionHandler::AnimationStopped() {
const gfx::Animation* animation) { if (animation_state_ == AnimationState::kWait) {
constexpr float kSteadyStateOpacity = 0.5f; animation_state_ = AnimationState::kFade;
widget_->SetOpacity(gfx::Tween::FloatValueBetween( Start();
animation_.GetCurrentValue(), 1.0f, kSteadyStateOpacity)); } else if (animation_state_ == AnimationState::kFade) {
animation_state_ = AnimationState::kDone;
}
} }
} // namespace ash } // namespace ash
...@@ -7,54 +7,43 @@ ...@@ -7,54 +7,43 @@
#include <memory> #include <memory>
#include "base/location.h" #include "base/macros.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/animation/linear_animation.h" #include "ui/gfx/animation/linear_animation.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/geometry/point.h"
#include "ui/views/widget/widget.h"
namespace gfx {
class Point;
} // namespace gfx
namespace views {
class Widget;
} // namespace views
namespace ash { namespace ash {
class AutoclickScrollPositionView;
// AutoclickScrollPositionHandler displays the position at which the next scroll // AutoclickScrollPositionHandler displays the position at which the next scroll
// event will occur, giving users a sense of which part of the screen will // event will occur, giving users a sense of which part of the screen will
// receive scroll events. It will display at full opacity for a short time, then // receive scroll events. It will display at full opacity for a short time, then
// partially fade out to keep from blocking content. // partially fade out to keep from blocking content.
class AutoclickScrollPositionHandler : public gfx::AnimationDelegate { class AutoclickScrollPositionHandler : public gfx::LinearAnimation {
public: public:
explicit AutoclickScrollPositionHandler( AutoclickScrollPositionHandler(const gfx::Point& center_point_in_screen,
std::unique_ptr<views::Widget> widget); views::Widget* widget);
AutoclickScrollPositionHandler(const AutoclickScrollPositionHandler&) =
delete;
AutoclickScrollPositionHandler& operator=(
const AutoclickScrollPositionHandler&) = delete;
~AutoclickScrollPositionHandler() override; ~AutoclickScrollPositionHandler() override;
gfx::NativeView GetNativeView(); void SetCenter(const gfx::Point& center_point_in_screen,
views::Widget* widget);
void SetScrollPointCenterInScreen(const gfx::Point& scroll_point_center);
private: private:
static constexpr auto kOpaqueTime = base::TimeDelta::FromMilliseconds(500); enum AnimationState {
static constexpr auto kFadeTime = base::TimeDelta::FromMilliseconds(500); kWait,
kFade,
// gfx::AnimationDelegate: kDone,
void AnimationProgressed(const gfx::Animation* animation) override; };
std::unique_ptr<views::Widget> widget_; // Overridden from gfx::LinearAnimation.
base::DelayTimer timer_{FROM_HERE, kOpaqueTime, void AnimateToState(double state) override;
static_cast<gfx::Animation*>(&animation_), void AnimationStopped() override;
&gfx::Animation::Start};
gfx::LinearAnimation animation_{ std::unique_ptr<AutoclickScrollPositionView> view_;
kFadeTime, gfx::LinearAnimation::kDefaultFrameRate, this}; AnimationState animation_state_ = kDone;
DISALLOW_COPY_AND_ASSIGN(AutoclickScrollPositionHandler);
}; };
} // namespace ash } // namespace ash
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment