| 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/browser/favicon/favicon_tab_helper.h" | 9 #include "chrome/browser/favicon/favicon_tab_helper.h" |
| 10 #include "chrome/browser/ui/tab_contents/tab_contents.h" | 10 #include "chrome/browser/ui/tab_contents/tab_contents.h" |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 resize_border, | 203 resize_border, |
| 204 resize_border, | 204 resize_border, |
| 205 kResizeAreaCornerSize, | 205 kResizeAreaCornerSize, |
| 206 kResizeAreaCornerSize, | 206 kResizeAreaCornerSize, |
| 207 can_ever_resize); | 207 can_ever_resize); |
| 208 if (frame_component != HTNOWHERE) | 208 if (frame_component != HTNOWHERE) |
| 209 return frame_component; | 209 return frame_component; |
| 210 | 210 |
| 211 // Check for possible draggable region in the client area for the frameless | 211 // Check for possible draggable region in the client area for the frameless |
| 212 // window. | 212 // window. |
| 213 if (window_->frameless() && | 213 if (window_->IsInsideDraggableRegions(point.x(), point.y())) |
| 214 window_->draggable_region() && | |
| 215 window_->draggable_region()->contains(point.x(), point.y())) | |
| 216 return HTCAPTION; | 214 return HTCAPTION; |
| 217 | 215 |
| 218 int client_component = frame_->client_view()->NonClientHitTest(point); | 216 int client_component = frame_->client_view()->NonClientHitTest(point); |
| 219 if (client_component != HTNOWHERE) | 217 if (client_component != HTNOWHERE) |
| 220 return client_component; | 218 return client_component; |
| 221 | 219 |
| 222 // Then see if the point is within any of the window controls. | 220 // Then see if the point is within any of the window controls. |
| 223 if (close_button_ && close_button_->visible() && | 221 if (close_button_ && close_button_->visible() && |
| 224 close_button_->GetMirroredBounds().Contains(point)) | 222 close_button_->GetMirroredBounds().Contains(point)) |
| 225 return HTCLOSE; | 223 return HTCLOSE; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 | 308 |
| 311 void ShellWindowFrameView::ButtonPressed(views::Button* sender, | 309 void ShellWindowFrameView::ButtonPressed(views::Button* sender, |
| 312 const ui::Event& event) { | 310 const ui::Event& event) { |
| 313 DCHECK(!window_->frameless()); | 311 DCHECK(!window_->frameless()); |
| 314 if (sender == close_button_) | 312 if (sender == close_button_) |
| 315 frame_->Close(); | 313 frame_->Close(); |
| 316 } | 314 } |
| 317 | 315 |
| 318 ShellWindowViews::ShellWindowViews(ShellWindow* shell_window, | 316 ShellWindowViews::ShellWindowViews(ShellWindow* shell_window, |
| 319 const ShellWindow::CreateParams& win_params) | 317 const ShellWindow::CreateParams& win_params) |
| 320 : shell_window_(shell_window), | 318 : NativeShellWindow(win_params), |
| 319 shell_window_(shell_window), |
| 321 web_view_(NULL), | 320 web_view_(NULL), |
| 322 is_fullscreen_(false), | 321 is_fullscreen_(false) { |
| 323 frameless_(win_params.frame == ShellWindow::CreateParams::FRAME_NONE) { | |
| 324 window_ = new views::Widget; | 322 window_ = new views::Widget; |
| 325 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); | 323 views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW); |
| 326 params.delegate = this; | 324 params.delegate = this; |
| 327 params.remove_standard_frame = true; | 325 params.remove_standard_frame = true; |
| 328 params.use_system_default_icon = true; | 326 params.use_system_default_icon = true; |
| 329 minimum_size_ = win_params.minimum_size; | 327 minimum_size_ = win_params.minimum_size; |
| 330 maximum_size_ = win_params.maximum_size; | 328 maximum_size_ = win_params.maximum_size; |
| 331 window_->Init(params); | 329 window_->Init(params); |
| 332 gfx::Rect window_bounds = | 330 gfx::Rect window_bounds = |
| 333 window_->non_client_view()->GetWindowBoundsForClientBounds( | 331 window_->non_client_view()->GetWindowBoundsForClientBounds( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 360 return web_view_; | 358 return web_view_; |
| 361 } | 359 } |
| 362 | 360 |
| 363 bool ShellWindowViews::ShouldDescendIntoChildForEventHandling( | 361 bool ShellWindowViews::ShouldDescendIntoChildForEventHandling( |
| 364 gfx::NativeView child, | 362 gfx::NativeView child, |
| 365 const gfx::Point& location) { | 363 const gfx::Point& location) { |
| 366 #if defined(USE_AURA) | 364 #if defined(USE_AURA) |
| 367 DCHECK_EQ(child, web_view_->web_contents()->GetView()->GetNativeView()); | 365 DCHECK_EQ(child, web_view_->web_contents()->GetView()->GetNativeView()); |
| 368 // Shell window should claim mouse events that fall within the draggable | 366 // Shell window should claim mouse events that fall within the draggable |
| 369 // region. | 367 // region. |
| 370 return !draggable_region_.get() || | 368 return !IsInsideDraggableRegions(location.x(), location.y()); |
| 371 !draggable_region_->contains(location.x(), location.y()); | |
| 372 #else | 369 #else |
| 373 return true; | 370 return true; |
| 374 #endif | 371 #endif |
| 375 } | 372 } |
| 376 | 373 |
| 377 void ShellWindowViews::OnFocus() { | 374 void ShellWindowViews::OnFocus() { |
| 378 web_view_->RequestFocus(); | 375 web_view_->RequestFocus(); |
| 379 } | 376 } |
| 380 | 377 |
| 381 void ShellWindowViews::ViewHierarchyChanged( | 378 void ShellWindowViews::ViewHierarchyChanged( |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 return CanResize(); | 499 return CanResize(); |
| 503 } | 500 } |
| 504 | 501 |
| 505 views::View* ShellWindowViews::GetContentsView() { | 502 views::View* ShellWindowViews::GetContentsView() { |
| 506 return this; | 503 return this; |
| 507 } | 504 } |
| 508 | 505 |
| 509 views::NonClientFrameView* ShellWindowViews::CreateNonClientFrameView( | 506 views::NonClientFrameView* ShellWindowViews::CreateNonClientFrameView( |
| 510 views::Widget* widget) { | 507 views::Widget* widget) { |
| 511 #if defined(USE_ASH) | 508 #if defined(USE_ASH) |
| 512 if (!frameless_) { | 509 if (!frameless()) { |
| 513 ash::CustomFrameViewAsh* frame = new ash::CustomFrameViewAsh(); | 510 ash::CustomFrameViewAsh* frame = new ash::CustomFrameViewAsh(); |
| 514 frame->Init(widget); | 511 frame->Init(widget); |
| 515 return frame; | 512 return frame; |
| 516 } | 513 } |
| 517 #endif | 514 #endif |
| 518 ShellWindowFrameView* frame_view = new ShellWindowFrameView(this); | 515 ShellWindowFrameView* frame_view = new ShellWindowFrameView(this); |
| 519 frame_view->Init(window_); | 516 frame_view->Init(window_); |
| 520 return frame_view; | 517 return frame_view; |
| 521 } | 518 } |
| 522 | 519 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 540 DCHECK(window_); | 537 DCHECK(window_); |
| 541 DCHECK(web_view_); | 538 DCHECK(web_view_); |
| 542 gfx::Size sz = web_view_->size(); | 539 gfx::Size sz = web_view_->size(); |
| 543 int height = sz.height(), width = sz.width(); | 540 int height = sz.height(), width = sz.width(); |
| 544 int radius = 1; | 541 int radius = 1; |
| 545 gfx::Path path; | 542 gfx::Path path; |
| 546 if (window_->IsMaximized() || window_->IsFullscreen()) { | 543 if (window_->IsMaximized() || window_->IsFullscreen()) { |
| 547 // Don't round the corners when the window is maximized or fullscreen. | 544 // Don't round the corners when the window is maximized or fullscreen. |
| 548 path.addRect(0, 0, width, height); | 545 path.addRect(0, 0, width, height); |
| 549 } else { | 546 } else { |
| 550 if (frameless_) { | 547 if (frameless()) { |
| 551 path.moveTo(0, radius); | 548 path.moveTo(0, radius); |
| 552 path.lineTo(radius, 0); | 549 path.lineTo(radius, 0); |
| 553 path.lineTo(width - radius, 0); | 550 path.lineTo(width - radius, 0); |
| 554 path.lineTo(width, radius); | 551 path.lineTo(width, radius); |
| 555 } else { | 552 } else { |
| 556 // Don't round the top corners in chrome-style frame mode. | 553 // Don't round the top corners in chrome-style frame mode. |
| 557 path.moveTo(0, 0); | 554 path.moveTo(0, 0); |
| 558 path.lineTo(width, 0); | 555 path.lineTo(width, 0); |
| 559 } | 556 } |
| 560 path.lineTo(width, height - radius - 1); | 557 path.lineTo(width, height - radius - 1); |
| 561 path.lineTo(width - radius - 1, height); | 558 path.lineTo(width - radius - 1, height); |
| 562 path.lineTo(radius + 1, height); | 559 path.lineTo(radius + 1, height); |
| 563 path.lineTo(0, height - radius - 1); | 560 path.lineTo(0, height - radius - 1); |
| 564 path.close(); | 561 path.close(); |
| 565 } | 562 } |
| 566 SetWindowRgn(web_contents()->GetNativeView(), path.CreateNativeRegion(), 1); | 563 SetWindowRgn(web_contents()->GetNativeView(), path.CreateNativeRegion(), 1); |
| 567 | 564 |
| 568 SkRegion* rgn = new SkRegion; | 565 SkRegion* rgn = new SkRegion; |
| 569 if (!window_->IsFullscreen()) { | 566 if (!window_->IsFullscreen()) { |
| 570 if (draggable_region()) | 567 if (draggable_regions()) |
| 571 rgn->op(*draggable_region(), SkRegion::kUnion_Op); | 568 rgn->op(*draggable_regions(), SkRegion::kUnion_Op); |
| 572 if (!window_->IsMaximized()) { | 569 if (!window_->IsMaximized()) { |
| 573 if (frameless_) | 570 if (frameless()) |
| 574 rgn->op(0, 0, width, kResizeInsideBoundsSize, SkRegion::kUnion_Op); | 571 rgn->op(0, 0, width, kResizeInsideBoundsSize, SkRegion::kUnion_Op); |
| 575 rgn->op(0, 0, kResizeInsideBoundsSize, height, SkRegion::kUnion_Op); | 572 rgn->op(0, 0, kResizeInsideBoundsSize, height, SkRegion::kUnion_Op); |
| 576 rgn->op(width - kResizeInsideBoundsSize, 0, width, height, | 573 rgn->op(width - kResizeInsideBoundsSize, 0, width, height, |
| 577 SkRegion::kUnion_Op); | 574 SkRegion::kUnion_Op); |
| 578 rgn->op(0, height - kResizeInsideBoundsSize, width, height, | 575 rgn->op(0, height - kResizeInsideBoundsSize, width, height, |
| 579 SkRegion::kUnion_Op); | 576 SkRegion::kUnion_Op); |
| 580 } | 577 } |
| 581 } | 578 } |
| 582 if (web_contents()->GetRenderViewHost()->GetView()) | 579 if (web_contents()->GetRenderViewHost()->GetView()) |
| 583 web_contents()->GetRenderViewHost()->GetView()->SetClickthroughRegion(rgn); | 580 web_contents()->GetRenderViewHost()->GetView()->SetClickthroughRegion(rgn); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 window_->UpdateWindowIcon(); | 615 window_->UpdateWindowIcon(); |
| 619 } | 616 } |
| 620 | 617 |
| 621 void ShellWindowViews::UpdateWindowTitle() { | 618 void ShellWindowViews::UpdateWindowTitle() { |
| 622 window_->UpdateWindowTitle(); | 619 window_->UpdateWindowTitle(); |
| 623 } | 620 } |
| 624 | 621 |
| 625 void ShellWindowViews::UpdateDraggableRegions( | 622 void ShellWindowViews::UpdateDraggableRegions( |
| 626 const std::vector<extensions::DraggableRegion>& regions) { | 623 const std::vector<extensions::DraggableRegion>& regions) { |
| 627 // Draggable region is not supported for non-frameless window. | 624 // Draggable region is not supported for non-frameless window. |
| 628 if (!frameless_) | 625 if (!frameless()) |
| 629 return; | 626 return; |
| 630 | 627 |
| 631 SkRegion* draggable_region = new SkRegion; | 628 NativeShellWindow::UpdateDraggableRegions(regions); |
| 632 | |
| 633 // By default, the whole window is non-draggable. We need to explicitly | |
| 634 // include those draggable regions. | |
| 635 for (std::vector<extensions::DraggableRegion>::const_iterator iter = | |
| 636 regions.begin(); | |
| 637 iter != regions.end(); ++iter) { | |
| 638 const extensions::DraggableRegion& region = *iter; | |
| 639 draggable_region->op( | |
| 640 region.bounds.x(), | |
| 641 region.bounds.y(), | |
| 642 region.bounds.right(), | |
| 643 region.bounds.bottom(), | |
| 644 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); | |
| 645 } | |
| 646 | |
| 647 draggable_region_.reset(draggable_region); | |
| 648 OnViewWasResized(); | 629 OnViewWasResized(); |
| 649 } | 630 } |
| 650 | 631 |
| 651 void ShellWindowViews::UpdateLegacyDraggableRegions( | |
| 652 const std::vector<extensions::DraggableRegion>& regions) { | |
| 653 // Draggable region is not supported for non-frameless window. | |
| 654 if (!frameless_) | |
| 655 return; | |
| 656 | |
| 657 SkRegion* draggable_region = new SkRegion; | |
| 658 | |
| 659 // By default, the whole window is draggable. | |
| 660 gfx::Rect bounds = GetBounds(); | |
| 661 draggable_region->op(0, 0, bounds.right(), bounds.bottom(), | |
| 662 SkRegion::kUnion_Op); | |
| 663 | |
| 664 // Exclude those desinated as non-draggable. | |
| 665 for (std::vector<extensions::DraggableRegion>::const_iterator iter = | |
| 666 regions.begin(); | |
| 667 iter != regions.end(); ++iter) { | |
| 668 const extensions::DraggableRegion& region = *iter; | |
| 669 draggable_region->op(region.bounds.x(), | |
| 670 region.bounds.y(), | |
| 671 region.bounds.right(), | |
| 672 region.bounds.bottom(), | |
| 673 SkRegion::kDifference_Op); | |
| 674 } | |
| 675 | |
| 676 draggable_region_.reset(draggable_region); | |
| 677 OnViewWasResized(); | |
| 678 } | |
| 679 | |
| 680 void ShellWindowViews::HandleKeyboardEvent( | 632 void ShellWindowViews::HandleKeyboardEvent( |
| 681 const content::NativeWebKeyboardEvent& event) { | 633 const content::NativeWebKeyboardEvent& event) { |
| 682 unhandled_keyboard_event_handler_.HandleKeyboardEvent(event, | 634 unhandled_keyboard_event_handler_.HandleKeyboardEvent(event, |
| 683 GetFocusManager()); | 635 GetFocusManager()); |
| 684 } | 636 } |
| 685 | 637 |
| 686 void ShellWindowViews::SaveWindowPlacement(const gfx::Rect& bounds, | 638 void ShellWindowViews::SaveWindowPlacement(const gfx::Rect& bounds, |
| 687 ui::WindowShowState show_state) { | 639 ui::WindowShowState show_state) { |
| 688 views::WidgetDelegate::SaveWindowPlacement(bounds, show_state); | 640 views::WidgetDelegate::SaveWindowPlacement(bounds, show_state); |
| 689 shell_window_->SaveWindowPosition(); | 641 shell_window_->SaveWindowPosition(); |
| 690 } | 642 } |
| 691 | 643 |
| 692 // static | 644 // static |
| 693 NativeShellWindow* NativeShellWindow::Create( | 645 NativeShellWindow* NativeShellWindow::Create( |
| 694 ShellWindow* shell_window, const ShellWindow::CreateParams& params) { | 646 ShellWindow* shell_window, const ShellWindow::CreateParams& params) { |
| 695 return new ShellWindowViews(shell_window, params); | 647 return new ShellWindowViews(shell_window, params); |
| 696 } | 648 } |
| OLD | NEW |