blob: e58fc88841b1cfabb101f7fb617afbff57be672b [file] [log] [blame]
// Copyright 2019 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 "ash/shell/content/embedded_browser.h"
#include "ash/public/cpp/app_types.h"
#include "ash/wm/window_state.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/views/controls/webview/webview.h"
#include "ui/views/layout/fill_layout.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_delegate.h"
#include "url/gurl.h"
namespace ash {
namespace shell {
namespace {
class BrowserWidgetDelegateView : public views::WidgetDelegateView {
public:
BrowserWidgetDelegateView(content::BrowserContext* context, const GURL& url) {
SetLayoutManager(std::make_unique<views::FillLayout>());
auto* webview = new views::WebView(context);
AddChildView(webview);
Layout();
webview->LoadInitialURL(url);
}
~BrowserWidgetDelegateView() override = default;
// views::WidgetDelegateView:
base::string16 GetWindowTitle() const override {
const static base::string16 title = base::ASCIIToUTF16("WebView Browser");
return title;
}
bool CanResize() const override { return true; }
bool CanMaximize() const override { return true; }
bool CanMinimize() const override { return true; }
private:
DISALLOW_COPY_AND_ASSIGN(BrowserWidgetDelegateView);
};
} // namespace
EmbeddedBrowser::EmbeddedBrowser(content::BrowserContext* context,
const GURL& url,
const gfx::Rect& bounds)
: widget_(new views::Widget) {
views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
params.bounds = bounds;
params.delegate = new BrowserWidgetDelegateView(context, url);
widget_->Init(std::move(params));
WindowState::Get(widget_->GetNativeWindow())->SetWindowPositionManaged(true);
widget_->Show();
}
EmbeddedBrowser::~EmbeddedBrowser() = default;
aura::Window* EmbeddedBrowser::GetWindow() {
return widget_->GetNativeView();
}
// static
aura::Window* EmbeddedBrowser::Create(content::BrowserContext* context,
const GURL& url,
base::Optional<gfx::Rect> bounds) {
static const gfx::Rect default_bounds(20, 20, 800, 600);
// EmbeddedBrowser deletes itself when the widget is closed.
aura::Window* browser_window =
(new EmbeddedBrowser(context, url, bounds ? *bounds : default_bounds))
->GetWindow();
browser_window->SetProperty(aura::client::kAppType,
static_cast<int>(ash::AppType::BROWSER));
return browser_window;
}
void EmbeddedBrowser::OnUnembed() {
delete this;
}
} // namespace shell
} // namespace ash