| Index: mandoline/ui/desktop_ui/browser_window.cc
|
| diff --git a/mandoline/ui/desktop_ui/browser_window.cc b/mandoline/ui/desktop_ui/browser_window.cc
|
| deleted file mode 100644
|
| index 6b4f15e9ab0c09a9af2b248919f13d320e0c16db..0000000000000000000000000000000000000000
|
| --- a/mandoline/ui/desktop_ui/browser_window.cc
|
| +++ /dev/null
|
| @@ -1,492 +0,0 @@
|
| -// Copyright 2015 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 "mandoline/ui/desktop_ui/browser_window.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/command_line.h"
|
| -#include "base/macros.h"
|
| -#include "base/strings/string16.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/time/time.h"
|
| -#include "base/trace_event/trace_event.h"
|
| -#include "components/mus/public/cpp/event_matcher.h"
|
| -#include "components/mus/public/cpp/scoped_window_ptr.h"
|
| -#include "components/mus/public/cpp/window_tree_host_factory.h"
|
| -#include "mandoline/ui/desktop_ui/browser_commands.h"
|
| -#include "mandoline/ui/desktop_ui/browser_manager.h"
|
| -#include "mandoline/ui/desktop_ui/find_bar_view.h"
|
| -#include "mandoline/ui/desktop_ui/public/interfaces/omnibox.mojom.h"
|
| -#include "mandoline/ui/desktop_ui/toolbar_view.h"
|
| -#include "mojo/common/common_type_converters.h"
|
| -#include "mojo/converters/geometry/geometry_type_converters.h"
|
| -#include "mojo/services/tracing/public/cpp/switches.h"
|
| -#include "mojo/services/tracing/public/interfaces/tracing.mojom.h"
|
| -#include "mojo/shell/public/cpp/shell.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/mojo/init/ui_init.h"
|
| -#include "ui/views/background.h"
|
| -#include "ui/views/controls/button/label_button.h"
|
| -#include "ui/views/layout/layout_manager.h"
|
| -#include "ui/views/mus/aura_init.h"
|
| -#include "ui/views/mus/display_converter.h"
|
| -#include "ui/views/mus/native_widget_mus.h"
|
| -#include "ui/views/widget/widget_delegate.h"
|
| -
|
| -namespace mandoline {
|
| -namespace {
|
| -
|
| -void OnAcceleratorAdded(bool success) {
|
| - DCHECK(success);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -class ProgressView : public views::View {
|
| - public:
|
| - ProgressView() : progress_(0.f), loading_(false) {}
|
| - ~ProgressView() override {}
|
| -
|
| - void SetProgress(double progress) {
|
| - progress_ = progress;
|
| - SchedulePaint();
|
| - }
|
| -
|
| - void SetIsLoading(bool loading) {
|
| - if (loading == loading_)
|
| - return;
|
| -
|
| - loading_ = loading;
|
| - progress_ = 0.f;
|
| - SchedulePaint();
|
| - }
|
| -
|
| - private:
|
| - void OnPaint(gfx::Canvas* canvas) override {
|
| - if (loading_) {
|
| - canvas->FillRect(GetLocalBounds(), SK_ColorGREEN);
|
| - gfx::Rect progress_rect = GetLocalBounds();
|
| - progress_rect.set_width(progress_rect.width() * progress_);
|
| - canvas->FillRect(progress_rect, SK_ColorRED);
|
| - } else {
|
| - canvas->FillRect(GetLocalBounds(), SK_ColorGRAY);
|
| - }
|
| - }
|
| -
|
| - double progress_;
|
| - bool loading_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ProgressView);
|
| -};
|
| -
|
| -class BrowserWindow::LayoutManagerImpl : public views::LayoutManager {
|
| - public:
|
| - explicit LayoutManagerImpl(BrowserWindow* window) : window_(window) {}
|
| - ~LayoutManagerImpl() override {}
|
| -
|
| - private:
|
| - // views::LayoutManager:
|
| - gfx::Size GetPreferredSize(const views::View* view) const override {
|
| - return gfx::Size();
|
| - }
|
| - void Layout(views::View* host) override {
|
| - window_->Layout(host);
|
| - }
|
| -
|
| - BrowserWindow* window_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(LayoutManagerImpl);
|
| -};
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, public:
|
| -
|
| -BrowserWindow::BrowserWindow(mojo::Shell* shell,
|
| - mus::mojom::WindowTreeHostFactory* host_factory,
|
| - BrowserManager* manager)
|
| - : shell_(shell),
|
| - window_manager_client_(nullptr),
|
| - manager_(manager),
|
| - toolbar_view_(nullptr),
|
| - progress_bar_(nullptr),
|
| - find_bar_view_(nullptr),
|
| - root_(nullptr),
|
| - content_(nullptr),
|
| - omnibox_view_(nullptr),
|
| - find_active_(0),
|
| - find_count_(0),
|
| - web_view_(this) {
|
| - mus::CreateWindowTreeHost(host_factory, this, &host_, this);
|
| -}
|
| -
|
| -void BrowserWindow::LoadURL(const GURL& url) {
|
| - // Haven't been embedded yet, can't embed.
|
| - // TODO(beng): remove this.
|
| - if (!root_) {
|
| - default_url_ = url;
|
| - return;
|
| - }
|
| -
|
| - if (!url.is_valid()) {
|
| - ShowOmnibox();
|
| - return;
|
| - }
|
| -
|
| - mojo::URLRequestPtr request(mojo::URLRequest::New());
|
| - request->url = url.spec();
|
| - Embed(std::move(request));
|
| -}
|
| -
|
| -void BrowserWindow::Close() {
|
| - if (root_)
|
| - mus::ScopedWindowPtr::DeleteWindowOrWindowManager(root_);
|
| - else
|
| - delete this;
|
| -}
|
| -
|
| -void BrowserWindow::ShowOmnibox() {
|
| - TRACE_EVENT0("desktop_ui", "BrowserWindow::ShowOmnibox");
|
| - if (!omnibox_.get()) {
|
| - omnibox_connection_ = shell_->Connect("mojo:omnibox");
|
| - omnibox_connection_->AddService<ViewEmbedder>(this);
|
| - omnibox_connection_->ConnectToService(&omnibox_);
|
| - omnibox_connection_->SetRemoteServiceProviderConnectionErrorHandler(
|
| - [this]() {
|
| - // This will cause the connection to be re-established the next time
|
| - // we come through this codepath.
|
| - omnibox_.reset();
|
| - });
|
| - }
|
| - omnibox_->ShowForURL(mojo::String::From(current_url_.spec()));
|
| -}
|
| -
|
| -void BrowserWindow::ShowFind() {
|
| - TRACE_EVENT0("desktop_ui", "BrowserWindow::ShowFind");
|
| - toolbar_view_->SetVisible(false);
|
| - find_bar_view_->Show();
|
| -}
|
| -
|
| -void BrowserWindow::GoBack() {
|
| - TRACE_EVENT0("desktop_ui", "BrowserWindow::GoBack");
|
| - web_view_.web_view()->GoBack();
|
| -}
|
| -
|
| -void BrowserWindow::GoForward() {
|
| - TRACE_EVENT0("desktop_ui", "BrowserWindow::GoForward");
|
| - web_view_.web_view()->GoForward();
|
| -}
|
| -
|
| -BrowserWindow::~BrowserWindow() {
|
| - DCHECK(!root_);
|
| - manager_->BrowserWindowClosed(this);
|
| -}
|
| -
|
| -float BrowserWindow::DIPSToPixels(float value) const {
|
| - return value * root_->viewport_metrics().device_pixel_ratio;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, mus::ViewTreeDelegate implementation:
|
| -
|
| -void BrowserWindow::OnEmbed(mus::Window* root) {
|
| - TRACE_EVENT0("desktop_ui", "BrowserWindow::OnEmbed");
|
| - // BrowserWindow does not support being embedded more than once.
|
| - CHECK(!root_);
|
| -
|
| - // Record when the browser window was displayed, used for performance testing.
|
| - const base::TimeTicks display_ticks = base::TimeTicks::Now();
|
| -
|
| - root_ = root;
|
| -
|
| - host_->SetTitle("Mandoline");
|
| -
|
| - content_ = root_->connection()->NewWindow();
|
| - Init(root_);
|
| -
|
| - host_->SetSize(mojo::Size::From(gfx::Size(1280, 800)));
|
| -
|
| - root_->AddChild(content_);
|
| - window_manager_client_->AddActivationParent(root_);
|
| - content_->SetVisible(true);
|
| -
|
| - web_view_.Init(shell_, content_);
|
| -
|
| - const base::Callback<void(bool)> add_accelerator_callback =
|
| - base::Bind(&OnAcceleratorAdded);
|
| - DCHECK(window_manager_client_);
|
| - window_manager_client_->AddAccelerator(
|
| - static_cast<uint32_t>(BrowserCommand::CLOSE),
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::W,
|
| - mus::mojom::kEventFlagControlDown),
|
| - add_accelerator_callback);
|
| - window_manager_client_->AddAccelerator(
|
| - static_cast<uint32_t>(BrowserCommand::FOCUS_OMNIBOX),
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::L,
|
| - mus::mojom::kEventFlagControlDown),
|
| - add_accelerator_callback);
|
| - window_manager_client_->AddAccelerator(
|
| - static_cast<uint32_t>(BrowserCommand::NEW_WINDOW),
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::N,
|
| - mus::mojom::kEventFlagControlDown),
|
| - add_accelerator_callback);
|
| - window_manager_client_->AddAccelerator(
|
| - static_cast<uint32_t>(BrowserCommand::SHOW_FIND),
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::F,
|
| - mus::mojom::kEventFlagControlDown),
|
| - add_accelerator_callback);
|
| - window_manager_client_->AddAccelerator(
|
| - static_cast<uint32_t>(BrowserCommand::GO_BACK),
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::LEFT,
|
| - mus::mojom::kEventFlagAltDown),
|
| - add_accelerator_callback);
|
| - window_manager_client_->AddAccelerator(
|
| - static_cast<uint32_t>(BrowserCommand::GO_FORWARD),
|
| - mus::CreateKeyMatcher(mus::mojom::KeyboardCode::RIGHT,
|
| - mus::mojom::kEventFlagAltDown),
|
| - add_accelerator_callback);
|
| -
|
| - // Now that we're ready, load the default url.
|
| - LoadURL(default_url_);
|
| -
|
| - // Record the time spent opening initial tabs, used for performance testing.
|
| - const base::TimeDelta open_tabs_delta =
|
| - base::TimeTicks::Now() - display_ticks;
|
| -
|
| - // Record the browser startup time metrics, used for performance testing.
|
| - static bool recorded_browser_startup_metrics = false;
|
| - if (!recorded_browser_startup_metrics &&
|
| - base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - tracing::kEnableStatsCollectionBindings)) {
|
| - tracing::StartupPerformanceDataCollectorPtr collector;
|
| - shell_->ConnectToService("mojo:tracing", &collector);
|
| - collector->SetBrowserWindowDisplayTicks(display_ticks.ToInternalValue());
|
| - collector->SetBrowserOpenTabsTimeDelta(open_tabs_delta.ToInternalValue());
|
| - collector->SetBrowserMessageLoopStartTicks(
|
| - manager_->startup_ticks().ToInternalValue());
|
| - recorded_browser_startup_metrics = true;
|
| - }
|
| -}
|
| -
|
| -void BrowserWindow::OnConnectionLost(mus::WindowTreeConnection* connection) {
|
| - root_ = nullptr;
|
| - delete this;
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, mus::WindowManagerDelegate implementation:
|
| -
|
| -void BrowserWindow::SetWindowManagerClient(mus::WindowManagerClient* client) {
|
| - window_manager_client_ = client;
|
| -}
|
| -
|
| -bool BrowserWindow::OnWmSetBounds(mus::Window* window, gfx::Rect* bounds) {
|
| - return true;
|
| -}
|
| -
|
| -bool BrowserWindow::OnWmSetProperty(
|
| - mus::Window* window,
|
| - const std::string& name,
|
| - scoped_ptr<std::vector<uint8_t>>* new_data) {
|
| - return true;
|
| -}
|
| -
|
| -mus::Window* BrowserWindow::OnWmCreateTopLevelWindow(
|
| - std::map<std::string, std::vector<uint8_t>>* properties) {
|
| - NOTREACHED();
|
| - return nullptr;
|
| -}
|
| -
|
| -void BrowserWindow::OnAccelerator(uint32_t id, mus::mojom::EventPtr event) {
|
| - switch (static_cast<BrowserCommand>(id)) {
|
| - case BrowserCommand::CLOSE:
|
| - Close();
|
| - break;
|
| - case BrowserCommand::NEW_WINDOW:
|
| - manager_->CreateBrowser(GURL());
|
| - break;
|
| - case BrowserCommand::FOCUS_OMNIBOX:
|
| - ShowOmnibox();
|
| - break;
|
| - case BrowserCommand::SHOW_FIND:
|
| - ShowFind();
|
| - break;
|
| - case BrowserCommand::GO_BACK:
|
| - GoBack();
|
| - break;
|
| - case BrowserCommand::GO_FORWARD:
|
| - GoForward();
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, web_view::mojom::WebViewClient implementation:
|
| -
|
| -void BrowserWindow::TopLevelNavigateRequest(mojo::URLRequestPtr request) {
|
| - OnHideFindBar();
|
| - Embed(std::move(request));
|
| -}
|
| -
|
| -void BrowserWindow::TopLevelNavigationStarted(const mojo::String& url) {
|
| - GURL gurl(url.get());
|
| - bool changed = current_url_ != gurl;
|
| - current_url_ = gurl;
|
| - if (changed)
|
| - toolbar_view_->SetOmniboxText(base::UTF8ToUTF16(current_url_.spec()));
|
| -}
|
| -
|
| -void BrowserWindow::LoadingStateChanged(bool is_loading, double progress) {
|
| - progress_bar_->SetIsLoading(is_loading);
|
| - progress_bar_->SetProgress(progress);
|
| -}
|
| -
|
| -void BrowserWindow::BackForwardChanged(
|
| - web_view::mojom::ButtonState back_button,
|
| - web_view::mojom::ButtonState forward_button) {
|
| - toolbar_view_->SetBackForwardEnabled(
|
| - back_button == web_view::mojom::ButtonState::ENABLED,
|
| - forward_button == web_view::mojom::ButtonState::ENABLED);
|
| -}
|
| -
|
| -void BrowserWindow::TitleChanged(const mojo::String& title) {
|
| - base::string16 formatted =
|
| - title.is_null() ? base::ASCIIToUTF16("Untitled")
|
| - : title.To<base::string16>() +
|
| - base::ASCIIToUTF16(" - Mandoline");
|
| - host_->SetTitle(mojo::String::From(formatted));
|
| -}
|
| -
|
| -void BrowserWindow::FindInPageMatchCountUpdated(int32_t request_id,
|
| - int32_t count,
|
| - bool final_update) {
|
| - find_count_ = count;
|
| - find_bar_view_->SetMatchLabel(find_active_, find_count_);
|
| -}
|
| -
|
| -void BrowserWindow::FindInPageSelectionUpdated(int32_t request_id,
|
| - int32_t active_match_ordinal) {
|
| - find_active_ = active_match_ordinal;
|
| - find_bar_view_->SetMatchLabel(find_active_, find_count_);
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, ViewEmbedder implementation:
|
| -
|
| -void BrowserWindow::Embed(mojo::URLRequestPtr request) {
|
| - const std::string string_url = request->url.To<std::string>();
|
| - if (string_url == "mojo:omnibox") {
|
| - EmbedOmnibox();
|
| - return;
|
| - }
|
| - web_view_.web_view()->LoadRequest(std::move(request));
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, mojo::InterfaceFactory<ViewEmbedder> implementation:
|
| -
|
| -void BrowserWindow::Create(mojo::Connection* connection,
|
| - mojo::InterfaceRequest<ViewEmbedder> request) {
|
| - view_embedder_bindings_.AddBinding(this, std::move(request));
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, FindBarDelegate implementation:
|
| -
|
| -void BrowserWindow::OnDoFind(const std::string& find, bool forward) {
|
| - web_view_.web_view()->Find(mojo::String::From(find), forward);
|
| -}
|
| -
|
| -void BrowserWindow::OnHideFindBar() {
|
| - toolbar_view_->SetVisible(true);
|
| - find_bar_view_->Hide();
|
| - web_view_.web_view()->StopFinding();
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// BrowserWindow, private:
|
| -
|
| -void BrowserWindow::Init(mus::Window* root) {
|
| - DCHECK_GT(root->viewport_metrics().device_pixel_ratio, 0);
|
| - if (!aura_init_) {
|
| - ui_init_.reset(new ui::mojo::UIInit(views::GetDisplaysFromWindow(root)));
|
| - aura_init_.reset(new views::AuraInit(shell_, "mandoline_ui.pak"));
|
| - }
|
| -
|
| - root_ = root;
|
| - omnibox_view_ = root_->connection()->NewWindow();
|
| - root_->AddChild(omnibox_view_);
|
| -
|
| - views::WidgetDelegateView* widget_delegate = new views::WidgetDelegateView;
|
| - widget_delegate->GetContentsView()->set_background(
|
| - views::Background::CreateSolidBackground(0xFFDDDDDD));
|
| - toolbar_view_ = new ToolbarView(this);
|
| - progress_bar_ = new ProgressView;
|
| - widget_delegate->GetContentsView()->AddChildView(toolbar_view_);
|
| - widget_delegate->GetContentsView()->AddChildView(progress_bar_);
|
| - widget_delegate->GetContentsView()->SetLayoutManager(
|
| - new LayoutManagerImpl(this));
|
| -
|
| - find_bar_view_ = new FindBarView(this);
|
| - widget_delegate->GetContentsView()->AddChildView(find_bar_view_);
|
| -
|
| - views::Widget* widget = new views::Widget;
|
| - views::Widget::InitParams params(
|
| - views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
|
| - params.native_widget = new views::NativeWidgetMus(
|
| - widget, shell_, root, mus::mojom::SurfaceType::DEFAULT);
|
| - params.delegate = widget_delegate;
|
| - params.bounds = root_->bounds();
|
| - widget->Init(params);
|
| - widget->Show();
|
| - root_->SetFocus();
|
| -}
|
| -
|
| -void BrowserWindow::EmbedOmnibox() {
|
| - mus::mojom::WindowTreeClientPtr view_tree_client;
|
| - omnibox_->GetWindowTreeClient(GetProxy(&view_tree_client));
|
| - omnibox_view_->Embed(std::move(view_tree_client));
|
| -
|
| - // TODO(beng): This should be handled sufficiently by
|
| - // OmniboxImpl::ShowWindow() but unfortunately view manager policy
|
| - // currently prevents the embedded app from changing window z for
|
| - // its own window.
|
| - omnibox_view_->MoveToFront();
|
| -}
|
| -
|
| -void BrowserWindow::Layout(views::View* host) {
|
| - // TODO(fsamuel): All bounds should be in physical pixels.
|
| - gfx::Rect bounds_in_physical_pixels(host->bounds());
|
| - float inverse_device_pixel_ratio =
|
| - 1.0f / root_->viewport_metrics().device_pixel_ratio;
|
| -
|
| - gfx::Rect toolbar_bounds = gfx::ScaleToEnclosingRect(
|
| - bounds_in_physical_pixels, inverse_device_pixel_ratio);
|
| - toolbar_bounds.Inset(10, 10, 10, toolbar_bounds.height() - 40);
|
| - toolbar_view_->SetBoundsRect(toolbar_bounds);
|
| -
|
| - find_bar_view_->SetBoundsRect(toolbar_bounds);
|
| -
|
| - gfx::Rect progress_bar_bounds(toolbar_bounds.x(), toolbar_bounds.bottom() + 2,
|
| - toolbar_bounds.width(), 5);
|
| -
|
| - // The content view bounds are in physical pixels.
|
| - gfx::Rect content_bounds(DIPSToPixels(progress_bar_bounds.x()),
|
| - DIPSToPixels(progress_bar_bounds.bottom() + 10), 0,
|
| - 0);
|
| - content_bounds.set_width(DIPSToPixels(progress_bar_bounds.width()));
|
| - content_bounds.set_height(host->bounds().height() - content_bounds.y() -
|
| - DIPSToPixels(10));
|
| - content_->SetBounds(content_bounds);
|
| -
|
| - // The omnibox view bounds are in physical pixels.
|
| - omnibox_view_->SetBounds(bounds_in_physical_pixels);
|
| -}
|
| -
|
| -} // namespace mandoline
|
|
|