Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/extensions/shell_window_views.h" | 5 #include "chrome/browser/ui/views/extensions/shell_window_views.h" |
| 6 | 6 |
| 7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
| 8 #include "chrome/browser/extensions/extension_host.h" | 8 #include "chrome/browser/extensions/extension_host.h" |
| 9 #include "chrome/common/extensions/extension.h" | 9 #include "chrome/common/extensions/extension.h" |
| 10 #include "content/public/browser/render_view_host.h" | |
| 11 #include "content/public/browser/render_widget_host_view.h" | |
| 12 #include "content/public/browser/web_contents.h" | |
| 13 #include "content/public/browser/web_contents_view.h" | |
| 10 #include "ui/base/hit_test.h" | 14 #include "ui/base/hit_test.h" |
| 11 #include "ui/gfx/path.h" | 15 #include "ui/gfx/path.h" |
| 12 #include "ui/gfx/scoped_sk_region.h" | 16 #include "ui/gfx/scoped_sk_region.h" |
| 13 #include "ui/views/layout/fill_layout.h" | 17 #include "ui/views/layout/fill_layout.h" |
| 14 #include "ui/views/widget/widget.h" | 18 #include "ui/views/widget/widget.h" |
| 15 #include "ui/views/window/non_client_view.h" | 19 #include "ui/views/window/non_client_view.h" |
| 16 | 20 |
| 17 #if defined(OS_WIN) && !defined(USE_AURA) | 21 #if defined(OS_WIN) && !defined(USE_AURA) |
| 18 #include "chrome/browser/shell_integration.h" | 22 #include "chrome/browser/shell_integration.h" |
| 19 #include "chrome/browser/web_applications/web_app.h" | 23 #include "chrome/browser/web_applications/web_app.h" |
| 20 #include "content/public/browser/render_view_host.h" | |
| 21 #include "content/public/browser/render_widget_host_view.h" | |
| 22 #include "ui/base/win/shell.h" | 24 #include "ui/base/win/shell.h" |
| 23 #endif | 25 #endif |
| 24 | 26 |
| 25 #if defined(USE_ASH) | 27 #if defined(USE_ASH) |
| 26 #include "ash/wm/custom_frame_view_ash.h" | 28 #include "ash/wm/custom_frame_view_ash.h" |
| 27 #endif | 29 #endif |
| 28 | 30 |
| 29 // Number of pixels around the edge of the window that can be dragged to | 31 // Number of pixels around the edge of the window that can be dragged to |
| 30 // resize the window. | 32 // resize the window. |
| 31 static const int kResizeBorderWidth = 5; | 33 static const int kResizeBorderWidth = 5; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 if (y >= height() - kResizeBorderWidth) | 91 if (y >= height() - kResizeBorderWidth) |
| 90 return HTBOTTOM; | 92 return HTBOTTOM; |
| 91 return HTCAPTION; | 93 return HTCAPTION; |
| 92 } | 94 } |
| 93 | 95 |
| 94 void ShellWindowFrameView::GetWindowMask(const gfx::Size& size, | 96 void ShellWindowFrameView::GetWindowMask(const gfx::Size& size, |
| 95 gfx::Path* window_mask) { | 97 gfx::Path* window_mask) { |
| 96 // Don't touch it. | 98 // Don't touch it. |
| 97 } | 99 } |
| 98 | 100 |
| 99 ShellWindowViews::ShellWindowViews(ExtensionHost* host) | 101 ShellWindowViews::ShellWindowViews(Profile* profile, |
| 100 : ShellWindow(host) { | 102 const Extension* extension, |
| 101 host_->view()->SetContainer(this); | 103 const GURL& url) |
| 104 : ShellWindow(profile, extension, url), | |
| 105 initialized_(false) { | |
| 102 window_ = new views::Widget; | 106 window_ = new views::Widget; |
| 103 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); | 107 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); |
| 104 params.delegate = this; | 108 params.delegate = this; |
| 105 params.remove_standard_frame = true; | 109 params.remove_standard_frame = true; |
| 106 gfx::Rect bounds(10, 10, kDefaultWidth, kDefaultHeight); | 110 gfx::Rect bounds(10, 10, kDefaultWidth, kDefaultHeight); |
| 107 params.bounds = bounds; | 111 params.bounds = bounds; |
| 108 window_->Init(params); | 112 window_->Init(params); |
| 109 #if defined(OS_WIN) && !defined(USE_AURA) | 113 #if defined(OS_WIN) && !defined(USE_AURA) |
| 110 std::string app_name = web_app::GenerateApplicationNameFromExtensionId( | 114 std::string app_name = web_app::GenerateApplicationNameFromExtensionId( |
| 111 host_->extension()->id()); | 115 extension->id()); |
| 112 ui::win::SetAppIdForWindow( | 116 ui::win::SetAppIdForWindow( |
| 113 ShellIntegration::GetAppId(UTF8ToWide(app_name), | 117 ShellIntegration::GetAppId(UTF8ToWide(app_name), |
| 114 host_->profile()->GetPath()), | 118 profile->GetPath()), |
| 115 GetWidget()->GetTopLevelWidget()->GetNativeWindow()); | 119 GetWidget()->GetTopLevelWidget()->GetNativeWindow()); |
| 116 #endif | 120 #endif |
| 117 AddChildView(host_->view()); | |
|
jeremya
2012/05/07 00:54:38
If you never add a view to the widget, how does th
benwells
2012/05/07 08:46:15
There is no need for the ExtensionView to be a chi
| |
| 118 SetLayoutManager(new views::FillLayout); | 121 SetLayoutManager(new views::FillLayout); |
| 119 Layout(); | 122 Layout(); |
| 120 | 123 |
| 121 window_->Show(); | 124 window_->Show(); |
| 122 } | 125 } |
| 123 | 126 |
| 124 ShellWindowViews::~ShellWindowViews() { | 127 ShellWindowViews::~ShellWindowViews() { |
| 125 } | 128 } |
| 126 | 129 |
| 127 bool ShellWindowViews::IsActive() const { | 130 bool ShellWindowViews::IsActive() const { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 227 // aura. | 230 // aura. |
| 228 ash::CustomFrameViewAsh* frame = new ash::CustomFrameViewAsh(); | 231 ash::CustomFrameViewAsh* frame = new ash::CustomFrameViewAsh(); |
| 229 frame->Init(widget); | 232 frame->Init(widget); |
| 230 return frame; | 233 return frame; |
| 231 #else | 234 #else |
| 232 return new ShellWindowFrameView(); | 235 return new ShellWindowFrameView(); |
| 233 #endif | 236 #endif |
| 234 } | 237 } |
| 235 | 238 |
| 236 string16 ShellWindowViews::GetWindowTitle() const { | 239 string16 ShellWindowViews::GetWindowTitle() const { |
| 237 return UTF8ToUTF16(host_->extension()->name()); | 240 return UTF8ToUTF16(extension()->name()); |
| 238 } | 241 } |
| 239 | 242 |
| 240 views::Widget* ShellWindowViews::GetWidget() { | 243 views::Widget* ShellWindowViews::GetWidget() { |
| 241 return window_; | 244 return window_; |
| 242 } | 245 } |
| 243 | 246 |
| 244 const views::Widget* ShellWindowViews::GetWidget() const { | 247 const views::Widget* ShellWindowViews::GetWidget() const { |
| 245 return window_; | 248 return window_; |
| 246 } | 249 } |
| 247 | 250 |
| 248 void ShellWindowViews::OnViewWasResized() { | 251 void ShellWindowViews::OnViewWasResized() { |
| 249 // TODO(jeremya): this doesn't seem like a terribly elegant way to keep the | 252 // TODO(jeremya): this doesn't seem like a terribly elegant way to keep the |
| 250 // window shape in sync. | 253 // window shape in sync. |
| 251 #if defined(OS_WIN) && !defined(USE_AURA) | 254 #if defined(OS_WIN) && !defined(USE_AURA) |
| 252 gfx::Size sz = host_->view()->size(); | 255 gfx::Size sz = size(); |
| 253 int height = sz.height(), width = sz.width(); | 256 int height = sz.height(), width = sz.width(); |
| 254 int radius = 1; | 257 int radius = 1; |
| 255 gfx::Path path; | 258 gfx::Path path; |
| 256 if (GetWidget()->IsMaximized()) { | 259 if (GetWidget()->IsMaximized()) { |
| 257 // Don't round the corners when the window is maximized. | 260 // Don't round the corners when the window is maximized. |
| 258 path.addRect(0, 0, width, height); | 261 path.addRect(0, 0, width, height); |
| 259 } else { | 262 } else { |
| 260 path.moveTo(0, radius); | 263 path.moveTo(0, radius); |
| 261 path.lineTo(radius, 0); | 264 path.lineTo(radius, 0); |
| 262 path.lineTo(width - radius, 0); | 265 path.lineTo(width - radius, 0); |
| 263 path.lineTo(width, radius); | 266 path.lineTo(width, radius); |
| 264 path.lineTo(width, height - radius - 1); | 267 path.lineTo(width, height - radius - 1); |
| 265 path.lineTo(width - radius - 1, height); | 268 path.lineTo(width - radius - 1, height); |
| 266 path.lineTo(radius + 1, height); | 269 path.lineTo(radius + 1, height); |
| 267 path.lineTo(0, height - radius - 1); | 270 path.lineTo(0, height - radius - 1); |
| 268 path.close(); | 271 path.close(); |
| 269 } | 272 } |
| 270 SetWindowRgn(host_->view()->native_view(), path.CreateNativeRegion(), 1); | 273 SetWindowRgn(native_view(), path.CreateNativeRegion(), 1); |
| 271 | 274 |
| 272 SkRegion* rgn = new SkRegion; | 275 SkRegion* rgn = new SkRegion; |
| 273 if (caption_region_.Get()) | 276 if (caption_region_.Get()) |
| 274 rgn->op(*caption_region_.Get(), SkRegion::kUnion_Op); | 277 rgn->op(*caption_region_.Get(), SkRegion::kUnion_Op); |
| 275 if (!GetWidget()->IsMaximized()) { | 278 if (!GetWidget()->IsMaximized()) { |
| 276 rgn->op(0, 0, width, kResizeBorderWidth, SkRegion::kUnion_Op); | 279 rgn->op(0, 0, width, kResizeBorderWidth, SkRegion::kUnion_Op); |
| 277 rgn->op(0, 0, kResizeBorderWidth, height, SkRegion::kUnion_Op); | 280 rgn->op(0, 0, kResizeBorderWidth, height, SkRegion::kUnion_Op); |
| 278 rgn->op(width - kResizeBorderWidth, 0, width, height, SkRegion::kUnion_Op); | 281 rgn->op(width - kResizeBorderWidth, 0, width, height, SkRegion::kUnion_Op); |
| 279 rgn->op(0, height - kResizeBorderWidth, width, height, SkRegion::kUnion_Op); | 282 rgn->op(0, height - kResizeBorderWidth, width, height, SkRegion::kUnion_Op); |
| 280 } | 283 } |
| 281 host_->render_view_host()->GetView()->SetClickthroughRegion(rgn); | 284 web_contents()->GetRenderViewHost()->GetView()->SetClickthroughRegion(rgn); |
| 282 #endif | 285 #endif |
| 283 } | 286 } |
| 284 | 287 |
| 288 gfx::NativeCursor ShellWindowViews::GetCursor(const views::MouseEvent& event) { | |
| 289 return gfx::kNullCursor; | |
| 290 } | |
| 291 | |
| 292 void ShellWindowViews::SetVisible(bool is_visible) { | |
| 293 if (is_visible != visible()) { | |
| 294 NativeViewHost::SetVisible(is_visible); | |
| 295 | |
| 296 // Also tell RenderWidgetHostView the new visibility. Despite its name, it | |
| 297 // is not part of the View hierarchy and does not know about the change | |
| 298 // unless we tell it. | |
| 299 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); | |
| 300 if (rvh->GetView()) { | |
| 301 if (is_visible) | |
| 302 rvh->GetView()->Show(); | |
| 303 else | |
| 304 rvh->GetView()->Hide(); | |
| 305 } | |
| 306 } | |
| 307 } | |
| 308 | |
| 309 void ShellWindowViews::ViewHierarchyChanged(bool is_add, | |
| 310 views::View *parent, | |
| 311 views::View *child) { | |
| 312 NativeViewHost::ViewHierarchyChanged(is_add, parent, child); | |
| 313 if (is_add && GetWidget() && !initialized_) { | |
| 314 initialized_ = true; | |
| 315 NativeViewHost::Attach(web_contents()->GetView()->GetNativeView()); | |
| 316 } | |
| 317 } | |
| 318 | |
| 319 void ShellWindowViews::PreferredSizeChanged() { | |
| 320 View::PreferredSizeChanged(); | |
| 321 } | |
| 322 | |
| 323 bool ShellWindowViews::SkipDefaultKeyEventProcessing(const views::KeyEvent& e) { | |
| 324 // Let the tab key event be processed by the renderer (instead of moving the | |
| 325 // focus to the next focusable view). Also handle Backspace, since otherwise | |
| 326 // (on Windows at least), pressing Backspace, when focus is on a text field | |
| 327 // within the ExtensionView, will navigate the page back instead of erasing a | |
| 328 // character. | |
| 329 return (e.key_code() == ui::VKEY_TAB || e.key_code() == ui::VKEY_BACK); | |
| 330 } | |
| 331 | |
| 332 void ShellWindowViews::OnBoundsChanged(const gfx::Rect& previous_bounds) { | |
| 333 // Propagate the new size to RenderWidgetHostView. | |
| 334 // We can't send size zero because RenderWidget DCHECKs that. | |
| 335 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); | |
| 336 if (rvh->GetView() && !bounds().IsEmpty()) { | |
| 337 rvh->GetView()->SetSize(size()); | |
| 338 OnViewWasResized(); | |
| 339 } | |
| 340 } | |
| 341 | |
| 285 // static | 342 // static |
| 286 ShellWindow* ShellWindow::CreateShellWindow(ExtensionHost* host) { | 343 ShellWindow* ShellWindow::CreateImpl(Profile* profile, |
| 287 return new ShellWindowViews(host); | 344 const Extension* extension, |
| 345 const GURL& url) { | |
| 346 return new ShellWindowViews(profile, extension, url); | |
| 288 } | 347 } |
| OLD | NEW |