blob: cedbe02732232309aac9a0a9019533cec3fe6d89 [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 "content/browser/renderer_host/delegated_frame_host_client_aura.h"
#include "content/browser/renderer_host/compositor_resize_lock_aura.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_aura.h"
#include "content/common/view_messages.h"
#include "ui/aura/window.h"
#include "ui/compositor/layer.h"
namespace content {
namespace {
// When accelerated compositing is enabled and a widget resize is pending,
// we delay further resizes of the UI. The following constant is the maximum
// length of time that we should delay further UI resizes while waiting for a
// resized frame from a renderer.
const int kResizeLockTimeoutMs = 67;
} // namespace
DelegatedFrameHostClientAura::DelegatedFrameHostClientAura(
RenderWidgetHostViewAura* render_widget_host_view)
: render_widget_host_view_(render_widget_host_view) {}
DelegatedFrameHostClientAura::~DelegatedFrameHostClientAura() {}
ui::Layer* DelegatedFrameHostClientAura::DelegatedFrameHostGetLayer() const {
return render_widget_host_view_->window_->layer();
}
bool DelegatedFrameHostClientAura::DelegatedFrameHostIsVisible() const {
return !render_widget_host_view_->host_->is_hidden();
}
SkColor DelegatedFrameHostClientAura::DelegatedFrameHostGetGutterColor(
SkColor color) const {
// When making an element on the page fullscreen the element's background
// may not match the page's, so use black as the gutter color to avoid
// flashes of brighter colors during the transition.
if (render_widget_host_view_->host_->delegate() &&
render_widget_host_view_->host_->delegate()
->IsFullscreenForCurrentTab()) {
return SK_ColorBLACK;
}
return color;
}
gfx::Size DelegatedFrameHostClientAura::DelegatedFrameHostDesiredSizeInDIP()
const {
return render_widget_host_view_->window_->bounds().size();
}
bool DelegatedFrameHostClientAura::DelegatedFrameCanCreateResizeLock() const {
#if !defined(OS_CHROMEOS)
// On Windows and Linux, holding pointer moves will not help throttling
// resizes.
// TODO(piman): on Windows we need to block (nested message loop?) the
// WM_SIZE event. On Linux we need to throttle at the WM level using
// _NET_WM_SYNC_REQUEST.
return false;
#else
if (render_widget_host_view_->host_->auto_resize_enabled())
return false;
return true;
#endif
}
std::unique_ptr<ResizeLock>
DelegatedFrameHostClientAura::DelegatedFrameHostCreateResizeLock(
bool defer_compositor_lock) {
gfx::Size desired_size = render_widget_host_view_->window_->bounds().size();
return std::unique_ptr<ResizeLock>(new CompositorResizeLock(
render_widget_host_view_->window_->GetHost(), desired_size,
defer_compositor_lock,
base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs)));
}
void DelegatedFrameHostClientAura::DelegatedFrameHostResizeLockWasReleased() {
render_widget_host_view_->host_->WasResized();
}
void DelegatedFrameHostClientAura::
DelegatedFrameHostSendReclaimCompositorResources(
int compositor_frame_sink_id,
bool is_swap_ack,
const cc::ReturnedResourceArray& resources) {
render_widget_host_view_->host_->Send(new ViewMsg_ReclaimCompositorResources(
render_widget_host_view_->host_->GetRoutingID(), compositor_frame_sink_id,
is_swap_ack, resources));
}
void DelegatedFrameHostClientAura::SetBeginFrameSource(
cc::BeginFrameSource* source) {
if (render_widget_host_view_->begin_frame_source_ &&
render_widget_host_view_->added_frame_observer_) {
render_widget_host_view_->begin_frame_source_->RemoveObserver(
render_widget_host_view_);
render_widget_host_view_->added_frame_observer_ = false;
}
render_widget_host_view_->begin_frame_source_ = source;
render_widget_host_view_->UpdateNeedsBeginFramesInternal();
}
bool DelegatedFrameHostClientAura::IsAutoResizeEnabled() const {
return render_widget_host_view_->host_->auto_resize_enabled();
}
} // namespace content