blob: cfdc9b1dbcac45b4352aeb5c4fb89a349ba567fc [file] [log] [blame]
// 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 "content/browser/web_contents/web_contents_view_mus.h"
#include "build/build_config.h"
#include "content/browser/frame_host/interstitial_page_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_mus.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents_view_delegate.h"
#include "services/ui/public/cpp/window.h"
#include "services/ui/public/cpp/window_tree_client.h"
#include "third_party/WebKit/public/platform/WebDragOperation.h"
#include "ui/aura/client/window_tree_client.h"
#include "ui/aura/window.h"
#include "ui/base/hit_test.h"
using blink::WebDragOperation;
using blink::WebDragOperationsMask;
namespace content {
WebContentsViewMus::WebContentsViewMus(
ui::Window* parent_window,
WebContentsImpl* web_contents,
WebContentsViewDelegate* delegate,
RenderViewHostDelegateView** delegate_view)
: web_contents_(web_contents), delegate_(delegate) {
DCHECK(parent_window);
*delegate_view = this;
ui::Window* window = parent_window->window_tree()->NewWindow();
window->SetVisible(true);
window->SetBounds(gfx::Rect(300, 300));
parent_window->AddChild(window);
mus_window_.reset(new ui::ScopedWindowPtr(window));
}
WebContentsViewMus::~WebContentsViewMus() {}
void WebContentsViewMus::SizeChangedCommon(const gfx::Size& size) {
if (web_contents_->GetInterstitialPage())
web_contents_->GetInterstitialPage()->SetSize(size);
RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
if (rwhv)
rwhv->SetSize(size);
mus_window_->window()->SetBounds(gfx::Rect(size));
}
gfx::NativeView WebContentsViewMus::GetNativeView() const {
return aura_window_.get();
}
gfx::NativeView WebContentsViewMus::GetContentNativeView() const {
RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
return rwhv ? rwhv->GetNativeView() : nullptr;
}
gfx::NativeWindow WebContentsViewMus::GetTopLevelNativeWindow() const {
gfx::NativeWindow window = aura_window_->GetToplevelWindow();
return window ? window : delegate_->GetNativeWindow();
}
void WebContentsViewMus::GetScreenInfo(ScreenInfo* screen_info) const {
// TODO(wjmaclean) Figure out what goes here.
}
void WebContentsViewMus::GetContainerBounds(gfx::Rect* out) const {
*out = aura_window_->GetBoundsInScreen();
}
void WebContentsViewMus::SizeContents(const gfx::Size& size) {
gfx::Rect bounds = aura_window_->bounds();
if (bounds.size() != size) {
bounds.set_size(size);
aura_window_->SetBounds(bounds);
SizeChangedCommon(size);
} else {
// Our size matches what we want but the renderers size may not match.
// Pretend we were resized so that the renderers size is updated too.
SizeChangedCommon(size);
}
}
void WebContentsViewMus::SetInitialFocus() {
if (web_contents_->FocusLocationBarByDefault())
web_contents_->SetFocusToLocationBar(false);
}
gfx::Rect WebContentsViewMus::GetViewBounds() const {
return aura_window_->GetBoundsInScreen();
}
#if defined(OS_MACOSX)
void WebContentsViewMus::SetAllowOtherViews(bool allow) {
}
bool WebContentsViewMus::GetAllowOtherViews() const {
return false;
}
#endif
void WebContentsViewMus::CreateView(const gfx::Size& initial_size,
gfx::NativeView context) {
// We install a WindowDelegate so that the mus_window_ can track the size
// of the |aura_window_|.
aura_window_.reset(new aura::Window(this));
aura_window_->set_owned_by_parent(false);
aura_window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
aura_window_->Init(ui::LAYER_NOT_DRAWN);
aura::Window* root_window = context ? context->GetRootWindow() : nullptr;
if (root_window) {
// There are places where there is no context currently because object
// hierarchies are built before they're attached to a Widget. (See
// views::WebView as an example; GetWidget() returns nullptr at the point
// where we are created.)
//
// It should be OK to not set a default parent since such users will
// explicitly add this WebContentsViewMus to their tree after they create
// us.
aura::client::ParentWindowWithContext(aura_window_.get(), root_window,
root_window->GetBoundsInScreen());
}
aura_window_->layer()->SetMasksToBounds(true);
aura_window_->SetName("WebContentsViewMus");
}
RenderWidgetHostViewBase* WebContentsViewMus::CreateViewForWidget(
RenderWidgetHost* render_widget_host,
bool is_guest_view_hack) {
RenderWidgetHostViewBase* view = new RenderWidgetHostViewMus(
mus_window_->window(), RenderWidgetHostImpl::From(render_widget_host));
view->InitAsChild(GetNativeView());
return view;
}
RenderWidgetHostViewBase* WebContentsViewMus::CreateViewForPopupWidget(
RenderWidgetHost* render_widget_host) {
return new RenderWidgetHostViewMus(
mus_window_->window(), RenderWidgetHostImpl::From(render_widget_host));
}
void WebContentsViewMus::SetPageTitle(const base::string16& title) {}
void WebContentsViewMus::RenderViewCreated(RenderViewHost* host) {
}
void WebContentsViewMus::RenderViewSwappedIn(RenderViewHost* host) {
}
void WebContentsViewMus::SetOverscrollControllerEnabled(bool enabled) {
// This should never override the setting of the embedder view.
}
#if defined(OS_MACOSX)
bool WebContentsViewMus::IsEventTracking() const {
return false;
}
void WebContentsViewMus::CloseTabAfterEventTracking() {}
#endif
WebContents* WebContentsViewMus::web_contents() {
return web_contents_;
}
void WebContentsViewMus::RestoreFocus() {
// Focus is managed by mus, not the browser.
NOTIMPLEMENTED();
}
void WebContentsViewMus::Focus() {
// Focus is managed by mus, not the browser.
NOTIMPLEMENTED();
}
void WebContentsViewMus::StoreFocus() {
// Focus is managed by mus, not the browser.
NOTIMPLEMENTED();
}
DropData* WebContentsViewMus::GetDropData() const {
NOTIMPLEMENTED();
return nullptr;
}
void WebContentsViewMus::UpdateDragCursor(WebDragOperation operation) {
// TODO(fsamuel): Implement cursor in Mus.
}
void WebContentsViewMus::GotFocus() {
// Focus is managed by mus, not the browser.
NOTIMPLEMENTED();
}
void WebContentsViewMus::TakeFocus(bool reverse) {
// Focus is managed by mus, not the browser.
NOTIMPLEMENTED();
}
void WebContentsViewMus::ShowContextMenu(RenderFrameHost* render_frame_host,
const ContextMenuParams& params) {
}
void WebContentsViewMus::StartDragging(const DropData& drop_data,
WebDragOperationsMask ops,
const gfx::ImageSkia& image,
const gfx::Vector2d& image_offset,
const DragEventSourceInfo& event_info) {
// TODO(fsamuel): Implement drag and drop.
}
////////////////////////////////////////////////////////////////////////////////
// WebContentsViewMus, aura::WindowDelegate implementation:
gfx::Size WebContentsViewMus::GetMinimumSize() const {
return gfx::Size();
}
gfx::Size WebContentsViewMus::GetMaximumSize() const {
return gfx::Size();
}
void WebContentsViewMus::OnBoundsChanged(const gfx::Rect& old_bounds,
const gfx::Rect& new_bounds) {
SizeChangedCommon(new_bounds.size());
if (delegate_)
delegate_->SizeChanged(new_bounds.size());
}
gfx::NativeCursor WebContentsViewMus::GetCursor(const gfx::Point& point) {
return gfx::kNullCursor;
}
int WebContentsViewMus::GetNonClientComponent(const gfx::Point& point) const {
return HTCLIENT;
}
bool WebContentsViewMus::ShouldDescendIntoChildForEventHandling(
aura::Window* child,
const gfx::Point& location) {
return true;
}
bool WebContentsViewMus::CanFocus() {
return false;
}
void WebContentsViewMus::OnCaptureLost() {}
void WebContentsViewMus::OnPaint(const ui::PaintContext& context) {}
void WebContentsViewMus::OnDeviceScaleFactorChanged(float device_scale_factor) {
}
void WebContentsViewMus::OnWindowDestroying(aura::Window* window) {}
void WebContentsViewMus::OnWindowDestroyed(aura::Window* window) {}
void WebContentsViewMus::OnWindowTargetVisibilityChanged(bool visible) {}
bool WebContentsViewMus::HasHitTestMask() const {
return false;
}
void WebContentsViewMus::GetHitTestMask(gfx::Path* mask) const {}
} // namespace content