Index: mash/browser/browser.cc |
diff --git a/mash/browser/browser.cc b/mash/browser/browser.cc |
deleted file mode 100644 |
index 094c22698b0befed89cd559a2cf580aaec081d7b..0000000000000000000000000000000000000000 |
--- a/mash/browser/browser.cc |
+++ /dev/null |
@@ -1,918 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mash/browser/browser.h" |
- |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/string16.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "base/timer/timer.h" |
-#include "content/public/common/service_names.mojom.h" |
-#include "mash/browser/debug_view.h" |
-#include "mash/public/interfaces/launchable.mojom.h" |
-#include "services/navigation/public/cpp/view.h" |
-#include "services/navigation/public/cpp/view_delegate.h" |
-#include "services/navigation/public/cpp/view_observer.h" |
-#include "services/navigation/public/interfaces/view.mojom.h" |
-#include "services/service_manager/public/c/main.h" |
-#include "services/service_manager/public/cpp/connector.h" |
-#include "services/service_manager/public/cpp/service.h" |
-#include "services/service_manager/public/cpp/service_context.h" |
-#include "services/service_manager/public/cpp/service_runner.h" |
-#include "ui/aura/window.h" |
-#include "ui/base/models/menu_model.h" |
-#include "ui/gfx/canvas.h" |
-#include "ui/gfx/paint_throbber.h" |
-#include "ui/gfx/text_constants.h" |
-#include "ui/native_theme/native_theme.h" |
-#include "ui/views/background.h" |
-#include "ui/views/controls/button/label_button.h" |
-#include "ui/views/controls/menu/menu_model_adapter.h" |
-#include "ui/views/controls/menu/menu_runner.h" |
-#include "ui/views/controls/textfield/textfield.h" |
-#include "ui/views/controls/textfield/textfield_controller.h" |
-#include "ui/views/layout/box_layout.h" |
-#include "ui/views/mus/aura_init.h" |
-#include "ui/views/widget/widget.h" |
-#include "ui/views/widget/widget_delegate.h" |
-#include "url/gurl.h" |
- |
-namespace mash { |
-namespace browser { |
- |
-void EnableButton(views::CustomButton* button, bool enabled) { |
- button->SetState(enabled ? views::Button::STATE_NORMAL |
- : views::Button::STATE_DISABLED); |
-} |
- |
-class Tab; |
- |
-class TabStripObserver { |
- public: |
- virtual void OnTabAdded(Tab* added) {} |
- virtual void OnTabRemoved(Tab* removed) {} |
- virtual void OnTabSelected(Tab* selected) {} |
-}; |
- |
-class Tab : public views::LabelButton, |
- public navigation::ViewObserver, |
- public TabStripObserver { |
- public: |
- class Background : public views::Background { |
- public: |
- explicit Background(Tab* tab) : tab_(tab) {} |
- ~Background() override {} |
- |
- private: |
- // views::Background: |
- void Paint(gfx::Canvas* canvas, views::View* view) const override { |
- DCHECK_EQ(view, tab_); |
- SkColor bg = tab_->selected() ? SK_ColorGRAY : SK_ColorLTGRAY; |
- gfx::Rect lb = view->GetLocalBounds(); |
- canvas->FillRect(lb, bg); |
- if (!tab_->selected()) { |
- lb.set_y(lb.bottom() - 1); |
- lb.set_height(1); |
- canvas->FillRect(lb, SK_ColorGRAY); |
- } |
- } |
- |
- Tab* tab_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Background); |
- }; |
- |
- Tab(std::unique_ptr<navigation::View> view, |
- views::ButtonListener* listener) |
- : views::LabelButton(listener, base::ASCIIToUTF16("Blank")), |
- view_(std::move(view)) { |
- view_->AddObserver(this); |
- set_background(new Background(this)); |
- } |
- ~Tab() override { |
- view_->RemoveObserver(this); |
- } |
- |
- bool selected() const { return selected_; } |
- |
- aura::Window* window() { return window_; } |
- void SetWindow(aura::Window* window) { |
- window_ = window; |
- if (selected_) |
- window_->Show(); |
- else |
- window_->Hide(); |
- view_->EmbedInWindow(window_); |
- } |
- navigation::View* view() { return view_.get(); } |
- |
- private: |
- // views::View: |
- gfx::Size GetPreferredSize() const override { |
- gfx::Size ps = views::LabelButton::GetPreferredSize(); |
- ps.set_width(180); |
- return ps; |
- } |
- |
- // navigation::ViewObserver: |
- void NavigationStateChanged(navigation::View* view) override { |
- if (!view->title().empty()) |
- SetText(view->title()); |
- } |
- |
- // TabStripObserver: |
- void OnTabSelected(Tab* selected) override { |
- selected_ = selected == this; |
- SetTextColor(views::Button::STATE_NORMAL, |
- selected_ ? SK_ColorWHITE : SK_ColorBLACK); |
- SetTextColor(views::Button::STATE_HOVERED, |
- selected_ ? SK_ColorWHITE : SK_ColorBLACK); |
- SetTextColor(views::Button::STATE_PRESSED, |
- selected_ ? SK_ColorWHITE : SK_ColorBLACK); |
- if (window_) { |
- if (selected_) |
- window_->Show(); |
- else |
- window_->Hide(); |
- } |
- } |
- |
- aura::Window* window_ = nullptr; |
- std::unique_ptr<navigation::View> view_; |
- bool selected_ = false; |
- |
- DISALLOW_COPY_AND_ASSIGN(Tab); |
-}; |
- |
-class TabStrip : public views::View, |
- public views::ButtonListener { |
- public: |
- class Delegate { |
- public: |
- virtual void NewTab() = 0; |
- }; |
- |
- explicit TabStrip(Delegate* delegate) |
- : delegate_(delegate), |
- tab_container_(new views::View), |
- new_tab_button_( |
- new views::LabelButton(this, base::ASCIIToUTF16("+"))) { |
- views::BoxLayout* layout = |
- new views::BoxLayout(views::BoxLayout::kHorizontal, 5, 0, 0); |
- layout->set_main_axis_alignment( |
- views::BoxLayout::MAIN_AXIS_ALIGNMENT_START); |
- layout->set_cross_axis_alignment( |
- views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH); |
- layout->SetDefaultFlex(0); |
- SetLayoutManager(layout); |
- |
- views::BoxLayout* tab_container_layout = |
- new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); |
- tab_container_layout->set_main_axis_alignment( |
- views::BoxLayout::MAIN_AXIS_ALIGNMENT_START); |
- tab_container_layout->set_cross_axis_alignment( |
- views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH); |
- tab_container_layout->SetDefaultFlex(0); |
- tab_container_->SetLayoutManager(tab_container_layout); |
- AddChildView(tab_container_); |
- layout->SetFlexForView(tab_container_, 1); |
- AddChildView(new_tab_button_); |
- } |
- ~TabStrip() override { |
- for (auto* tab : tabs_) |
- RemoveObserver(tab); |
- } |
- |
- void SetContainerWindow(aura::Window* container) { |
- DCHECK(!container_); |
- container_ = container; |
- for (auto* tab : tabs_) { |
- aura::Window* window = new aura::Window(nullptr); |
- window->Init(ui::LAYER_NOT_DRAWN); |
- container_->AddChild(window); |
- tab->SetWindow(window); |
- } |
- } |
- |
- void AddTab(std::unique_ptr<navigation::View> view) { |
- selected_index_ = static_cast<int>(tabs_.size()); |
- Tab* tab = new Tab(std::move(view), this); |
- // We won't have a WindowTree until we're added to a view hierarchy. |
- if (container_) { |
- aura::Window* window = new aura::Window(nullptr); |
- window->Init(ui::LAYER_NOT_DRAWN); |
- container_->AddChild(window); |
- tab->SetWindow(window); |
- } |
- AddObserver(tab); |
- tabs_.push_back(tab); |
- tab_container_->AddChildView(tab); |
- for (auto& observer : observers_) |
- observer.OnTabAdded(tab); |
- SelectTab(tab); |
- } |
- |
- void CloseTabForView(navigation::View* view) { |
- for (auto it = tabs_.begin(); it != tabs_.end(); ++it) { |
- Tab* tab = *it; |
- if (tab->view() == view) { |
- CloseTab(tab); |
- break; |
- } |
- } |
- } |
- |
- void CloseTab(Tab* tab) { |
- auto it = std::find(tabs_.begin(), tabs_.end(), tab); |
- int tab_index = static_cast<int>(it - tabs_.begin()); |
- if (tab_index < selected_index_) |
- --selected_index_; |
- DCHECK(it != tabs_.end()); |
- tabs_.erase(it); |
- RemoveObserver(tab); |
- tab_container_->RemoveChildView(tab); |
- if (tab->selected()) { |
- int next_selected_index = selected_index_; |
- if (selected_index_ == static_cast<int>(tabs_.size())) |
- --next_selected_index; |
- if (next_selected_index >= 0) |
- SelectTab(tabs_[next_selected_index]); |
- } |
- Layout(); |
- for (auto& observer : observers_) |
- observer.OnTabRemoved(tab); |
- delete tab; |
- } |
- |
- bool empty() const { return tabs_.empty(); } |
- |
- void SelectTab(Tab* tab) { |
- auto it = std::find(tabs_.begin(), tabs_.end(), tab); |
- DCHECK(it != tabs_.end()); |
- selected_index_ = it - tabs_.begin(); |
- for (auto& observer : observers_) |
- observer.OnTabSelected(tab); |
- } |
- Tab* selected_tab() { |
- return selected_index_ != -1 ? tabs_[selected_index_] : nullptr; |
- } |
- |
- void AddObserver(TabStripObserver* observer) { |
- observers_.AddObserver(observer); |
- } |
- void RemoveObserver(TabStripObserver* observer) { |
- observers_.RemoveObserver(observer); |
- } |
- |
- private: |
- // views::View: |
- void OnPaint(gfx::Canvas* canvas) override { |
- gfx::Rect lb = GetLocalBounds(); |
- lb.set_y(lb.bottom() - 1); |
- lb.set_height(1); |
- canvas->FillRect(lb, SK_ColorGRAY); |
- } |
- |
- // views::ButtonListener: |
- void ButtonPressed(views::Button* sender, const ui::Event& event) override { |
- auto it = std::find(tabs_.begin(), tabs_.end(), sender); |
- if (it != tabs_.end()) { |
- if (event.IsControlDown()) |
- CloseTab(*it); |
- else |
- SelectTab(*it); |
- } |
- else if (sender == new_tab_button_ && delegate_) |
- delegate_->NewTab(); |
- } |
- |
- Delegate* delegate_; |
- views::View* tab_container_; |
- views::LabelButton* new_tab_button_; |
- std::vector<Tab*> tabs_; |
- int selected_index_ = -1; |
- base::ObserverList<TabStripObserver> observers_; |
- aura::Window* container_ = nullptr; |
- |
- DISALLOW_COPY_AND_ASSIGN(TabStrip); |
-}; |
- |
-class NavMenuModel : public ui::MenuModel { |
- public: |
- class Delegate { |
- public: |
- virtual void NavigateToOffset(int offset) = 0; |
- }; |
- |
- NavMenuModel(const std::vector<navigation::NavigationListItem>& entries, |
- Delegate* delegate) |
- : navigation_delegate_(delegate), entries_(entries) {} |
- ~NavMenuModel() override {} |
- |
- private: |
- bool HasIcons() const override { return false; } |
- int GetItemCount() const override { |
- return static_cast<int>(entries_.size()); |
- } |
- ui::MenuModel::ItemType GetTypeAt(int index) const override { |
- return ui::MenuModel::TYPE_COMMAND; |
- } |
- ui::MenuSeparatorType GetSeparatorTypeAt(int index) const override { |
- return ui::NORMAL_SEPARATOR; |
- } |
- int GetCommandIdAt(int index) const override { |
- return index; |
- } |
- base::string16 GetLabelAt(int index) const override { |
- return entries_[index].title; |
- } |
- base::string16 GetSublabelAt(int index) const override { |
- return base::string16(); |
- } |
- base::string16 GetMinorTextAt(int index) const override { |
- return base::string16(); |
- } |
- bool IsItemDynamicAt(int index) const override { return false; } |
- bool GetAcceleratorAt(int index, |
- ui::Accelerator* accelerator) const override { |
- return false; |
- } |
- bool IsItemCheckedAt(int index) const override { return false; } |
- int GetGroupIdAt(int index) const override { return -1; } |
- bool GetIconAt(int index, gfx::Image* icon) override { return false; } |
- ui::ButtonMenuItemModel* GetButtonMenuItemAt(int index) const override { |
- return nullptr; |
- } |
- bool IsEnabledAt(int index) const override { return true; } |
- bool IsVisibleAt(int index) const override { return true; } |
- ui::MenuModel* GetSubmenuModelAt(int index) const override { return nullptr; } |
- void HighlightChangedTo(int index) override {} |
- void ActivatedAt(int index) override { |
- ActivatedAt(index, 0); |
- } |
- void ActivatedAt(int index, int event_flags) override { |
- navigation_delegate_->NavigateToOffset(entries_[index].offset); |
- } |
- void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) override { |
- delegate_ = delegate; |
- } |
- ui::MenuModelDelegate* GetMenuModelDelegate() const override { |
- return delegate_; |
- } |
- |
- ui::MenuModelDelegate* delegate_ = nullptr; |
- Delegate* navigation_delegate_; |
- std::vector<navigation::NavigationListItem> entries_; |
- |
- DISALLOW_COPY_AND_ASSIGN(NavMenuModel); |
-}; |
- |
-class NavButton : public views::LabelButton { |
- public: |
- enum class Type { |
- BACK, |
- FORWARD |
- }; |
- |
- class ModelProvider { |
- public: |
- virtual std::unique_ptr<ui::MenuModel> CreateMenuModel(Type type) = 0; |
- }; |
- |
- NavButton(Type type, |
- ModelProvider* model_provider, |
- views::ButtonListener* listener, |
- const base::string16& label) |
- : views::LabelButton(listener, label), |
- type_(type), |
- model_provider_(model_provider), |
- show_menu_factory_(this) {} |
- ~NavButton() override {} |
- |
- private: |
- // views::LabelButton overrides: |
- bool OnMousePressed(const ui::MouseEvent& event) override { |
- if (IsTriggerableEvent(event) && enabled() && |
- HitTestPoint(event.location())) { |
- y_pos_on_lbuttondown_ = event.y(); |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&NavButton::ShowMenu, show_menu_factory_.GetWeakPtr(), |
- ui::GetMenuSourceTypeForEvent(event)), |
- base::TimeDelta::FromMilliseconds(500)); |
- } |
- return LabelButton::OnMousePressed(event); |
- } |
- bool OnMouseDragged(const ui::MouseEvent& event) override { |
- bool result = LabelButton::OnMouseDragged(event); |
- if (show_menu_factory_.HasWeakPtrs()) { |
- if (event.y() > y_pos_on_lbuttondown_ + GetHorizontalDragThreshold()) { |
- show_menu_factory_.InvalidateWeakPtrs(); |
- ShowMenu(ui::GetMenuSourceTypeForEvent(event)); |
- } |
- } |
- return result; |
- } |
- void OnMouseReleased(const ui::MouseEvent& event) override { |
- if (IsTriggerableEvent(event)) |
- show_menu_factory_.InvalidateWeakPtrs(); |
- LabelButton::OnMouseReleased(event); |
- } |
- |
- void ShowMenu(ui::MenuSourceType source_type) { |
- gfx::Rect local = GetLocalBounds(); |
- gfx::Point menu_position(local.origin()); |
- menu_position.Offset(0, local.height() - 1); |
- View::ConvertPointToScreen(this, &menu_position); |
- |
- model_ = model_provider_->CreateMenuModel(type_); |
- menu_model_adapter_.reset(new views::MenuModelAdapter( |
- model_.get(), |
- base::Bind(&NavButton::OnMenuClosed, base::Unretained(this)))); |
- menu_model_adapter_->set_triggerable_event_flags(triggerable_event_flags()); |
- menu_runner_.reset(new views::MenuRunner(menu_model_adapter_->CreateMenu(), |
- views::MenuRunner::HAS_MNEMONICS)); |
- menu_runner_->RunMenuAt(GetWidget(), nullptr, |
- gfx::Rect(menu_position, gfx::Size(0, 0)), |
- views::MENU_ANCHOR_TOPLEFT, source_type); |
- } |
- |
- void OnMenuClosed() { |
- SetMouseHandler(nullptr); |
- model_.reset(); |
- menu_runner_.reset(); |
- menu_model_adapter_.reset(); |
- } |
- |
- Type type_; |
- ModelProvider* model_provider_; |
- int y_pos_on_lbuttondown_ = 0; |
- std::unique_ptr<ui::MenuModel> model_; |
- std::unique_ptr<views::MenuModelAdapter> menu_model_adapter_; |
- std::unique_ptr<views::MenuRunner> menu_runner_; |
- base::WeakPtrFactory<NavButton> show_menu_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(NavButton); |
-}; |
- |
-class ProgressBar : public views::View { |
- public: |
- ProgressBar() {} |
- ~ProgressBar() override {} |
- |
- void SetProgress(double progress) { |
- progress_ = progress; |
- SchedulePaint(); |
- } |
- |
- private: |
- void OnPaint(gfx::Canvas* canvas) override { |
- gfx::Rect stroke_rect = GetLocalBounds(); |
- stroke_rect.set_y(stroke_rect.bottom() - 1); |
- stroke_rect.set_height(1); |
- canvas->FillRect(stroke_rect, SK_ColorGRAY); |
- if (progress_ != 0.f) { |
- gfx::Rect progress_rect = GetLocalBounds(); |
- progress_rect.set_width(progress_rect.width() * progress_); |
- canvas->FillRect(progress_rect, SK_ColorRED); |
- } |
- } |
- |
- double progress_ = 0.f; |
- |
- DISALLOW_COPY_AND_ASSIGN(ProgressBar); |
-}; |
- |
-class Throbber : public views::View { |
- public: |
- Throbber() : timer_(false, true), weak_factory_(this) {} |
- ~Throbber() override {} |
- |
- void Start() { |
- throbbing_ = true; |
- start_time_ = base::TimeTicks::Now(); |
- SchedulePaint(); |
- timer_.Start( |
- FROM_HERE, base::TimeDelta::FromMilliseconds(30), |
- base::Bind(&Throbber::SchedulePaint, weak_factory_.GetWeakPtr())); |
- } |
- |
- void Stop() { |
- throbbing_ = false; |
- if (timer_.IsRunning()) |
- timer_.Stop(); |
- SchedulePaint(); |
- } |
- |
- private: |
- void OnPaint(gfx::Canvas* canvas) override { |
- if (!throbbing_) |
- return; |
- |
- gfx::PaintThrobberSpinning( |
- canvas, GetLocalBounds(), |
- GetNativeTheme()->GetSystemColor( |
- ui::NativeTheme::kColorId_ThrobberSpinningColor), |
- base::TimeTicks::Now() - start_time_); |
- } |
- |
- bool throbbing_ = false; |
- base::TimeTicks start_time_; |
- base::Timer timer_; |
- base::WeakPtrFactory<Throbber> weak_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(Throbber); |
-}; |
- |
-class UI : public views::WidgetDelegateView, |
- public views::ButtonListener, |
- public views::TextfieldController, |
- public TabStrip::Delegate, |
- public TabStripObserver, |
- public navigation::ViewDelegate, |
- public navigation::ViewObserver, |
- public NavButton::ModelProvider, |
- public NavMenuModel::Delegate { |
- public: |
- enum class Type { WINDOW, POPUP }; |
- |
- UI(Browser* browser, Type type, std::unique_ptr<navigation::View> view) |
- : browser_(browser), |
- type_(type), |
- tab_strip_(new TabStrip(this)), |
- back_button_(new NavButton(NavButton::Type::BACK, this, this, |
- base::ASCIIToUTF16("Back"))), |
- forward_button_(new NavButton(NavButton::Type::FORWARD, this, this, |
- base::ASCIIToUTF16("Forward"))), |
- reload_button_( |
- new views::LabelButton(this, base::ASCIIToUTF16("Reload"))), |
- prompt_(new views::Textfield), |
- debug_button_(new views::LabelButton(this, base::ASCIIToUTF16("DV"))), |
- throbber_(new Throbber), |
- progress_bar_(new ProgressBar), |
- debug_view_(new DebugView) { |
- set_background(views::Background::CreateStandardPanelBackground()); |
- prompt_->set_controller(this); |
- back_button_->set_request_focus_on_press(false); |
- forward_button_->set_request_focus_on_press(false); |
- reload_button_->set_request_focus_on_press(false); |
- AddChildView(tab_strip_); |
- AddChildView(back_button_); |
- AddChildView(forward_button_); |
- AddChildView(reload_button_); |
- AddChildView(prompt_); |
- AddChildView(debug_button_); |
- AddChildView(throbber_); |
- AddChildView(progress_bar_); |
- AddChildView(debug_view_); |
- |
- tab_strip_->AddObserver(this); |
- tab_strip_->AddTab(std::move(view)); |
- } |
- ~UI() override { |
- browser_->RemoveWindow(GetWidget()); |
- } |
- |
- void NavigateTo(const GURL& url) { |
- selected_view()->NavigateToURL(url); |
- } |
- |
- private: |
- // Overridden from views::WidgetDelegate: |
- base::string16 GetWindowTitle() const override { |
- // TODO(beng): use resources. |
- if (selected_view()->title().empty()) |
- return base::ASCIIToUTF16("Browser"); |
- base::string16 format = base::ASCIIToUTF16("%s - Browser"); |
- base::ReplaceFirstSubstringAfterOffset(&format, 0, base::ASCIIToUTF16("%s"), |
- selected_view()->title()); |
- return format; |
- } |
- bool CanResize() const override { return true; } |
- bool CanMaximize() const override { return true; } |
- bool CanMinimize() const override { return true; } |
- |
- // views::ButtonListener: |
- void ButtonPressed(views::Button* sender, const ui::Event& event) override { |
- if (sender == back_button_) { |
- selected_view()->GoBack(); |
- } else if (sender == forward_button_) { |
- selected_view()->GoForward(); |
- } else if (sender == reload_button_) { |
- if (selected_view()->is_loading()) |
- selected_view()->Stop(); |
- else |
- selected_view()->Reload(false); |
- } else if (sender == debug_button_) { |
- ToggleDebugView(); |
- } |
- } |
- |
- // Overridden from views::View: |
- void Layout() override { |
- gfx::Rect local_bounds = GetLocalBounds(); |
- |
- gfx::Size ps = tab_strip_->GetPreferredSize(); |
- tab_strip_->SetBoundsRect( |
- gfx::Rect(0, 5, local_bounds.width(), ps.height())); |
- |
- gfx::Rect bounds = local_bounds; |
- bounds.set_y(tab_strip_->bounds().bottom()); |
- bounds.Inset(5, 5); |
- |
- ps = back_button_->GetPreferredSize(); |
- back_button_->SetBoundsRect( |
- gfx::Rect(bounds.x(), bounds.y(), ps.width(), ps.height())); |
- ps = forward_button_->GetPreferredSize(); |
- forward_button_->SetBoundsRect(gfx::Rect(back_button_->bounds().right() + 5, |
- bounds.y(), ps.width(), |
- ps.height())); |
- ps = reload_button_->GetPreferredSize(); |
- reload_button_->SetBoundsRect( |
- gfx::Rect(forward_button_->bounds().right() + 5, bounds.y(), ps.width(), |
- ps.height())); |
- |
- ps = prompt_->GetPreferredSize(); |
- int throbber_size = ps.height(); |
- gfx::Size debug_ps = debug_button_->GetPreferredSize(); |
- int prompt_y = |
- bounds.y() + (reload_button_->bounds().height() - ps.height()) / 2; |
- int width = |
- bounds.width() - reload_button_->bounds().right() - throbber_size - 15 - |
- debug_ps.width(); |
- prompt_->SetBoundsRect(gfx::Rect(reload_button_->bounds().right() + 5, |
- prompt_y, width, ps.height())); |
- |
- debug_button_->SetBoundsRect( |
- gfx::Rect(prompt_->bounds().right() + 5, |
- prompt_->bounds().y(), debug_ps.width(), debug_ps.height())); |
- |
- throbber_->SetBoundsRect(gfx::Rect(debug_button_->bounds().right() + 5, |
- prompt_->bounds().y(), throbber_size, |
- throbber_size)); |
- |
- gfx::Rect progress_bar_rect(local_bounds.x(), |
- back_button_->bounds().bottom() + 5, |
- local_bounds.width(), 2); |
- progress_bar_->SetBoundsRect(progress_bar_rect); |
- |
- int debug_view_height = 0; |
- if (showing_debug_view_) |
- debug_view_height = debug_view_->GetPreferredSize().height(); |
- debug_view_->SetBoundsRect( |
- gfx::Rect(local_bounds.x(), local_bounds.height() - debug_view_height, |
- local_bounds.width(), debug_view_height)); |
- |
- if (content_area_) { |
- int x = local_bounds.x(); |
- int y = type_ == Type::POPUP ? 0 : progress_bar_->bounds().bottom(); |
- gfx::Point offset(x, y); |
- ConvertPointToWidget(this, &offset); |
- int width = local_bounds.width(); |
- int height = local_bounds.height() - y - debug_view_height; |
- content_area_->SetBounds( |
- gfx::Rect(offset.x(), offset.y(), width, height)); |
- for (auto* child : content_area_->children()) |
- child->SetBounds(gfx::Rect(0, 0, width, height)); |
- } |
- } |
- void ViewHierarchyChanged( |
- const views::View::ViewHierarchyChangedDetails& details) override { |
- if (details.is_add && GetWidget() && !content_area_) { |
- aura::Window* window = GetWidget()->GetNativeWindow(); |
- content_area_ = new aura::Window(nullptr); |
- content_area_->Init(ui::LAYER_NOT_DRAWN); |
- content_area_->Show(); |
- window->AddChild(content_area_); |
- tab_strip_->SetContainerWindow(content_area_); |
- } |
- } |
- |
- // Overridden from views::TextFieldController: |
- bool HandleKeyEvent(views::Textfield* sender, |
- const ui::KeyEvent& key_event) override { |
- if (key_event.type() == ui::ET_KEY_PRESSED && |
- key_event.key_code() == ui::VKEY_RETURN) |
- selected_view()->NavigateToURL(GURL(prompt_->text())); |
- return false; |
- } |
- |
- // TabStrip::Delegate: |
- void NewTab() override { |
- tab_strip_->AddTab(browser_->CreateView()); |
- tab_strip_->selected_tab()->view()->NavigateToURL(GURL("about:blank")); |
- } |
- |
- // TabStripObserver: |
- void OnTabAdded(Tab* added) override { |
- added->view()->AddObserver(this); |
- added->view()->set_delegate(this); |
- } |
- void OnTabSelected(Tab* selected) override { |
- debug_view_->set_view(selected->view()); |
- prompt_->SetText(base::UTF8ToUTF16(selected->view()->url().spec())); |
- if (GetWidget()) |
- GetWidget()->UpdateWindowTitle(); |
- } |
- |
- // navigation::ViewDelegate: |
- void ViewCreated(navigation::View* source, |
- std::unique_ptr<navigation::View> view, |
- bool is_popup, |
- const gfx::Rect& initial_rect, |
- bool user_gesture) override { |
- if (is_popup) |
- CreateNewWindow(std::move(view), initial_rect, is_popup); |
- else |
- tab_strip_->AddTab(std::move(view)); |
- } |
- void Close(navigation::View* source) override { |
- tab_strip_->CloseTabForView(source); |
- if (tab_strip_->empty()) |
- GetWidget()->Close(); |
- } |
- void OpenURL(navigation::View* source, |
- navigation::mojom::OpenURLParamsPtr params) override { |
- switch (params->disposition) { |
- case navigation::mojom::WindowOpenDisposition::CURRENT_TAB: |
- selected_view()->NavigateToURL(params->url); |
- break; |
- case navigation::mojom::WindowOpenDisposition::NEW_FOREGROUND_TAB: |
- tab_strip_->AddTab(browser_->CreateView()); |
- tab_strip_->selected_tab()->view()->NavigateToURL(params->url); |
- break; |
- case navigation::mojom::WindowOpenDisposition::NEW_POPUP: |
- case navigation::mojom::WindowOpenDisposition::NEW_WINDOW: { |
- std::unique_ptr<navigation::View> view = browser_->CreateView(); |
- view->NavigateToURL(params->url); |
- CreateNewWindow( |
- std::move(view), gfx::Rect(), |
- params->disposition == |
- navigation::mojom::WindowOpenDisposition::NEW_POPUP); |
- break; |
- } |
- default: |
- break; |
- } |
- } |
- |
- // navigation::ViewObserver: |
- void LoadingStateChanged(navigation::View* view) override { |
- if (view->is_loading()) { |
- reload_button_->SetText(base::ASCIIToUTF16("Stop")); |
- throbber_->Start(); |
- } else { |
- reload_button_->SetText(base::ASCIIToUTF16("Reload")); |
- throbber_->Stop(); |
- progress_bar_->SetProgress(0.f); |
- } |
- } |
- void LoadProgressChanged(navigation::View* view, double progress) override { |
- progress_bar_->SetProgress(progress); |
- } |
- void NavigationStateChanged(navigation::View* view) override { |
- EnableButton(back_button_, view->can_go_back()); |
- EnableButton(forward_button_, view->can_go_forward()); |
- prompt_->SetText(base::UTF8ToUTF16(view->url().spec())); |
- GetWidget()->UpdateWindowTitle(); |
- } |
- void HoverTargetURLChanged(navigation::View* view, const GURL& url) override { |
- if (url.is_valid()) |
- prompt_->SetText(base::UTF8ToUTF16(url.spec())); |
- else |
- prompt_->SetText(base::UTF8ToUTF16(selected_view()->url().spec())); |
- } |
- |
- // NavButton::ModelProvider: |
- std::unique_ptr<ui::MenuModel> CreateMenuModel( |
- NavButton::Type type) override { |
- std::vector<navigation::NavigationListItem> entries; |
- if (type == NavButton::Type::BACK) { |
- selected_view()->GetBackMenuItems(&entries); |
- } else { |
- selected_view()->GetForwardMenuItems(&entries); |
- } |
- return base::MakeUnique<NavMenuModel>(entries, this); |
- } |
- |
- // NavMenuModel::Delegate: |
- void NavigateToOffset(int offset) override { |
- selected_view()->NavigateToOffset(offset); |
- } |
- |
- navigation::View* selected_view() { |
- return const_cast<navigation::View*>( |
- static_cast<const UI*>(this)->selected_view()); |
- } |
- const navigation::View* selected_view() const { |
- return tab_strip_->selected_tab()->view(); |
- } |
- |
- void CreateNewWindow(std::unique_ptr<navigation::View> view, |
- const gfx::Rect& initial_bounds, |
- bool is_popup) { |
- gfx::Rect bounds = initial_bounds; |
- if (bounds.IsEmpty()) |
- bounds = gfx::Rect(10, 10, 400, 300); |
- views::Widget* window = views::Widget::CreateWindowWithContextAndBounds( |
- new UI(browser_, is_popup ? UI::Type::POPUP : UI::Type::WINDOW, |
- std::move(view)), |
- nullptr, bounds); |
- window->Show(); |
- browser_->AddWindow(window); |
- } |
- |
- void ToggleDebugView() { |
- showing_debug_view_ = !showing_debug_view_; |
- Layout(); |
- } |
- |
- Browser* browser_; |
- |
- Type type_; |
- |
- TabStrip* tab_strip_; |
- views::LabelButton* back_button_; |
- views::LabelButton* forward_button_; |
- views::LabelButton* reload_button_; |
- views::Textfield* prompt_; |
- views::LabelButton* debug_button_; |
- Throbber* throbber_; |
- ProgressBar* progress_bar_; |
- |
- aura::Window* content_area_ = nullptr; |
- |
- DebugView* debug_view_; |
- bool showing_debug_view_ = false; |
- |
- DISALLOW_COPY_AND_ASSIGN(UI); |
-}; |
- |
-Browser::Browser() { |
- registry_.AddInterface<mojom::Launchable>( |
- base::Bind(&Browser::Create, base::Unretained(this))); |
-} |
-Browser::~Browser() {} |
- |
-void Browser::AddWindow(views::Widget* window) { |
- windows_.push_back(window); |
-} |
- |
-void Browser::RemoveWindow(views::Widget* window) { |
- auto it = std::find(windows_.begin(), windows_.end(), window); |
- DCHECK(it != windows_.end()); |
- windows_.erase(it); |
- if (windows_.empty()) |
- base::MessageLoop::current()->QuitWhenIdle(); |
-} |
- |
-std::unique_ptr<navigation::View> Browser::CreateView() { |
- navigation::mojom::ViewFactoryPtr factory; |
- context()->connector()->BindInterface(content::mojom::kBrowserServiceName, |
- &factory); |
- return base::MakeUnique<navigation::View>(std::move(factory)); |
-} |
- |
-void Browser::OnStart() { |
- aura_init_ = base::MakeUnique<views::AuraInit>( |
- context()->connector(), context()->identity(), "views_mus_resources.pak", |
- std::string(), nullptr, views::AuraInit::Mode::AURA_MUS); |
-} |
- |
-void Browser::OnBindInterface( |
- const service_manager::BindSourceInfo& source_info, |
- const std::string& interface_name, |
- mojo::ScopedMessagePipeHandle interface_pipe) { |
- registry_.BindInterface(source_info, interface_name, |
- std::move(interface_pipe)); |
-} |
- |
-void Browser::Launch(uint32_t what, mojom::LaunchMode how) { |
- bool reuse = |
- how == mojom::LaunchMode::REUSE || how == mojom::LaunchMode::DEFAULT; |
- if (reuse && !windows_.empty()) { |
- windows_.back()->Activate(); |
- return; |
- } |
- |
- UI* ui = new UI(this, UI::Type::WINDOW, CreateView()); |
- views::Widget* window = views::Widget::CreateWindowWithContextAndBounds( |
- ui, nullptr, gfx::Rect(10, 10, 1024, 600)); |
- ui->NavigateTo(GURL("http://www.google.com/")); |
- window->Show(); |
- AddWindow(window); |
-} |
- |
-void Browser::Create(const service_manager::BindSourceInfo& source_info, |
- mojom::LaunchableRequest request) { |
- bindings_.AddBinding(this, std::move(request)); |
-} |
- |
-} // namespace browser |
-} // namespace mash |