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

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: Rebasing and responding to comments Created 7 years, 1 month 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 "content/browser/web_contents/web_contents_view_aura.h"
10 #include "ui/aura/test/aura_test_base.h"
11 #include "ui/aura/window.h"
12
13 namespace content {
14
15 NativeViewScreenBoundsObserver::NativeViewScreenBoundsObserver(
16 NativeViewScreenBoundsObserverDelegate* delegate,
17 aura::Window* window)
18 : delegate_(delegate),
19 window_(window) {
20 DCHECK(delegate);
21 DCHECK(window);
22 delegate_ = delegate;
23 window_ = window;
24 std::set<aura::Window*> windows_to_root = CollectAllWindowsToRoot(window_);
25 AddToObserved(windows_to_root);
26 }
27
28 NativeViewScreenBoundsObserver::~NativeViewScreenBoundsObserver() {
29 RemoveFromObserved(observed_);
30 if (window_->GetDispatcher())
31 window_->GetDispatcher()->RemoveRootWindowObserver(this);
32 }
33
34 void NativeViewScreenBoundsObserver::OnWindowParentChanged(
35 aura::Window* window,
36 aura::Window* parent) {
37 std::set<aura::Window*> windows_to_root = CollectAllWindowsToRoot(window_);
38 std::set<aura::Window*> difference;
39 std::set_difference(
40 observed_.begin(),
41 observed_.end(),
42 windows_to_root.begin(),
43 windows_to_root.end(),
44 std::inserter(difference, difference.end()));
45 RemoveFromObserved(difference);
46
47 difference.clear();
48 std::set_difference(
49 windows_to_root.begin(),
50 windows_to_root.end(),
51 observed_.begin(),
52 observed_.end(),
53 std::inserter(difference, difference.end()));
54 AddToObserved(difference);
55 }
56
57 void NativeViewScreenBoundsObserver::OnWindowBoundsChanged(
58 aura::Window* window,
59 const gfx::Rect& old_bounds,
60 const gfx::Rect& new_bounds) {
61 if (old_bounds.size() == new_bounds.size()) {
62 delegate_->OnScreenPositionChanged();
63 } else {
64 delegate_->OnScreenBoundsChanged();
65 }
66 }
67
68 void NativeViewScreenBoundsObserver::OnWindowAddedToRootWindow(
69 aura::Window* window) {
70 if (window == window_ && window_->GetDispatcher())
71 window_->GetDispatcher()->AddRootWindowObserver(this);
72 }
73
74 void NativeViewScreenBoundsObserver::OnWindowRemovingFromRootWindow(
75 aura::Window* window) {
76 if (window == window_ && window_->GetDispatcher())
77 window_->GetDispatcher()->RemoveRootWindowObserver(this);
78 }
79
80 void NativeViewScreenBoundsObserver::OnRootWindowHostMoved(
81 const aura::RootWindow* root,
82 const gfx::Point& new_origin) {
83 // This is for the desktop case (i.e. Aura desktop).
84 delegate_->OnScreenPositionChanged();
85 }
86
87 std::set<aura::Window*> NativeViewScreenBoundsObserver::CollectAllWindowsToRoot(
88 aura::Window* window) {
89 std::set<aura::Window*> ret_val;
90 if (window)
91 ret_val.insert(window);
92 while (window && window->parent()) {
93 ret_val.insert(window->parent());
94 window = window->parent();
95 }
96 return ret_val;
97 }
98
99 void NativeViewScreenBoundsObserver::AddToObserved(
100 const std::set<aura::Window*>& windows) {
101 for (std::set<aura::Window*>::iterator iter = windows.begin();
102 iter != windows.end();
103 ++iter) {
104 if (observed_.end() == observed_.find(*iter)) {
105 (*iter)->AddObserver(this);
106 observed_.insert(*iter);
107 }
108 }
109 }
110
111 void NativeViewScreenBoundsObserver::RemoveFromObserved(
112 const std::set<aura::Window*>& windows) {
113 // Since windows can possibly be |observer_| we cannot blindly iterate and
114 // delete, since const & means that |windows| is a reference to
115 // |observer_|. Thus if we erase an entry from |observed_| it may be erased
116 // from |windows| which we are iterating.
117 for (std::set<aura::Window*>::iterator iter = windows.begin();
118 iter != windows.end();) {
119 std::set<aura::Window*>::iterator next = iter;
120 next++;
121 if (observed_.end() != observed_.find(*iter)) {
122 (*iter)->RemoveObserver(this);
123 observed_.erase(*iter);
124 }
125 iter = next;
126 }
127 }
128
129 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698