OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/render_widget_host_view_aura.h" | 5 #include "content/browser/renderer_host/render_widget_host_view_aura.h" |
6 | 6 |
7 #include <map> | |
8 | |
7 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
8 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
9 #include "base/bind.h" | 11 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 12 #include "base/callback_helpers.h" |
11 #include "base/command_line.h" | 13 #include "base/command_line.h" |
12 #include "base/logging.h" | 14 #include "base/logging.h" |
13 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
14 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
15 #include "base/trace_event/trace_event.h" | 17 #include "base/trace_event/trace_event.h" |
16 #include "cc/layers/layer.h" | 18 #include "cc/layers/layer.h" |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
324 // Note: popup_parent_host_view_ may be NULL when there are multiple | 326 // Note: popup_parent_host_view_ may be NULL when there are multiple |
325 // popup children per view. See: RenderWidgetHostViewAura::InitAsPopup(). | 327 // popup children per view. See: RenderWidgetHostViewAura::InitAsPopup(). |
326 Shutdown(); | 328 Shutdown(); |
327 } | 329 } |
328 } | 330 } |
329 | 331 |
330 // We have to implement the WindowObserver interface on a separate object | 332 // We have to implement the WindowObserver interface on a separate object |
331 // because clang doesn't like implementing multiple interfaces that have | 333 // because clang doesn't like implementing multiple interfaces that have |
332 // methods with the same name. This object is owned by the | 334 // methods with the same name. This object is owned by the |
333 // RenderWidgetHostViewAura. | 335 // RenderWidgetHostViewAura. |
334 class RenderWidgetHostViewAura::WindowObserver : public aura::WindowObserver { | 336 class RenderWidgetHostViewAura::WindowObserver : public aura::WindowObserver { |
sky
2015/04/09 00:01:14
Using the same class for two very different purpos
ananta
2015/04/09 03:36:05
Done.
| |
335 public: | 337 public: |
336 explicit WindowObserver(RenderWidgetHostViewAura* view) | 338 explicit WindowObserver(RenderWidgetHostViewAura* view) |
337 : view_(view) { | 339 : view_(view) { |
338 view_->window_->AddObserver(this); | 340 view_->window_->AddObserver(this); |
339 } | 341 } |
340 | 342 |
341 ~WindowObserver() override { view_->window_->RemoveObserver(this); } | 343 ~WindowObserver() override { |
344 RemoveAncestorObservers(); | |
345 view_->window_->RemoveObserver(this); | |
346 } | |
342 | 347 |
343 // Overridden from aura::WindowObserver: | 348 // Overridden from aura::WindowObserver: |
344 void OnWindowAddedToRootWindow(aura::Window* window) override { | 349 void OnWindowAddedToRootWindow(aura::Window* window) override { |
sky
2015/04/09 00:01:14
I don't think you're handling the case of ancestor
ananta
2015/04/09 03:36:05
Done.
| |
345 if (window == view_->window_) | 350 if (window == view_->window_) { |
351 // We observe the ancestors for bounds changes and snap the RWHVA | |
352 // instance to pixel boundaries. Reason for doing this is there are | |
353 // cases like the fast resize code path for bookmarks where in the | |
354 // parent of RWHVA which is WCV has its bounds changed before the | |
355 // bookmark is hidden. This results in it reporting the old bounds | |
356 // which includes the bookmark. Eventually when it does get the correct | |
357 // bounds after the bar is hidden, the layer ignores the bounds changed | |
358 // call as the bounds are the same. To work around this we observe the | |
359 // parent of WCV for bounds changed notifications and snap when we | |
360 // receive them. | |
361 aura::Window* parent = window->parent(); | |
362 while (parent) { | |
363 parent->AddObserver(this); | |
364 ancestor_observer_map_[parent] = true; | |
365 parent = parent->parent(); | |
366 } | |
346 view_->AddedToRootWindow(); | 367 view_->AddedToRootWindow(); |
368 } | |
347 } | 369 } |
348 | 370 |
349 void OnWindowRemovingFromRootWindow(aura::Window* window, | 371 void OnWindowRemovingFromRootWindow(aura::Window* window, |
350 aura::Window* new_root) override { | 372 aura::Window* new_root) override { |
351 if (window == view_->window_) | 373 if (window == view_->window_) { |
374 RemoveAncestorObservers(); | |
352 view_->RemovingFromRootWindow(); | 375 view_->RemovingFromRootWindow(); |
376 } | |
377 } | |
378 | |
379 void OnWindowBoundsChanged(aura::Window* window, | |
380 const gfx::Rect& old_bounds, | |
381 const gfx::Rect& new_bounds) override { | |
382 if (ancestor_observer_map_.find(window) != ancestor_observer_map_.end()) | |
383 view_->HandleParentBoundsChanged(); | |
353 } | 384 } |
354 | 385 |
355 private: | 386 private: |
387 void RemoveAncestorObservers() { | |
388 for (auto ancestor_iterator : ancestor_observer_map_) | |
389 ancestor_iterator.first->RemoveObserver(this); | |
390 ancestor_observer_map_.clear(); | |
391 } | |
392 | |
356 RenderWidgetHostViewAura* view_; | 393 RenderWidgetHostViewAura* view_; |
394 std::map<aura::Window*, bool> ancestor_observer_map_; | |
sky
2015/04/09 00:01:14
I don't think you need a map, how about a set?
ananta
2015/04/09 03:36:05
Done.
| |
357 | 395 |
358 DISALLOW_COPY_AND_ASSIGN(WindowObserver); | 396 DISALLOW_COPY_AND_ASSIGN(WindowObserver); |
359 }; | 397 }; |
360 | 398 |
361 //////////////////////////////////////////////////////////////////////////////// | 399 //////////////////////////////////////////////////////////////////////////////// |
362 // RenderWidgetHostViewAura, public: | 400 // RenderWidgetHostViewAura, public: |
363 | 401 |
364 RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, | 402 RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, |
365 bool is_guest_view_hack) | 403 bool is_guest_view_hack) |
366 : host_(RenderWidgetHostImpl::From(host)), | 404 : host_(RenderWidgetHostImpl::From(host)), |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
727 ui::EF_RIGHT_MOUSE_BUTTON; | 765 ui::EF_RIGHT_MOUSE_BUTTON; |
728 return (event->flags() & kAllowedButtons) != 0; | 766 return (event->flags() & kAllowedButtons) != 0; |
729 } | 767 } |
730 default: | 768 default: |
731 break; | 769 break; |
732 } | 770 } |
733 #endif | 771 #endif |
734 return true; | 772 return true; |
735 } | 773 } |
736 | 774 |
775 void RenderWidgetHostViewAura::HandleParentBoundsChanged() { | |
776 SnapToPhysicalPixelBoundary(); | |
sky
2015/04/09 00:01:14
Does this mean we can remove some calls to SnapToP
ananta
2015/04/09 03:36:05
Removed the call from WCVA.
| |
777 #if defined(OS_WIN) | |
778 if (legacy_render_widget_host_HWND_) { | |
779 legacy_render_widget_host_HWND_->SetBounds( | |
780 window_->GetBoundsInRootWindow()); | |
781 } | |
782 #endif | |
783 } | |
784 | |
737 void RenderWidgetHostViewAura::MovePluginWindows( | 785 void RenderWidgetHostViewAura::MovePluginWindows( |
738 const std::vector<WebPluginGeometry>& plugin_window_moves) { | 786 const std::vector<WebPluginGeometry>& plugin_window_moves) { |
739 #if defined(OS_WIN) | 787 #if defined(OS_WIN) |
740 // We need to clip the rectangle to the tab's viewport, otherwise we will draw | 788 // We need to clip the rectangle to the tab's viewport, otherwise we will draw |
741 // over the browser UI. | 789 // over the browser UI. |
742 if (!window_->GetRootWindow()) { | 790 if (!window_->GetRootWindow()) { |
743 DCHECK(plugin_window_moves.empty()); | 791 DCHECK(plugin_window_moves.empty()); |
744 return; | 792 return; |
745 } | 793 } |
746 HWND parent = window_->GetHost()->GetAcceleratedWidget(); | 794 HWND parent = window_->GetHost()->GetAcceleratedWidget(); |
(...skipping 1946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2693 | 2741 |
2694 //////////////////////////////////////////////////////////////////////////////// | 2742 //////////////////////////////////////////////////////////////////////////////// |
2695 // RenderWidgetHostViewBase, public: | 2743 // RenderWidgetHostViewBase, public: |
2696 | 2744 |
2697 // static | 2745 // static |
2698 void RenderWidgetHostViewBase::GetDefaultScreenInfo(WebScreenInfo* results) { | 2746 void RenderWidgetHostViewBase::GetDefaultScreenInfo(WebScreenInfo* results) { |
2699 GetScreenInfoForWindow(results, NULL); | 2747 GetScreenInfoForWindow(results, NULL); |
2700 } | 2748 } |
2701 | 2749 |
2702 } // namespace content | 2750 } // namespace content |
OLD | NEW |