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

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

Powered by Google App Engine
This is Rietveld 408576698