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

Unified Diff: content/browser/web_contents/web_contents_view_aura.cc

Issue 69833002: When DWM compositing is disabled (i.e. XP, RDP) ensure that windowed NPAPI plugins don't cover UI d… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fixes 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/web_contents/web_contents_view_aura.cc
===================================================================
--- content/browser/web_contents/web_contents_view_aura.cc (revision 234770)
+++ content/browser/web_contents/web_contents_view_aura.cc (working copy)
@@ -655,6 +655,11 @@
: view_(view),
parent_(NULL) {
view_->window_->AddObserver(this);
+
+#if defined(OS_WIN)
+ if (view_->window_->GetRootWindow())
+ view_->window_->GetRootWindow()->AddObserver(this);
+#endif
}
virtual ~WindowObserver() {
@@ -670,6 +675,14 @@
for (size_t i = 0; i < children.size(); ++i)
children[i]->RemoveObserver(this);
}
+
+ aura::Window* root_window = view_->window_->GetRootWindow();
+ if (root_window) {
+ root_window->RemoveObserver(this);
+ const aura::Window::Windows& root_children = root_window->children();
+ for (size_t i = 0; i < root_children.size(); ++i)
+ root_children[i]->RemoveObserver(this);
+ }
#endif
}
@@ -682,24 +695,38 @@
// going to be deprecated in a year, this is ok for now. The test for this is
// PrintPreviewTest.WindowedNPAPIPluginHidden.
virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE {
- if (new_window->parent() != parent_)
+ if (new_window == view_->window_)
return;
- new_window->AddObserver(this);
- UpdateConstrainedWindows(NULL);
+ if (new_window == parent_)
+ return; // This happens if the parent moves to the root window.
+
+ // Observe sibling windows of the WebContents, or children of the root
+ // window.
+ if (new_window->parent() == parent_ ||
+ new_window->parent() == view_->window_->GetRootWindow()) {
+ new_window->AddObserver(this);
+ UpdateConstrainedWindows(NULL);
+ }
}
virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE {
- if (window->parent() == parent_ && window != view_->window_) {
- window->RemoveObserver(this);
- UpdateConstrainedWindows(window);
- }
+ if (window == view_->window_)
+ return;
+
+ window->RemoveObserver(this);
+ UpdateConstrainedWindows(window);
}
virtual void OnWindowVisibilityChanged(aura::Window* window,
bool visible) OVERRIDE {
- if (window->parent() == parent_ && window != view_->window_)
+ if (window == view_->window_)
+ return;
+
+ if (window->parent() == parent_ ||
+ window->parent() == view_->window_->GetRootWindow()) {
UpdateConstrainedWindows(NULL);
+ }
}
#endif
@@ -721,16 +748,24 @@
if (view)
view->UpdateConstrainedWindowRects(std::vector<gfx::Rect>());
}
+
+ // When we get parented to the root window, the code below will watch the
+ // parent, aka root window. Since we already watch the root window on
+ // Windows, unregister first so that the debug check doesn't fire.
+ if (parent && parent == window->GetRootWindow())
+ parent->RemoveObserver(this);
#endif
parent_ = parent;
if (parent) {
parent->AddObserver(this);
#if defined(OS_WIN)
- const aura::Window::Windows& children = parent_->children();
- for (size_t i = 0; i < children.size(); ++i) {
- if (children[i] != view_->window_)
- children[i]->AddObserver(this);
+ if (parent != window->GetRootWindow()) {
+ const aura::Window::Windows& children = parent->children();
+ for (size_t i = 0; i < children.size(); ++i) {
+ if (children[i] != view_->window_)
+ children[i]->AddObserver(this);
+ }
}
#endif
}
@@ -751,13 +786,21 @@
}
virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
- if (window == view_->window_)
+ if (window == view_->window_) {
window->GetDispatcher()->AddRootWindowObserver(this);
+#if defined(OS_WIN)
+ window->GetRootWindow()->AddObserver(this);
+#endif
+ }
}
virtual void OnWindowRemovingFromRootWindow(aura::Window* window) OVERRIDE {
- if (window == view_->window_)
+ if (window == view_->window_) {
window->GetDispatcher()->RemoveRootWindowObserver(this);
+#if defined(OS_WIN)
+ window->GetRootWindow()->RemoveObserver(this);
+#endif
+ }
}
// Overridden RootWindowObserver:
@@ -785,15 +828,29 @@
return;
std::vector<gfx::Rect> constrained_windows;
- const aura::Window::Windows& children = parent_->children();
- for (size_t i = 0; i < children.size(); ++i) {
- if (children[i] != view_->window_ &&
- children[i] != exclude &&
- children[i]->IsVisible()) {
- constrained_windows.push_back(children[i]->GetBoundsInRootWindow());
+ if (parent_) {
+ const aura::Window::Windows& children = parent_->children();
+ for (size_t i = 0; i < children.size(); ++i) {
+ if (children[i] != view_->window_ &&
+ children[i] != exclude &&
+ children[i]->IsVisible()) {
+ constrained_windows.push_back(children[i]->GetBoundsInRootWindow());
+ }
}
}
+ aura::Window* root_window = view_->window_->GetRootWindow();
+ const aura::Window::Windows& root_children = root_window->children();
+ if (root_window) {
+ for (size_t i = 0; i < root_children.size(); ++i) {
+ if (root_children[i]->IsVisible() &&
+ !root_children[i]->Contains(view_->window_.get())) {
+ constrained_windows.push_back(
+ root_children[i]->GetBoundsInRootWindow());
+ }
+ }
+ }
+
view->UpdateConstrainedWindowRects(constrained_windows);
}
#endif
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698