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 |