| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/renderer_host/input/touch_selection_controller_client_
aura.h" | 5 #include "content/browser/renderer_host/input/touch_selection_controller_client_
aura.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "content/browser/renderer_host/render_widget_host_delegate.h" | 8 #include "content/browser/renderer_host/render_widget_host_delegate.h" |
| 9 #include "content/browser/renderer_host/render_widget_host_impl.h" | 9 #include "content/browser/renderer_host/render_widget_host_impl.h" |
| 10 #include "content/browser/renderer_host/render_widget_host_view_aura.h" | 10 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 ui::ScrollEvent* event) { | 105 ui::ScrollEvent* event) { |
| 106 DCHECK_NE(ui::TouchSelectionController::INACTIVE, | 106 DCHECK_NE(ui::TouchSelectionController::INACTIVE, |
| 107 selection_controller_->active_status()); | 107 selection_controller_->active_status()); |
| 108 | 108 |
| 109 selection_controller_->HideAndDisallowShowingAutomatically(); | 109 selection_controller_->HideAndDisallowShowingAutomatically(); |
| 110 } | 110 } |
| 111 | 111 |
| 112 TouchSelectionControllerClientAura::TouchSelectionControllerClientAura( | 112 TouchSelectionControllerClientAura::TouchSelectionControllerClientAura( |
| 113 RenderWidgetHostViewAura* rwhva) | 113 RenderWidgetHostViewAura* rwhva) |
| 114 : rwhva_(rwhva), | 114 : rwhva_(rwhva), |
| 115 internal_client_(rwhva), |
| 116 active_client_(&internal_client_), |
| 117 active_menu_client_(this), |
| 115 quick_menu_timer_( | 118 quick_menu_timer_( |
| 116 FROM_HERE, | 119 FROM_HERE, |
| 117 base::TimeDelta::FromMilliseconds(kQuickMenuDelayInMs), | 120 base::TimeDelta::FromMilliseconds(kQuickMenuDelayInMs), |
| 118 base::Bind(&TouchSelectionControllerClientAura::ShowQuickMenu, | 121 base::Bind(&TouchSelectionControllerClientAura::ShowQuickMenu, |
| 119 base::Unretained(this)), | 122 base::Unretained(this)), |
| 120 false), | 123 false), |
| 121 quick_menu_requested_(false), | 124 quick_menu_requested_(false), |
| 122 touch_down_(false), | 125 touch_down_(false), |
| 123 scroll_in_progress_(false), | 126 scroll_in_progress_(false), |
| 124 handle_drag_in_progress_(false), | 127 handle_drag_in_progress_(false), |
| 125 show_quick_menu_immediately_for_test_(false) { | 128 show_quick_menu_immediately_for_test_(false) { |
| 126 DCHECK(rwhva_); | 129 DCHECK(rwhva_); |
| 127 } | 130 } |
| 128 | 131 |
| 129 TouchSelectionControllerClientAura::~TouchSelectionControllerClientAura() { | 132 TouchSelectionControllerClientAura::~TouchSelectionControllerClientAura() { |
| 133 for (auto& observer : observers_) |
| 134 observer.OnManagerWillDestroy(this); |
| 130 } | 135 } |
| 131 | 136 |
| 132 void TouchSelectionControllerClientAura::OnWindowMoved() { | 137 void TouchSelectionControllerClientAura::OnWindowMoved() { |
| 133 UpdateQuickMenu(); | 138 UpdateQuickMenu(); |
| 134 } | 139 } |
| 135 | 140 |
| 136 void TouchSelectionControllerClientAura::OnTouchDown() { | 141 void TouchSelectionControllerClientAura::OnTouchDown() { |
| 137 touch_down_ = true; | 142 touch_down_ = true; |
| 138 UpdateQuickMenu(); | 143 UpdateQuickMenu(); |
| 139 } | 144 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 162 params.selection_text.empty() && | 167 params.selection_text.empty() && |
| 163 IsQuickMenuAvailable()) { | 168 IsQuickMenuAvailable()) { |
| 164 quick_menu_requested_ = true; | 169 quick_menu_requested_ = true; |
| 165 UpdateQuickMenu(); | 170 UpdateQuickMenu(); |
| 166 return true; | 171 return true; |
| 167 } | 172 } |
| 168 rwhva_->selection_controller()->HideAndDisallowShowingAutomatically(); | 173 rwhva_->selection_controller()->HideAndDisallowShowingAutomatically(); |
| 169 return false; | 174 return false; |
| 170 } | 175 } |
| 171 | 176 |
| 177 void TouchSelectionControllerClientAura::UpdateClientSelectionBounds( |
| 178 const gfx::SelectionBound& start, |
| 179 const gfx::SelectionBound& end) { |
| 180 UpdateClientSelectionBounds(start, end, &internal_client_, this); |
| 181 } |
| 182 |
| 183 void TouchSelectionControllerClientAura::UpdateClientSelectionBounds( |
| 184 const gfx::SelectionBound& start, |
| 185 const gfx::SelectionBound& end, |
| 186 ui::TouchSelectionControllerClient* client, |
| 187 ui::TouchSelectionMenuClient* menu_client) { |
| 188 if (client != active_client_ && |
| 189 (start.type() == gfx::SelectionBound::EMPTY || !start.visible()) && |
| 190 (end.type() == gfx::SelectionBound::EMPTY || !end.visible()) && |
| 191 (manager_selection_start_.type() != gfx::SelectionBound::EMPTY || |
| 192 manager_selection_end_.type() != gfx::SelectionBound::EMPTY)) { |
| 193 return; |
| 194 } |
| 195 |
| 196 active_client_ = client; |
| 197 active_menu_client_ = menu_client; |
| 198 manager_selection_start_ = start; |
| 199 manager_selection_end_ = end; |
| 200 // Notify TouchSelectionController if anything should change here. Only |
| 201 // udate if the client is different and not making a change to empty, or |
| 202 // is the same client. |
| 203 GetTouchSelectionController()->OnSelectionBoundsChanged(start, end); |
| 204 } |
| 205 |
| 206 void TouchSelectionControllerClientAura::InvalidateClient( |
| 207 ui::TouchSelectionControllerClient* client) { |
| 208 DCHECK(client != &internal_client_); |
| 209 if (client == active_client_) { |
| 210 active_client_ = &internal_client_; |
| 211 active_menu_client_ = this; |
| 212 } |
| 213 } |
| 214 |
| 215 ui::TouchSelectionController* |
| 216 TouchSelectionControllerClientAura::GetTouchSelectionController() { |
| 217 return rwhva_->selection_controller(); |
| 218 } |
| 219 |
| 220 void TouchSelectionControllerClientAura::AddObserver( |
| 221 TouchSelectionControllerClientManager::Observer* observer) { |
| 222 observers_.AddObserver(observer); |
| 223 } |
| 224 |
| 225 void TouchSelectionControllerClientAura::RemoveObserver( |
| 226 TouchSelectionControllerClientManager::Observer* observer) { |
| 227 observers_.RemoveObserver(observer); |
| 228 } |
| 229 |
| 172 bool TouchSelectionControllerClientAura::IsQuickMenuAvailable() const { | 230 bool TouchSelectionControllerClientAura::IsQuickMenuAvailable() const { |
| 173 return ui::TouchSelectionMenuRunner::GetInstance() && | 231 return ui::TouchSelectionMenuRunner::GetInstance() && |
| 174 ui::TouchSelectionMenuRunner::GetInstance()->IsMenuAvailable(this); | 232 ui::TouchSelectionMenuRunner::GetInstance()->IsMenuAvailable( |
| 233 active_menu_client_); |
| 175 } | 234 } |
| 176 | 235 |
| 177 void TouchSelectionControllerClientAura::ShowQuickMenu() { | 236 void TouchSelectionControllerClientAura::ShowQuickMenu() { |
| 178 if (!ui::TouchSelectionMenuRunner::GetInstance()) | 237 if (!ui::TouchSelectionMenuRunner::GetInstance()) |
| 179 return; | 238 return; |
| 180 | 239 |
| 181 gfx::RectF rect = rwhva_->selection_controller()->GetRectBetweenBounds(); | 240 gfx::RectF rect = rwhva_->selection_controller()->GetRectBetweenBounds(); |
| 182 | 241 |
| 183 // Clip rect, which is in |rwhva_|'s window's coordinate space, to client | 242 // Clip rect, which is in |rwhva_|'s window's coordinate space, to client |
| 184 // bounds. | 243 // bounds. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 195 gfx::RectF anchor_rect(origin, size); | 254 gfx::RectF anchor_rect(origin, size); |
| 196 | 255 |
| 197 // Calculate maximum handle image size; | 256 // Calculate maximum handle image size; |
| 198 gfx::SizeF max_handle_size = | 257 gfx::SizeF max_handle_size = |
| 199 rwhva_->selection_controller()->GetStartHandleRect().size(); | 258 rwhva_->selection_controller()->GetStartHandleRect().size(); |
| 200 max_handle_size.SetToMax( | 259 max_handle_size.SetToMax( |
| 201 rwhva_->selection_controller()->GetEndHandleRect().size()); | 260 rwhva_->selection_controller()->GetEndHandleRect().size()); |
| 202 | 261 |
| 203 aura::Window* parent = rwhva_->GetNativeView(); | 262 aura::Window* parent = rwhva_->GetNativeView(); |
| 204 ui::TouchSelectionMenuRunner::GetInstance()->OpenMenu( | 263 ui::TouchSelectionMenuRunner::GetInstance()->OpenMenu( |
| 205 this, ConvertRectToScreen(parent, anchor_rect), | 264 active_menu_client_, ConvertRectToScreen(parent, anchor_rect), |
| 206 gfx::ToRoundedSize(max_handle_size), parent->GetToplevelWindow()); | 265 gfx::ToRoundedSize(max_handle_size), parent->GetToplevelWindow()); |
| 207 } | 266 } |
| 208 | 267 |
| 209 void TouchSelectionControllerClientAura::UpdateQuickMenu() { | 268 void TouchSelectionControllerClientAura::UpdateQuickMenu() { |
| 210 bool menu_is_showing = | 269 bool menu_is_showing = |
| 211 ui::TouchSelectionMenuRunner::GetInstance() && | 270 ui::TouchSelectionMenuRunner::GetInstance() && |
| 212 ui::TouchSelectionMenuRunner::GetInstance()->IsRunning(); | 271 ui::TouchSelectionMenuRunner::GetInstance()->IsRunning(); |
| 213 | 272 |
| 214 // Hide the quick menu if there is any. This should happen even if the menu | 273 // Hide the quick menu if there is any. This should happen even if the menu |
| 215 // should be shown again, in order to update its location or content. | 274 // should be shown again, in order to update its location or content. |
| 216 if (menu_is_showing) | 275 if (menu_is_showing) |
| 217 ui::TouchSelectionMenuRunner::GetInstance()->CloseMenu(); | 276 ui::TouchSelectionMenuRunner::GetInstance()->CloseMenu(); |
| 218 else | 277 else |
| 219 quick_menu_timer_.Stop(); | 278 quick_menu_timer_.Stop(); |
| 220 | 279 |
| 221 bool should_show_menu = quick_menu_requested_ && !touch_down_ && | 280 bool should_show_menu = quick_menu_requested_ && !touch_down_ && |
| 222 !scroll_in_progress_ && !handle_drag_in_progress_ && | 281 !scroll_in_progress_ && !handle_drag_in_progress_ && |
| 223 IsQuickMenuAvailable(); | 282 IsQuickMenuAvailable(); |
| 224 | 283 |
| 225 // Start timer to show quick menu if necessary. | 284 // Start timer to show quick menu if necessary. |
| 226 if (should_show_menu) { | 285 if (should_show_menu) { |
| 227 if (show_quick_menu_immediately_for_test_) | 286 if (show_quick_menu_immediately_for_test_) |
| 228 ShowQuickMenu(); | 287 ShowQuickMenu(); |
| 229 else | 288 else |
| 230 quick_menu_timer_.Reset(); | 289 quick_menu_timer_.Reset(); |
| 231 } | 290 } |
| 232 } | 291 } |
| 233 | 292 |
| 234 bool TouchSelectionControllerClientAura::SupportsAnimation() const { | 293 bool TouchSelectionControllerClientAura::SupportsAnimation() const { |
| 294 return active_client_->SupportsAnimation(); |
| 295 } |
| 296 |
| 297 bool TouchSelectionControllerClientAura::InternalClient::SupportsAnimation() |
| 298 const { |
| 235 return false; | 299 return false; |
| 236 } | 300 } |
| 237 | 301 |
| 238 void TouchSelectionControllerClientAura::SetNeedsAnimate() { | 302 void TouchSelectionControllerClientAura::SetNeedsAnimate() { |
| 303 active_client_->SetNeedsAnimate(); |
| 304 } |
| 305 |
| 306 void TouchSelectionControllerClientAura::InternalClient::SetNeedsAnimate() { |
| 239 NOTREACHED(); | 307 NOTREACHED(); |
| 240 } | 308 } |
| 241 | 309 |
| 242 void TouchSelectionControllerClientAura::MoveCaret( | 310 void TouchSelectionControllerClientAura::MoveCaret( |
| 243 const gfx::PointF& position) { | 311 const gfx::PointF& position) { |
| 312 active_client_->MoveCaret(position); |
| 313 } |
| 314 |
| 315 void TouchSelectionControllerClientAura::InternalClient::MoveCaret( |
| 316 const gfx::PointF& position) { |
| 244 RenderWidgetHostImpl* host = | 317 RenderWidgetHostImpl* host = |
| 245 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost()); | 318 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost()); |
| 246 host->MoveCaret(gfx::ToRoundedPoint(position)); | 319 host->MoveCaret(gfx::ToRoundedPoint(position)); |
| 247 } | 320 } |
| 248 | 321 |
| 249 void TouchSelectionControllerClientAura::MoveRangeSelectionExtent( | 322 void TouchSelectionControllerClientAura::MoveRangeSelectionExtent( |
| 250 const gfx::PointF& extent) { | 323 const gfx::PointF& extent) { |
| 324 active_client_->MoveRangeSelectionExtent(extent); |
| 325 } |
| 326 |
| 327 void TouchSelectionControllerClientAura::InternalClient:: |
| 328 MoveRangeSelectionExtent(const gfx::PointF& extent) { |
| 251 RenderWidgetHostDelegate* host_delegate = | 329 RenderWidgetHostDelegate* host_delegate = |
| 252 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost())->delegate(); | 330 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost())->delegate(); |
| 253 if (host_delegate) | 331 if (host_delegate) |
| 254 host_delegate->MoveRangeSelectionExtent(gfx::ToRoundedPoint(extent)); | 332 host_delegate->MoveRangeSelectionExtent(gfx::ToRoundedPoint(extent)); |
| 255 } | 333 } |
| 256 | 334 |
| 257 void TouchSelectionControllerClientAura::SelectBetweenCoordinates( | 335 void TouchSelectionControllerClientAura::SelectBetweenCoordinates( |
| 258 const gfx::PointF& base, | 336 const gfx::PointF& base, |
| 259 const gfx::PointF& extent) { | 337 const gfx::PointF& extent) { |
| 338 active_client_->SelectBetweenCoordinates(base, extent); |
| 339 } |
| 340 |
| 341 void TouchSelectionControllerClientAura::InternalClient:: |
| 342 SelectBetweenCoordinates(const gfx::PointF& base, |
| 343 const gfx::PointF& extent) { |
| 260 RenderWidgetHostDelegate* host_delegate = | 344 RenderWidgetHostDelegate* host_delegate = |
| 261 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost())->delegate(); | 345 RenderWidgetHostImpl::From(rwhva_->GetRenderWidgetHost())->delegate(); |
| 262 if (host_delegate) { | 346 if (host_delegate) { |
| 263 host_delegate->SelectRange(gfx::ToRoundedPoint(base), | 347 host_delegate->SelectRange(gfx::ToRoundedPoint(base), |
| 264 gfx::ToRoundedPoint(extent)); | 348 gfx::ToRoundedPoint(extent)); |
| 265 } | 349 } |
| 266 } | 350 } |
| 267 | 351 |
| 268 void TouchSelectionControllerClientAura::OnSelectionEvent( | 352 void TouchSelectionControllerClientAura::OnSelectionEvent( |
| 269 ui::SelectionEventType event) { | 353 ui::SelectionEventType event) { |
| 354 // This function (implicitly) uses active_menu_client_, so we don't go to the |
| 355 // active view for this. |
| 270 switch (event) { | 356 switch (event) { |
| 271 case ui::SELECTION_HANDLES_SHOWN: | 357 case ui::SELECTION_HANDLES_SHOWN: |
| 272 quick_menu_requested_ = true; | 358 quick_menu_requested_ = true; |
| 273 // Fall through. | 359 // Fall through. |
| 274 case ui::INSERTION_HANDLE_SHOWN: | 360 case ui::INSERTION_HANDLE_SHOWN: |
| 275 UpdateQuickMenu(); | 361 UpdateQuickMenu(); |
| 276 env_pre_target_handler_.reset(new EnvPreTargetHandler( | 362 env_pre_target_handler_.reset(new EnvPreTargetHandler( |
| 277 rwhva_->selection_controller(), rwhva_->GetNativeView())); | 363 rwhva_->selection_controller(), rwhva_->GetNativeView())); |
| 278 break; | 364 break; |
| 279 case ui::SELECTION_HANDLES_CLEARED: | 365 case ui::SELECTION_HANDLES_CLEARED: |
| (...skipping 16 matching lines...) Expand all Loading... |
| 296 case ui::INSERTION_HANDLE_MOVED: | 382 case ui::INSERTION_HANDLE_MOVED: |
| 297 UpdateQuickMenu(); | 383 UpdateQuickMenu(); |
| 298 break; | 384 break; |
| 299 case ui::INSERTION_HANDLE_TAPPED: | 385 case ui::INSERTION_HANDLE_TAPPED: |
| 300 quick_menu_requested_ = !quick_menu_requested_; | 386 quick_menu_requested_ = !quick_menu_requested_; |
| 301 UpdateQuickMenu(); | 387 UpdateQuickMenu(); |
| 302 break; | 388 break; |
| 303 }; | 389 }; |
| 304 } | 390 } |
| 305 | 391 |
| 392 void TouchSelectionControllerClientAura::InternalClient::OnSelectionEvent( |
| 393 ui::SelectionEventType event) { |
| 394 NOTREACHED(); |
| 395 } |
| 396 |
| 306 std::unique_ptr<ui::TouchHandleDrawable> | 397 std::unique_ptr<ui::TouchHandleDrawable> |
| 307 TouchSelectionControllerClientAura::CreateDrawable() { | 398 TouchSelectionControllerClientAura::CreateDrawable() { |
| 399 // This function is purely related to the top-level view's window, so it |
| 400 // is always handled here and never in |
| 401 // TouchSelectionControllerClientChildFrame. |
| 308 return std::unique_ptr<ui::TouchHandleDrawable>( | 402 return std::unique_ptr<ui::TouchHandleDrawable>( |
| 309 new ui::TouchHandleDrawableAura(rwhva_->GetNativeView())); | 403 new ui::TouchHandleDrawableAura(rwhva_->GetNativeView())); |
| 310 } | 404 } |
| 311 | 405 |
| 406 std::unique_ptr<ui::TouchHandleDrawable> |
| 407 TouchSelectionControllerClientAura::InternalClient::CreateDrawable() { |
| 408 NOTREACHED(); |
| 409 return nullptr; |
| 410 } |
| 411 |
| 312 bool TouchSelectionControllerClientAura::IsCommandIdEnabled( | 412 bool TouchSelectionControllerClientAura::IsCommandIdEnabled( |
| 313 int command_id) const { | 413 int command_id) const { |
| 314 bool editable = rwhva_->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE; | 414 bool editable = rwhva_->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE; |
| 315 bool readable = rwhva_->GetTextInputType() != ui::TEXT_INPUT_TYPE_PASSWORD; | 415 bool readable = rwhva_->GetTextInputType() != ui::TEXT_INPUT_TYPE_PASSWORD; |
| 316 gfx::Range selection_range; | 416 gfx::Range selection_range; |
| 317 rwhva_->GetSelectionRange(&selection_range); | 417 rwhva_->GetSelectionRange(&selection_range); |
| 318 bool has_selection = !selection_range.is_empty(); | 418 bool has_selection = !selection_range.is_empty(); |
| 319 switch (command_id) { | 419 switch (command_id) { |
| 320 case IDS_APP_CUT: | 420 case IDS_APP_CUT: |
| 321 return editable && readable && has_selection; | 421 return editable && readable && has_selection; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 ui::MENU_SOURCE_TOUCH_EDIT_MENU, | 467 ui::MENU_SOURCE_TOUCH_EDIT_MENU, |
| 368 gfx::ToRoundedPoint(anchor_point))); | 468 gfx::ToRoundedPoint(anchor_point))); |
| 369 | 469 |
| 370 // Hide selection handles after getting rect-between-bounds from touch | 470 // Hide selection handles after getting rect-between-bounds from touch |
| 371 // selection controller; otherwise, rect would be empty and the above | 471 // selection controller; otherwise, rect would be empty and the above |
| 372 // calculations would be invalid. | 472 // calculations would be invalid. |
| 373 rwhva_->selection_controller()->HideAndDisallowShowingAutomatically(); | 473 rwhva_->selection_controller()->HideAndDisallowShowingAutomatically(); |
| 374 } | 474 } |
| 375 | 475 |
| 376 } // namespace content | 476 } // namespace content |
| OLD | NEW |