Skip to content
This repository has been archived by the owner on Apr 3, 2020. It is now read-only.

Commit

Permalink
Fix the issue that GetFrameWindow() may change between AddObserver an…
Browse files Browse the repository at this point in the history
…d RemoveObserver in KeyboardController.

BUG=408995
TEST=Verified on linux_chromeos.

Review URL: https://codereview.chromium.org/527153002

Cr-Commit-Position: refs/heads/master@{#292949}
  • Loading branch information
shuchen authored and Commit bot committed Sep 2, 2014
1 parent 045e90a commit afba614
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 18 deletions.
43 changes: 27 additions & 16 deletions ui/keyboard/keyboard_controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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 {
Expand All @@ -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
3 changes: 1 addition & 2 deletions ui/keyboard/keyboard_controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,10 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver,
void ShowAnimationFinished();
void HideAnimationFinished();

// Adds or removes an observer for tracking changes to a window size or
// Adds an observer for tracking changes to a window size or
// position while the keyboard is displayed. Any window repositioning
// invalidates insets for overscrolling.
void AddBoundsChangedObserver(aura::Window* window);
void RemoveBoundsChangedObserver(aura::Window* window);

scoped_ptr<KeyboardControllerProxy> proxy_;
scoped_ptr<aura::Window> container_;
Expand Down

0 comments on commit afba614

Please sign in to comment.