Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: content/browser/web_contents/aura/native_view_screen_bounds_observer.cc

Issue 54623007: Make code path for bounds changes getting to renderer less brittle (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Experimenting with single observer design Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/web_contents/aura/native_view_screen_bounds_observer.h "
6
7 #include <algorithm>
8
9 #include "base/debug/trace_event.h"
10 #include "content/browser/web_contents/web_contents_view_aura.h"
11 #include "ui/aura/test/aura_test_base.h"
12 #include "ui/aura/window.h"
13
14 namespace content {
15
16 NativeViewScreenBoundsObserver::NativeViewScreenBoundsObserver(
17 NativeViewScreenBoundsObserverDelegate* delegate,
18 aura::Window* window)
19 : delegate_(delegate),
20 window_(window) {
21 DCHECK(delegate);
22 DCHECK(window);
23 delegate_ = delegate;
24 window_ = window;
25 std::set<aura::Window*> windows_to_root = CollectAllWindowsToRoot(window_);
26 AddToObserved(windows_to_root);
27 }
28
29 NativeViewScreenBoundsObserver::~NativeViewScreenBoundsObserver() {
30 RemoveFromObserved(observed_);
31 if (window_->GetDispatcher())
32 window_->GetDispatcher()->RemoveRootWindowObserver(this);
33 }
34
35 void NativeViewScreenBoundsObserver::OnWindowParentChanged(
36 aura::Window* window,
37 aura::Window* parent) {
38 std::set<aura::Window*> windows_to_root = CollectAllWindowsToRoot(window_);
39 std::set<aura::Window*> difference;
40 std::set_difference(
41 observed_.begin(),
42 observed_.end(),
43 windows_to_root.begin(),
44 windows_to_root.end(),
45 std::inserter(difference, difference.end()));
46 RemoveFromObserved(difference);
47
48 difference.clear();
49 std::set_difference(
50 windows_to_root.begin(),
51 windows_to_root.end(),
52 observed_.begin(),
53 observed_.end(),
54 std::inserter(difference, difference.end()));
55 AddToObserved(difference);
56 }
57
58 void NativeViewScreenBoundsObserver::OnWindowBoundsChanged(
59 aura::Window* window,
60 const gfx::Rect& old_bounds,
61 const gfx::Rect& new_bounds) {
62 if (old_bounds.size() == new_bounds.size()) {
63 delegate_->OnScreenPositionChanged();
64 } else {
65 delegate_->OnScreenBoundsChanged();
66 }
67 }
68
69 void NativeViewScreenBoundsObserver::OnWindowAddedToRootWindow(
70 aura::Window* window) {
71 if (window == window_ && window_->GetDispatcher())
72 window_->GetDispatcher()->AddRootWindowObserver(this);
73 }
74
75 void NativeViewScreenBoundsObserver::OnWindowRemovingFromRootWindow(
76 aura::Window* window) {
77 if (window == window_ && window_->GetDispatcher())
78 window_->GetDispatcher()->RemoveRootWindowObserver(this);
79 }
80
81 void NativeViewScreenBoundsObserver::OnRootWindowHostMoved(
82 const aura::RootWindow* root,
83 const gfx::Point& new_origin) {
84 TRACE_EVENT1("ui",
85 "WebContentsViewAura::WindowObserver::OnWindowTreeHostMoved",
86 "new_origin", new_origin.ToString());
87
88 // This is for the desktop case (i.e. Aura desktop).
89 delegate_->OnScreenPositionChanged();
90 }
91
92 std::set<aura::Window*> NativeViewScreenBoundsObserver::CollectAllWindowsToRoot(
93 aura::Window* window) {
94 std::set<aura::Window*> ret_val;
95 if (window)
96 ret_val.insert(window);
97 while (window && window->parent()) {
98 ret_val.insert(window->parent());
99 window = window->parent();
100 }
101 return ret_val;
102 }
103
104 void NativeViewScreenBoundsObserver::AddToObserved(
105 const std::set<aura::Window*>& windows) {
106 for (std::set<aura::Window*>::iterator iter = windows.begin();
107 iter != windows.end();
108 ++iter) {
109 if (observed_.end() == observed_.find(*iter)) {
110 (*iter)->AddObserver(this);
111 observed_.insert(*iter);
112 }
113 }
114 }
115
116 void NativeViewScreenBoundsObserver::RemoveFromObserved(
117 const std::set<aura::Window*>& windows) {
118 // Since windows can possibly be |observer_| we cannot blindly iterate and
119 // delete, since const & means that |windows| is a reference to
120 // |observer_|. Thus if we erase an entry from |observed_| it may be erased
121 // from |windows| which we are iterating.
122 for (std::set<aura::Window*>::iterator iter = windows.begin();
123 iter != windows.end();) {
124 std::set<aura::Window*>::iterator next = iter;
125 next++;
126 if (observed_.end() != observed_.find(*iter)) {
127 (*iter)->RemoveObserver(this);
128 observed_.erase(*iter);
129 }
130 iter = next;
131 }
132 }
133
134 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698