Index: chrome/browser/ui/views/extensions/shell_window_views.cc |
diff --git a/chrome/browser/ui/views/extensions/shell_window_views.cc b/chrome/browser/ui/views/extensions/shell_window_views.cc |
index ef37058540c8503c8b71f8eacf7646d962e41dff..fd392859bdb6106e0faded1bb20db4d4f4b82d30 100644 |
--- a/chrome/browser/ui/views/extensions/shell_window_views.cc |
+++ b/chrome/browser/ui/views/extensions/shell_window_views.cc |
@@ -7,6 +7,10 @@ |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/extensions/extension_host.h" |
#include "chrome/common/extensions/extension.h" |
+#include "content/public/browser/render_view_host.h" |
+#include "content/public/browser/render_widget_host_view.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/browser/web_contents_view.h" |
#include "ui/base/hit_test.h" |
#include "ui/gfx/path.h" |
#include "ui/gfx/scoped_sk_region.h" |
@@ -17,8 +21,6 @@ |
#if defined(OS_WIN) && !defined(USE_AURA) |
#include "chrome/browser/shell_integration.h" |
#include "chrome/browser/web_applications/web_app.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "content/public/browser/render_widget_host_view.h" |
#include "ui/base/win/shell.h" |
#endif |
@@ -96,9 +98,11 @@ void ShellWindowFrameView::GetWindowMask(const gfx::Size& size, |
// Don't touch it. |
} |
-ShellWindowViews::ShellWindowViews(ExtensionHost* host) |
- : ShellWindow(host) { |
- host_->view()->SetContainer(this); |
+ShellWindowViews::ShellWindowViews(Profile* profile, |
+ const Extension* extension, |
+ const GURL& url) |
+ : ShellWindow(profile, extension, url), |
+ initialized_(false) { |
window_ = new views::Widget; |
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); |
params.delegate = this; |
@@ -108,13 +112,12 @@ ShellWindowViews::ShellWindowViews(ExtensionHost* host) |
window_->Init(params); |
#if defined(OS_WIN) && !defined(USE_AURA) |
std::string app_name = web_app::GenerateApplicationNameFromExtensionId( |
- host_->extension()->id()); |
+ extension->id()); |
ui::win::SetAppIdForWindow( |
ShellIntegration::GetAppId(UTF8ToWide(app_name), |
- host_->profile()->GetPath()), |
+ profile->GetPath()), |
GetWidget()->GetTopLevelWidget()->GetNativeWindow()); |
#endif |
- AddChildView(host_->view()); |
SetLayoutManager(new views::FillLayout); |
Layout(); |
@@ -122,6 +125,8 @@ ShellWindowViews::ShellWindowViews(ExtensionHost* host) |
} |
ShellWindowViews::~ShellWindowViews() { |
+ if (initialized_) |
+ NativeViewHost::Detach(); |
} |
bool ShellWindowViews::IsActive() const { |
@@ -234,7 +239,7 @@ views::NonClientFrameView* ShellWindowViews::CreateNonClientFrameView( |
} |
string16 ShellWindowViews::GetWindowTitle() const { |
- return UTF8ToUTF16(host_->extension()->name()); |
+ return UTF8ToUTF16(extension()->name()); |
} |
views::Widget* ShellWindowViews::GetWidget() { |
@@ -249,7 +254,7 @@ void ShellWindowViews::OnViewWasResized() { |
// TODO(jeremya): this doesn't seem like a terribly elegant way to keep the |
// window shape in sync. |
#if defined(OS_WIN) && !defined(USE_AURA) |
- gfx::Size sz = host_->view()->size(); |
+ gfx::Size sz = size(); |
int height = sz.height(), width = sz.width(); |
int radius = 1; |
gfx::Path path; |
@@ -267,7 +272,7 @@ void ShellWindowViews::OnViewWasResized() { |
path.lineTo(0, height - radius - 1); |
path.close(); |
} |
- SetWindowRgn(host_->view()->native_view(), path.CreateNativeRegion(), 1); |
+ SetWindowRgn(native_view(), path.CreateNativeRegion(), 1); |
SkRegion* rgn = new SkRegion; |
if (caption_region_.Get()) |
@@ -278,11 +283,67 @@ void ShellWindowViews::OnViewWasResized() { |
rgn->op(width - kResizeBorderWidth, 0, width, height, SkRegion::kUnion_Op); |
rgn->op(0, height - kResizeBorderWidth, width, height, SkRegion::kUnion_Op); |
} |
- host_->render_view_host()->GetView()->SetClickthroughRegion(rgn); |
+ web_contents()->GetRenderViewHost()->GetView()->SetClickthroughRegion(rgn); |
#endif |
} |
+gfx::NativeCursor ShellWindowViews::GetCursor(const views::MouseEvent& event) { |
+ return gfx::kNullCursor; |
+} |
+ |
+void ShellWindowViews::SetVisible(bool is_visible) { |
+ if (is_visible != visible()) { |
+ NativeViewHost::SetVisible(is_visible); |
+ |
+ // Also tell RenderWidgetHostView the new visibility. Despite its name, it |
+ // is not part of the View hierarchy and does not know about the change |
+ // unless we tell it. |
+ content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); |
+ if (rvh->GetView()) { |
+ if (is_visible) |
+ rvh->GetView()->Show(); |
+ else |
+ rvh->GetView()->Hide(); |
+ } |
+ } |
+} |
+ |
+void ShellWindowViews::ViewHierarchyChanged(bool is_add, |
+ views::View *parent, |
+ views::View *child) { |
+ NativeViewHost::ViewHierarchyChanged(is_add, parent, child); |
+ if (is_add && GetWidget() && !initialized_) { |
+ initialized_ = true; |
+ NativeViewHost::Attach(web_contents()->GetView()->GetNativeView()); |
+ } |
+} |
+ |
+void ShellWindowViews::PreferredSizeChanged() { |
+ View::PreferredSizeChanged(); |
+} |
+ |
+bool ShellWindowViews::SkipDefaultKeyEventProcessing(const views::KeyEvent& e) { |
+ // Let the tab key event be processed by the renderer (instead of moving the |
+ // focus to the next focusable view). Also handle Backspace, since otherwise |
+ // (on Windows at least), pressing Backspace, when focus is on a text field |
+ // within the ExtensionView, will navigate the page back instead of erasing a |
+ // character. |
+ return (e.key_code() == ui::VKEY_TAB || e.key_code() == ui::VKEY_BACK); |
+} |
+ |
+void ShellWindowViews::OnBoundsChanged(const gfx::Rect& previous_bounds) { |
+ // Propagate the new size to RenderWidgetHostView. |
+ // We can't send size zero because RenderWidget DCHECKs that. |
+ content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); |
+ if (rvh->GetView() && !bounds().IsEmpty()) { |
+ rvh->GetView()->SetSize(size()); |
+ OnViewWasResized(); |
+ } |
+} |
+ |
// static |
-ShellWindow* ShellWindow::CreateShellWindow(ExtensionHost* host) { |
- return new ShellWindowViews(host); |
+ShellWindow* ShellWindow::CreateImpl(Profile* profile, |
+ const Extension* extension, |
+ const GURL& url) { |
+ return new ShellWindowViews(profile, extension, url); |
} |