OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "mash/browser/browser.h" | 5 #include "mash/browser/browser.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 86 |
87 Tab* tab_; | 87 Tab* tab_; |
88 | 88 |
89 DISALLOW_COPY_AND_ASSIGN(Background); | 89 DISALLOW_COPY_AND_ASSIGN(Background); |
90 }; | 90 }; |
91 | 91 |
92 Tab(std::unique_ptr<navigation::View> view, | 92 Tab(std::unique_ptr<navigation::View> view, |
93 views::ButtonListener* listener) | 93 views::ButtonListener* listener) |
94 : views::LabelButton(listener, base::ASCIIToUTF16("Blank")), | 94 : views::LabelButton(listener, base::ASCIIToUTF16("Blank")), |
95 view_(std::move(view)) { | 95 view_(std::move(view)) { |
96 view_->SetResizerSize(gfx::Size(16, 16)); | |
97 view_->AddObserver(this); | 96 view_->AddObserver(this); |
98 set_background(new Background(this)); | 97 set_background(new Background(this)); |
99 } | 98 } |
100 ~Tab() override { | 99 ~Tab() override { |
101 view_->RemoveObserver(this); | 100 view_->RemoveObserver(this); |
102 } | 101 } |
103 | 102 |
104 bool selected() const { return selected_; } | 103 bool selected() const { return selected_; } |
105 | 104 |
106 mus::Window* window() { return window_; } | 105 mus::Window* window() { return window_; } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 if (tab_index < selected_index_) | 225 if (tab_index < selected_index_) |
227 --selected_index_; | 226 --selected_index_; |
228 DCHECK(it != tabs_.end()); | 227 DCHECK(it != tabs_.end()); |
229 tabs_.erase(it); | 228 tabs_.erase(it); |
230 RemoveObserver(tab); | 229 RemoveObserver(tab); |
231 tab_container_->RemoveChildView(tab); | 230 tab_container_->RemoveChildView(tab); |
232 if (tab->selected()) { | 231 if (tab->selected()) { |
233 int next_selected_index = selected_index_; | 232 int next_selected_index = selected_index_; |
234 if (selected_index_ == static_cast<int>(tabs_.size())) | 233 if (selected_index_ == static_cast<int>(tabs_.size())) |
235 --next_selected_index; | 234 --next_selected_index; |
236 SelectTab(tabs_[next_selected_index]); | 235 if (next_selected_index >= 0) |
| 236 SelectTab(tabs_[next_selected_index]); |
237 } | 237 } |
238 Layout(); | 238 Layout(); |
239 FOR_EACH_OBSERVER(TabStripObserver, observers_, OnTabRemoved(tab)); | 239 FOR_EACH_OBSERVER(TabStripObserver, observers_, OnTabRemoved(tab)); |
240 delete tab; | 240 delete tab; |
241 } | 241 } |
242 | 242 |
243 bool empty() const { return tabs_.empty(); } | 243 bool empty() const { return tabs_.empty(); } |
244 | 244 |
245 void SelectTab(Tab* tab) { | 245 void SelectTab(Tab* tab) { |
246 auto it = std::find(tabs_.begin(), tabs_.end(), tab); | 246 auto it = std::find(tabs_.begin(), tabs_.end(), tab); |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 if (GetWidget()) | 714 if (GetWidget()) |
715 GetWidget()->UpdateWindowTitle(); | 715 GetWidget()->UpdateWindowTitle(); |
716 } | 716 } |
717 | 717 |
718 // navigation::ViewDelegate: | 718 // navigation::ViewDelegate: |
719 void ViewCreated(navigation::View* source, | 719 void ViewCreated(navigation::View* source, |
720 std::unique_ptr<navigation::View> view, | 720 std::unique_ptr<navigation::View> view, |
721 bool is_popup, | 721 bool is_popup, |
722 const gfx::Rect& initial_rect, | 722 const gfx::Rect& initial_rect, |
723 bool user_gesture) override { | 723 bool user_gesture) override { |
724 if (is_popup) { | 724 if (is_popup) |
725 views::Widget* window = views::Widget::CreateWindowWithContextAndBounds( | 725 CreateNewWindow(std::move(view), initial_rect, is_popup); |
726 new UI(browser_, is_popup ? UI::Type::POPUP : UI::Type::WINDOW, | 726 else |
727 std::move(view)), | |
728 nullptr, initial_rect); | |
729 window->Show(); | |
730 browser_->AddWindow(window); | |
731 } else { | |
732 tab_strip_->AddTab(std::move(view)); | 727 tab_strip_->AddTab(std::move(view)); |
733 } | |
734 } | 728 } |
735 void Close(navigation::View* source) override { | 729 void Close(navigation::View* source) override { |
736 tab_strip_->CloseTabForView(source); | 730 tab_strip_->CloseTabForView(source); |
737 if (tab_strip_->empty()) | 731 if (tab_strip_->empty()) |
738 GetWidget()->Close(); | 732 GetWidget()->Close(); |
739 } | 733 } |
| 734 void OpenURL(navigation::View* source, |
| 735 navigation::mojom::OpenURLParamsPtr params) override { |
| 736 switch (params->disposition) { |
| 737 case navigation::mojom::WindowOpenDisposition::CURRENT_TAB: |
| 738 selected_view()->NavigateToURL(params->url); |
| 739 break; |
| 740 case navigation::mojom::WindowOpenDisposition::NEW_FOREGROUND_TAB: |
| 741 tab_strip_->AddTab(browser_->CreateView()); |
| 742 tab_strip_->selected_tab()->view()->NavigateToURL(params->url); |
| 743 break; |
| 744 case navigation::mojom::WindowOpenDisposition::NEW_POPUP: |
| 745 case navigation::mojom::WindowOpenDisposition::NEW_WINDOW: { |
| 746 std::unique_ptr<navigation::View> view = browser_->CreateView(); |
| 747 view->NavigateToURL(params->url); |
| 748 CreateNewWindow( |
| 749 std::move(view), gfx::Rect(), |
| 750 params->disposition == |
| 751 navigation::mojom::WindowOpenDisposition::NEW_POPUP); |
| 752 break; |
| 753 } |
| 754 default: |
| 755 break; |
| 756 } |
| 757 } |
740 | 758 |
741 // navigation::ViewObserver: | 759 // navigation::ViewObserver: |
742 void LoadingStateChanged(navigation::View* view) override { | 760 void LoadingStateChanged(navigation::View* view) override { |
743 if (view->is_loading()) { | 761 if (view->is_loading()) { |
744 reload_button_->SetText(base::ASCIIToUTF16("Stop")); | 762 reload_button_->SetText(base::ASCIIToUTF16("Stop")); |
745 throbber_->Start(); | 763 throbber_->Start(); |
746 } else { | 764 } else { |
747 reload_button_->SetText(base::ASCIIToUTF16("Reload")); | 765 reload_button_->SetText(base::ASCIIToUTF16("Reload")); |
748 throbber_->Stop(); | 766 throbber_->Stop(); |
749 progress_bar_->SetProgress(0.f); | 767 progress_bar_->SetProgress(0.f); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 } | 801 } |
784 | 802 |
785 navigation::View* selected_view() { | 803 navigation::View* selected_view() { |
786 return const_cast<navigation::View*>( | 804 return const_cast<navigation::View*>( |
787 static_cast<const UI*>(this)->selected_view()); | 805 static_cast<const UI*>(this)->selected_view()); |
788 } | 806 } |
789 const navigation::View* selected_view() const { | 807 const navigation::View* selected_view() const { |
790 return tab_strip_->selected_tab()->view(); | 808 return tab_strip_->selected_tab()->view(); |
791 } | 809 } |
792 | 810 |
| 811 void CreateNewWindow(std::unique_ptr<navigation::View> view, |
| 812 const gfx::Rect& initial_bounds, |
| 813 bool is_popup) { |
| 814 gfx::Rect bounds = initial_bounds; |
| 815 if (bounds.IsEmpty()) |
| 816 bounds = gfx::Rect(10, 10, 400, 300); |
| 817 views::Widget* window = views::Widget::CreateWindowWithContextAndBounds( |
| 818 new UI(browser_, is_popup ? UI::Type::POPUP : UI::Type::WINDOW, |
| 819 std::move(view)), |
| 820 nullptr, bounds); |
| 821 window->Show(); |
| 822 browser_->AddWindow(window); |
| 823 } |
| 824 |
793 void ToggleDebugView() { | 825 void ToggleDebugView() { |
794 showing_debug_view_ = !showing_debug_view_; | 826 showing_debug_view_ = !showing_debug_view_; |
795 Layout(); | 827 Layout(); |
796 } | 828 } |
797 | 829 |
798 Browser* browser_; | 830 Browser* browser_; |
799 | 831 |
800 Type type_; | 832 Type type_; |
801 | 833 |
802 TabStrip* tab_strip_; | 834 TabStrip* tab_strip_; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
869 AddWindow(window); | 901 AddWindow(window); |
870 } | 902 } |
871 | 903 |
872 void Browser::Create(shell::Connection* connection, | 904 void Browser::Create(shell::Connection* connection, |
873 mojom::LaunchableRequest request) { | 905 mojom::LaunchableRequest request) { |
874 bindings_.AddBinding(this, std::move(request)); | 906 bindings_.AddBinding(this, std::move(request)); |
875 } | 907 } |
876 | 908 |
877 } // namespace browser | 909 } // namespace browser |
878 } // namespace mash | 910 } // namespace mash |
OLD | NEW |