Index: ui/keyboard/keyboard_controller.cc |
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc |
index ceef5941f7e424a9e912a7ad8ee0f8fe9ff73751..6c02069e7ff6e761199c30be5780802c71a78726 100644 |
--- a/ui/keyboard/keyboard_controller.cc |
+++ b/ui/keyboard/keyboard_controller.cc |
@@ -4,6 +4,8 @@ |
#include "ui/keyboard/keyboard_controller.h" |
+#include <set> |
+ |
#include "base/bind.h" |
#include "base/command_line.h" |
#include "content/public/browser/render_widget_host.h" |
@@ -207,6 +209,12 @@ class WindowBoundsChangeObserver : public aura::WindowObserver { |
const gfx::Rect& old_bounds, |
const gfx::Rect& new_bounds) OVERRIDE; |
virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE; |
+ |
+ void AddObservedWindow(aura::Window* window); |
+ void RemoveAllObservedWindows(); |
+ |
+ private: |
+ std::set<aura::Window*> observed_windows_; |
}; |
void WindowBoundsChangeObserver::OnWindowBoundsChanged(aura::Window* window, |
@@ -219,6 +227,21 @@ void WindowBoundsChangeObserver::OnWindowBoundsChanged(aura::Window* window, |
void WindowBoundsChangeObserver::OnWindowDestroyed(aura::Window* window) { |
if (window->HasObserver(this)) |
window->RemoveObserver(this); |
+ observed_windows_.erase(window); |
+} |
+ |
+void WindowBoundsChangeObserver::AddObservedWindow(aura::Window* window) { |
+ if (!window->HasObserver(this)) { |
+ window->AddObserver(this); |
+ observed_windows_.insert(window); |
+ } |
+} |
+ |
+void WindowBoundsChangeObserver::RemoveAllObservedWindows() { |
+ for (std::set<aura::Window*>::iterator it = observed_windows_.begin(); |
+ it != observed_windows_.end(); ++it) |
+ (*it)->RemoveObserver(this); |
+ observed_windows_.clear(); |
} |
// static |
@@ -533,12 +556,10 @@ void KeyboardController::ResetWindowInsets() { |
content::RenderWidgetHost::GetRenderWidgetHosts()); |
while (content::RenderWidgetHost* widget = widgets->GetNextHost()) { |
content::RenderWidgetHostView* view = widget->GetView(); |
- if (view) { |
+ if (view) |
view->SetInsets(insets); |
- aura::Window *window = view->GetNativeView(); |
- RemoveBoundsChangedObserver(window); |
- } |
} |
+ window_bounds_observer_->RemoveAllObservedWindows(); |
} |
bool KeyboardController::WillHideKeyboard() const { |
@@ -558,18 +579,8 @@ void KeyboardController::HideAnimationFinished() { |
void KeyboardController::AddBoundsChangedObserver(aura::Window* window) { |
aura::Window* target_window = GetFrameWindow(window); |
- if (target_window && |
- !target_window->HasObserver(window_bounds_observer_.get())) { |
- target_window->AddObserver(window_bounds_observer_.get()); |
- } |
-} |
- |
-void KeyboardController::RemoveBoundsChangedObserver(aura::Window* window) { |
- aura::Window* target_window = GetFrameWindow(window); |
- if (target_window && |
- target_window->HasObserver(window_bounds_observer_.get())) { |
- target_window->RemoveObserver(window_bounds_observer_.get()); |
- } |
+ if (target_window) |
+ window_bounds_observer_->AddObservedWindow(target_window); |
} |
} // namespace keyboard |