Index: mash/browser/browser.cc |
diff --git a/mash/browser/browser.cc b/mash/browser/browser.cc |
deleted file mode 100644 |
index 01c4ad33d01a286892000952fd835a2da34a79cd..0000000000000000000000000000000000000000 |
--- a/mash/browser/browser.cc |
+++ /dev/null |
@@ -1,376 +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/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/timer/timer.h" |
-#include "components/mus/public/cpp/window.h" |
-#include "components/mus/public/cpp/window_tree_connection.h" |
-#include "mash/public/interfaces/launchable.mojom.h" |
-#include "mojo/converters/geometry/geometry_type_converters.h" |
-#include "mojo/public/c/system/main.h" |
-#include "services/navigation/public/interfaces/view.mojom.h" |
-#include "services/shell/public/cpp/application_runner.h" |
-#include "services/shell/public/cpp/connector.h" |
-#include "services/shell/public/cpp/shell_client.h" |
-#include "services/tracing/public/cpp/tracing_impl.h" |
-#include "ui/aura/mus/mus_util.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/textfield/textfield.h" |
-#include "ui/views/controls/textfield/textfield_controller.h" |
-#include "ui/views/mus/aura_init.h" |
-#include "ui/views/mus/window_manager_connection.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 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 navigation::mojom::ViewClient { |
- public: |
- enum class Type { WINDOW, POPUP }; |
- |
- UI(Browser* browser, |
- Type type, |
- navigation::mojom::ViewPtr view, |
- navigation::mojom::ViewClientRequest request) |
- : browser_(browser), |
- type_(type), |
- back_button_(new views::LabelButton(this, base::ASCIIToUTF16("Back"))), |
- forward_button_( |
- new views::LabelButton(this, base::ASCIIToUTF16("Forward"))), |
- reload_button_( |
- new views::LabelButton(this, base::ASCIIToUTF16("Reload"))), |
- prompt_(new views::Textfield), |
- throbber_(new Throbber), |
- progress_bar_(new ProgressBar), |
- view_(std::move(view)), |
- view_client_binding_(this, std::move(request)) { |
- 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(back_button_); |
- AddChildView(forward_button_); |
- AddChildView(reload_button_); |
- AddChildView(prompt_); |
- AddChildView(throbber_); |
- AddChildView(progress_bar_); |
- } |
- ~UI() override { browser_->RemoveWindow(GetWidget()); } |
- |
- void NavigateTo(const GURL& url) { view_->NavigateTo(url); } |
- |
- private: |
- // Overridden from views::WidgetDelegate: |
- views::View* GetContentsView() override { return this; } |
- base::string16 GetWindowTitle() const override { |
- // TODO(beng): use resources. |
- if (current_title_.empty()) |
- return base::ASCIIToUTF16("Browser"); |
- base::string16 format = base::ASCIIToUTF16("%s - Browser"); |
- base::ReplaceFirstSubstringAfterOffset(&format, 0, base::ASCIIToUTF16("%s"), |
- current_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_) { |
- view_->GoBack(); |
- } else if (sender == forward_button_) { |
- view_->GoForward(); |
- } else if (sender == reload_button_) { |
- if (is_loading_) |
- view_->Stop(); |
- else |
- view_->Reload(false); |
- } |
- } |
- |
- // Overridden from views::View: |
- void Layout() override { |
- gfx::Rect local_bounds = GetLocalBounds(); |
- gfx::Rect bounds = local_bounds; |
- bounds.Inset(5, 5); |
- |
- gfx::Size 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 prompt_y = |
- bounds.y() + (reload_button_->bounds().height() - ps.height()) / 2; |
- int width = |
- bounds.width() - reload_button_->bounds().right() - ps.height() - 10; |
- prompt_->SetBoundsRect(gfx::Rect(reload_button_->bounds().right() + 5, |
- prompt_y, width, ps.height())); |
- throbber_->SetBoundsRect(gfx::Rect(prompt_->bounds().right() + 5, |
- prompt_->bounds().y(), ps.height(), |
- ps.height())); |
- |
- gfx::Rect progress_bar_rect(local_bounds.x(), |
- back_button_->bounds().bottom() + 5, |
- local_bounds.width(), 2); |
- progress_bar_->SetBoundsRect(progress_bar_rect); |
- |
- 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; |
- content_area_->SetBounds( |
- gfx::Rect(offset.x(), offset.y(), width, height)); |
- } |
- } |
- void ViewHierarchyChanged( |
- const views::View::ViewHierarchyChangedDetails& details) override { |
- if (details.is_add && GetWidget() && !content_area_) { |
- mus::Window* window = aura::GetMusWindow(GetWidget()->GetNativeWindow()); |
- content_area_ = window->connection()->NewWindow(nullptr); |
- window->AddChild(content_area_); |
- |
- mus::mojom::WindowTreeClientPtr client; |
- view_->GetWindowTreeClient(GetProxy(&client)); |
- content_area_->Embed(std::move(client)); |
- } |
- } |
- |
- // Overridden from views::TextFieldController: |
- bool HandleKeyEvent(views::Textfield* sender, |
- const ui::KeyEvent& key_event) override { |
- switch (key_event.key_code()) { |
- case ui::VKEY_RETURN: { |
- view_->NavigateTo(GURL(prompt_->text())); |
- } break; |
- default: |
- break; |
- } |
- return false; |
- } |
- |
- // navigation::mojom::ViewClient: |
- void LoadingStateChanged(bool is_loading) override { |
- is_loading_ = is_loading; |
- if (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 NavigationStateChanged(const GURL& url, |
- const mojo::String& title, |
- bool can_go_back, |
- bool can_go_forward) override { |
- EnableButton(back_button_, can_go_back); |
- EnableButton(forward_button_, can_go_forward); |
- prompt_->SetText(base::UTF8ToUTF16(url.spec())); |
- current_title_ = base::UTF8ToUTF16(title.get()); |
- GetWidget()->UpdateWindowTitle(); |
- } |
- void LoadProgressChanged(double progress) override { |
- progress_bar_->SetProgress(progress); |
- } |
- void ViewCreated(navigation::mojom::ViewPtr view, |
- navigation::mojom::ViewClientRequest request, |
- bool is_popup, |
- mojo::RectPtr initial_rect, |
- bool user_gesture) override { |
- views::Widget* window = views::Widget::CreateWindowWithContextAndBounds( |
- new UI(browser_, is_popup ? UI::Type::POPUP : UI::Type::WINDOW, |
- std::move(view), std::move(request)), |
- nullptr, initial_rect.To<gfx::Rect>()); |
- window->Show(); |
- browser_->AddWindow(window); |
- } |
- void Close() override { GetWidget()->Close(); } |
- |
- Browser* browser_; |
- |
- Type type_; |
- |
- views::LabelButton* back_button_; |
- views::LabelButton* forward_button_; |
- views::LabelButton* reload_button_; |
- views::Textfield* prompt_; |
- Throbber* throbber_; |
- ProgressBar* progress_bar_; |
- |
- mus::Window* content_area_ = nullptr; |
- |
- navigation::mojom::ViewPtr view_; |
- mojo::Binding<navigation::mojom::ViewClient> view_client_binding_; |
- |
- bool is_loading_ = false; |
- base::string16 current_title_; |
- |
- DISALLOW_COPY_AND_ASSIGN(UI); |
-}; |
- |
-Browser::Browser() {} |
-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(); |
-} |
- |
-void Browser::Initialize(shell::Connector* connector, |
- const shell::Identity& identity, |
- uint32_t id) { |
- connector_ = connector; |
- tracing_.Initialize(connector, identity.name()); |
- |
- aura_init_.reset(new views::AuraInit(connector, "views_mus_resources.pak")); |
- views::WindowManagerConnection::Create(connector, identity); |
-} |
- |
-bool Browser::AcceptConnection(shell::Connection* connection) { |
- connection->AddInterface<mojom::Launchable>(this); |
- return true; |
-} |
- |
-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; |
- } |
- |
- navigation::mojom::ViewFactoryPtr view_factory; |
- connector_->ConnectToInterface("exe:navigation", &view_factory); |
- navigation::mojom::ViewPtr view; |
- navigation::mojom::ViewClientPtr view_client; |
- navigation::mojom::ViewClientRequest view_client_request = |
- GetProxy(&view_client); |
- view_factory->CreateView(std::move(view_client), GetProxy(&view)); |
- UI* ui = new UI(this, UI::Type::WINDOW, std::move(view), |
- std::move(view_client_request)); |
- 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(shell::Connection* connection, |
- mojom::LaunchableRequest request) { |
- bindings_.AddBinding(this, std::move(request)); |
-} |
- |
-} // namespace browser |
-} // namespace mash |