blob: 227b3580994fd8f92cb99a2a15dfb21e670665f8 [file] [log] [blame]
// 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 "services/navigation/view_impl.h"
#include "base/strings/utf_string_conversions.h"
#include "components/mus/public/cpp/window_tree_connection.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/web_contents.h"
#include "mojo/converters/geometry/geometry_type_converters.h"
#include "ui/views/controls/webview/webview.h"
#include "ui/views/mus/native_widget_mus.h"
#include "ui/views/widget/widget.h"
#include "url/gurl.h"
namespace navigation {
ViewImpl::ViewImpl(shell::Connector* connector,
content::BrowserContext* browser_context,
mojom::ViewClientPtr client,
mojom::ViewRequest request,
std::unique_ptr<shell::ShellConnectionRef> ref)
: connector_(connector),
binding_(this, std::move(request)),
client_(std::move(client)),
ref_(std::move(ref)),
web_view_(new views::WebView(browser_context)) {
web_view_->GetWebContents()->SetDelegate(this);
}
ViewImpl::~ViewImpl() {}
void ViewImpl::NavigateTo(const GURL& url) {
web_view_->GetWebContents()->GetController().LoadURL(
url, content::Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
}
void ViewImpl::GoBack() {
web_view_->GetWebContents()->GetController().GoBack();
}
void ViewImpl::GoForward() {
web_view_->GetWebContents()->GetController().GoForward();
}
void ViewImpl::Reload(bool skip_cache) {
if (skip_cache)
web_view_->GetWebContents()->GetController().Reload(true);
else
web_view_->GetWebContents()->GetController().ReloadBypassingCache(true);
}
void ViewImpl::Stop() {
web_view_->GetWebContents()->Stop();
}
void ViewImpl::GetWindowTreeClient(
mus::mojom::WindowTreeClientRequest request) {
mus::WindowTreeConnection::Create(
this, std::move(request),
mus::WindowTreeConnection::CreateType::DONT_WAIT_FOR_EMBED);
}
void ViewImpl::AddNewContents(content::WebContents* source,
content::WebContents* new_contents,
WindowOpenDisposition disposition,
const gfx::Rect& initial_rect,
bool user_gesture,
bool* was_blocked) {
mojom::ViewClientPtr client;
mojom::ViewPtr view;
mojom::ViewRequest view_request = GetProxy(&view);
client_->ViewCreated(std::move(view), GetProxy(&client),
disposition == NEW_POPUP, mojo::Rect::From(initial_rect),
user_gesture);
ViewImpl* impl =
new ViewImpl(connector_, new_contents->GetBrowserContext(),
std::move(client), std::move(view_request), ref_->Clone());
// TODO(beng): This is a bit crappy. should be able to create the ViewImpl
// with |new_contents| instead.
impl->web_view_->SetWebContents(new_contents);
impl->web_view_->GetWebContents()->SetDelegate(impl);
// TODO(beng): this reply is currently synchronous, figure out a fix.
if (was_blocked)
*was_blocked = false;
}
void ViewImpl::CloseContents(content::WebContents* source) {
client_->Close();
}
void ViewImpl::LoadingStateChanged(content::WebContents* source,
bool to_different_document) {
client_->LoadingStateChanged(source->IsLoading());
}
void ViewImpl::NavigationStateChanged(content::WebContents* source,
content::InvalidateTypes changed_flags) {
client_->NavigationStateChanged(source->GetVisibleURL(),
base::UTF16ToUTF8(source->GetTitle()),
source->GetController().CanGoBack(),
source->GetController().CanGoForward());
}
void ViewImpl::LoadProgressChanged(content::WebContents* source,
double progress) {
client_->LoadProgressChanged(progress);
}
void ViewImpl::OnEmbed(mus::Window* root) {
DCHECK(!widget_.get());
widget_.reset(new views::Widget);
views::Widget::InitParams params(
views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.delegate = this;
params.native_widget = new views::NativeWidgetMus(
widget_.get(), connector_, root, mus::mojom::SurfaceType::DEFAULT);
widget_->Init(params);
widget_->Show();
}
void ViewImpl::OnConnectionLost(mus::WindowTreeConnection* connection) {}
void ViewImpl::OnEventObserved(const ui::Event& event, mus::Window* target) {}
views::View* ViewImpl::GetContentsView() {
return web_view_;
}
views::Widget* ViewImpl::GetWidget() {
return web_view_->GetWidget();
}
const views::Widget* ViewImpl::GetWidget() const {
return web_view_->GetWidget();
}
} // navigation