This commit is contained in:
Heilig Benedek 2017-03-05 16:18:57 +01:00
parent 20d2ab29ab
commit c9fa71bdb3
4 changed files with 61 additions and 60 deletions

View file

@ -343,13 +343,13 @@ WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
session->browser_context(), site_instance); session->browser_context(), site_instance);
guest_delegate_.reset(new WebViewGuestDelegate); guest_delegate_.reset(new WebViewGuestDelegate);
params.guest_delegate = guest_delegate_.get(); params.guest_delegate = guest_delegate_.get();
if (embedder_ && embedder_->IsOffScreen()) { if (embedder_ && embedder_->IsOffScreen()) {
auto* view = new OffScreenWebContentsView(false, auto* view = new OffScreenWebContentsView(false,
base::Bind(&WebContents::OnPaint, base::Unretained(this))); base::Bind(&WebContents::OnPaint, base::Unretained(this)));
params.view = view; params.view = view;
params.delegate_view = view; params.delegate_view = view;
web_contents = content::WebContents::Create(params); web_contents = content::WebContents::Create(params);
view->SetWebContents(web_contents); view->SetWebContents(web_contents);
} else { } else {
@ -1650,7 +1650,7 @@ gfx::Size WebContents::GetSizeForNewRenderView(
if (relay) { if (relay) {
return relay->window->GetSize(); return relay->window->GetSize();
} }
return gfx::Size(); return gfx::Size();
} }

View file

@ -26,9 +26,9 @@
#include "ui/compositor/layer.h" #include "ui/compositor/layer.h"
#include "ui/compositor/layer_type.h" #include "ui/compositor/layer_type.h"
#include "ui/events/latency_info.h" #include "ui/events/latency_info.h"
#include "ui/gfx/skbitmap_operations.h"
#include "ui/gfx/geometry/dip_util.h" #include "ui/gfx/geometry/dip_util.h"
#include "ui/gfx/native_widget_types.h" #include "ui/gfx/native_widget_types.h"
#include "ui/gfx/skbitmap_operations.h"
namespace atom { namespace atom {
@ -53,9 +53,9 @@ class AtomResizeLock : public content::ResizeLock {
DCHECK(host_); DCHECK(host_);
host_->HoldResize(); host_->HoldResize();
content::BrowserThread::PostDelayedTask(content::BrowserThread::UI, content::BrowserThread::PostDelayedTask(content::BrowserThread::UI,
FROM_HERE, base::Bind(&AtomResizeLock::CancelLock, FROM_HERE, base::Bind(&AtomResizeLock::CancelLock,
weak_ptr_factory_.GetWeakPtr()), weak_ptr_factory_.GetWeakPtr()),
base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs)); base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs));
} }
@ -472,7 +472,7 @@ OffScreenRenderWidgetHostView::~OffScreenRenderWidgetHostView() {
if (copy_frame_generator_.get()) if (copy_frame_generator_.get())
copy_frame_generator_.reset(NULL); copy_frame_generator_.reset(NULL);
#if defined(OS_MACOSX) #if defined(OS_MACOSX)
DestroyPlatformWidget(); DestroyPlatformWidget();
#else #else
@ -543,7 +543,7 @@ void OffScreenRenderWidgetHostView::InitAsChild(gfx::NativeView) {
if (parent_host_view_->child_host_view_) { if (parent_host_view_->child_host_view_) {
parent_host_view_->child_host_view_->CancelWidget(); parent_host_view_->child_host_view_->CancelWidget();
} }
parent_host_view_->set_child_host_view(this); parent_host_view_->set_child_host_view(this);
parent_host_view_->Hide(); parent_host_view_->Hide();
@ -720,18 +720,18 @@ void OffScreenRenderWidgetHostView::ClearCompositorFrame() {
void OffScreenRenderWidgetHostView::InitAsPopup( void OffScreenRenderWidgetHostView::InitAsPopup(
content::RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) { content::RenderWidgetHostView* parent_host_view, const gfx::Rect& pos) {
DCHECK_EQ(parent_host_view_, parent_host_view); DCHECK_EQ(parent_host_view_, parent_host_view);
if (parent_host_view_->popup_host_view_) { if (parent_host_view_->popup_host_view_) {
parent_host_view_->popup_host_view_->CancelWidget(); parent_host_view_->popup_host_view_->CancelWidget();
} }
parent_host_view_->set_popup_host_view(this); parent_host_view_->set_popup_host_view(this);
parent_host_view_->popup_bitmap_.reset(new SkBitmap); parent_host_view_->popup_bitmap_.reset(new SkBitmap);
parent_callback_ = base::Bind(&OffScreenRenderWidgetHostView::OnPopupPaint, parent_callback_ = base::Bind(&OffScreenRenderWidgetHostView::OnPopupPaint,
parent_host_view_->weak_ptr_factory_.GetWeakPtr()); parent_host_view_->weak_ptr_factory_.GetWeakPtr());
popup_position_ = pos; popup_position_ = pos;
ResizeRootLayer(); ResizeRootLayer();
Show(); Show();
} }
@ -775,7 +775,7 @@ void OffScreenRenderWidgetHostView::Destroy() {
Hide(); Hide();
} }
} }
delete this; delete this;
} }
@ -813,8 +813,8 @@ void OffScreenRenderWidgetHostView::EndFrameSubscription() {
} }
void OffScreenRenderWidgetHostView::InitAsGuest( void OffScreenRenderWidgetHostView::InitAsGuest(
content::RenderWidgetHostView* parent_host_view, content::RenderWidgetHostView* parent_host_view,
content::RenderWidgetHostViewGuest* guest_view) { content::RenderWidgetHostViewGuest* guest_view) {
parent_host_view_->AddGuestHostView(this); parent_host_view_->AddGuestHostView(this);
parent_host_view_->RegisterGuestViewFrameSwappedCallback(guest_view); parent_host_view_->RegisterGuestViewFrameSwappedCallback(guest_view);
} }
@ -931,9 +931,9 @@ bool OffScreenRenderWidgetHostView::TransformPointToCoordSpaceForView(
void OffScreenRenderWidgetHostView::CancelWidget() { void OffScreenRenderWidgetHostView::CancelWidget() {
if (render_widget_host_) if (render_widget_host_)
render_widget_host_->LostCapture(); render_widget_host_->LostCapture();
Hide(); Hide();
if (parent_host_view_) { if (parent_host_view_) {
if (parent_host_view_->popup_host_view_ == this) { if (parent_host_view_->popup_host_view_ == this) {
parent_host_view_->set_popup_host_view(NULL); parent_host_view_->set_popup_host_view(NULL);
@ -946,7 +946,7 @@ void OffScreenRenderWidgetHostView::CancelWidget() {
} }
parent_host_view_ = NULL; parent_host_view_ = NULL;
} }
if (render_widget_host_ && !is_destroyed_) { if (render_widget_host_ && !is_destroyed_) {
is_destroyed_ = true; is_destroyed_ = true;
// Results in a call to Destroy(). // Results in a call to Destroy().
@ -976,7 +976,7 @@ void OffScreenRenderWidgetHostView::OnGuestViewFrameSwapped(
content::RenderWidgetHostViewGuest* guest_host_view) { content::RenderWidgetHostViewGuest* guest_host_view) {
InvalidateBounds( InvalidateBounds(
gfx::ConvertRectToPixel(scale_factor_, guest_host_view->GetViewBounds())); gfx::ConvertRectToPixel(scale_factor_, guest_host_view->GetViewBounds()));
RegisterGuestViewFrameSwappedCallback(guest_host_view); RegisterGuestViewFrameSwappedCallback(guest_host_view);
} }
@ -1023,16 +1023,16 @@ void OffScreenRenderWidgetHostView::SetNeedsBeginFrames(
} }
void CopyBitmapTo( void CopyBitmapTo(
const SkBitmap& destination, const SkBitmap& destination,
const SkBitmap& source, const SkBitmap& source,
const gfx::Rect& pos) { const gfx::Rect& pos) {
SkAutoLockPixels source_pixels_lock(source); SkAutoLockPixels source_pixels_lock(source);
SkAutoLockPixels destination_pixels_lock(destination); SkAutoLockPixels destination_pixels_lock(destination);
char* src = static_cast<char*>(source.getPixels()); char* src = static_cast<char*>(source.getPixels());
char* dest = static_cast<char*>(destination.getPixels()); char* dest = static_cast<char*>(destination.getPixels());
int pixelsize = source.bytesPerPixel(); int pixelsize = source.bytesPerPixel();
if (pos.x() + pos.width() <= destination.width() && if (pos.x() + pos.width() <= destination.width() &&
pos.y() + pos.height() <= destination.height()) { pos.y() + pos.height() <= destination.height()) {
for (int i = 0; i < pos.height(); i++) { for (int i = 0; i < pos.height(); i++) {
@ -1041,14 +1041,14 @@ void CopyBitmapTo(
source.width() * pixelsize); source.width() * pixelsize);
} }
} }
destination.notifyPixelsChanged(); destination.notifyPixelsChanged();
} }
void OffScreenRenderWidgetHostView::OnPaint( void OffScreenRenderWidgetHostView::OnPaint(
const gfx::Rect& damage_rect, const SkBitmap& bitmap) { const gfx::Rect& damage_rect, const SkBitmap& bitmap) {
TRACE_EVENT0("electron", "OffScreenRenderWidgetHostView::OnPaint"); TRACE_EVENT0("electron", "OffScreenRenderWidgetHostView::OnPaint");
HoldResize(); HoldResize();
if (parent_callback_) if (parent_callback_)
@ -1057,14 +1057,14 @@ void OffScreenRenderWidgetHostView::OnPaint(
gfx::Rect pos = popup_host_view_->popup_position_; gfx::Rect pos = popup_host_view_->popup_position_;
SkBitmap copy = SkBitmapOperations::CreateTiledBitmap(bitmap, SkBitmap copy = SkBitmapOperations::CreateTiledBitmap(bitmap,
pos.x(), pos.y(), pos.width(), pos.height()); pos.x(), pos.y(), pos.width(), pos.height());
CopyBitmapTo(bitmap, *popup_bitmap_, pos); CopyBitmapTo(bitmap, *popup_bitmap_, pos);
callback_.Run(damage_rect, bitmap); callback_.Run(damage_rect, bitmap);
CopyBitmapTo(bitmap, copy, pos); CopyBitmapTo(bitmap, copy, pos);
} else { } else {
callback_.Run(damage_rect, bitmap); callback_.Run(damage_rect, bitmap);
} }
ReleaseResize(); ReleaseResize();
} }
@ -1098,7 +1098,7 @@ void OffScreenRenderWidgetHostView::WasResized() {
pending_resize_ = true; pending_resize_ = true;
return; return;
} }
ResizeRootLayer(); ResizeRootLayer();
if (render_widget_host_) if (render_widget_host_)
render_widget_host_->WasResized(); render_widget_host_->WasResized();
@ -1184,10 +1184,10 @@ void OffScreenRenderWidgetHostView::SetFrameRate(int frame_rate) {
frame_rate = 1; frame_rate = 1;
if (frame_rate > 60) if (frame_rate > 60)
frame_rate = 60; frame_rate = 60;
frame_rate_ = frame_rate; frame_rate_ = frame_rate;
} }
for (auto guest_host_view : guest_host_views_) for (auto guest_host_view : guest_host_views_)
guest_host_view->SetFrameRate(frame_rate); guest_host_view->SetFrameRate(frame_rate);

View file

@ -5,6 +5,7 @@
#ifndef ATOM_BROWSER_OSR_OSR_RENDER_WIDGET_HOST_VIEW_H_ #ifndef ATOM_BROWSER_OSR_OSR_RENDER_WIDGET_HOST_VIEW_H_
#define ATOM_BROWSER_OSR_OSR_RENDER_WIDGET_HOST_VIEW_H_ #define ATOM_BROWSER_OSR_OSR_RENDER_WIDGET_HOST_VIEW_H_
#include <set>
#include <string> #include <string>
#include <vector> #include <vector>
@ -142,7 +143,7 @@ class OffScreenRenderWidgetHostView
std::unique_ptr<content::RenderWidgetHostViewFrameSubscriber>) override; std::unique_ptr<content::RenderWidgetHostViewFrameSubscriber>) override;
void EndFrameSubscription() override; void EndFrameSubscription() override;
void InitAsGuest( void InitAsGuest(
content::RenderWidgetHostView*, content::RenderWidgetHostView*,
content::RenderWidgetHostViewGuest*) override; content::RenderWidgetHostViewGuest*) override;
bool HasAcceleratedSurface(const gfx::Size &) override; bool HasAcceleratedSurface(const gfx::Size &) override;
gfx::Rect GetBoundsInRootWindow(void) override; gfx::Rect GetBoundsInRootWindow(void) override;
@ -209,15 +210,15 @@ class OffScreenRenderWidgetHostView
void OnPaint(const gfx::Rect& damage_rect, const SkBitmap& bitmap); void OnPaint(const gfx::Rect& damage_rect, const SkBitmap& bitmap);
void OnPopupPaint(const gfx::Rect& damage_rect, const SkBitmap& bitmap); void OnPopupPaint(const gfx::Rect& damage_rect, const SkBitmap& bitmap);
bool IsPopupWidget() const { bool IsPopupWidget() const {
return popup_type_ != blink::WebPopupTypeNone; return popup_type_ != blink::WebPopupTypeNone;
} }
void HoldResize(); void HoldResize();
void ReleaseResize(); void ReleaseResize();
void WasResized(); void WasResized();
void ProcessKeyboardEvent( void ProcessKeyboardEvent(
const content::NativeWebKeyboardEvent& event) override; const content::NativeWebKeyboardEvent& event) override;
void ProcessMouseEvent(const blink::WebMouseEvent& event, void ProcessMouseEvent(const blink::WebMouseEvent& event,
@ -247,7 +248,7 @@ class OffScreenRenderWidgetHostView
void set_popup_host_view(OffScreenRenderWidgetHostView* popup_view) { void set_popup_host_view(OffScreenRenderWidgetHostView* popup_view) {
popup_host_view_ = popup_view; popup_host_view_ = popup_view;
} }
void set_child_host_view(OffScreenRenderWidgetHostView* child_view) { void set_child_host_view(OffScreenRenderWidgetHostView* child_view) {
child_host_view_ = child_view; child_host_view_ = child_view;
} }
@ -260,13 +261,13 @@ class OffScreenRenderWidgetHostView
// Weak ptrs. // Weak ptrs.
content::RenderWidgetHostImpl* render_widget_host_; content::RenderWidgetHostImpl* render_widget_host_;
OffScreenRenderWidgetHostView* parent_host_view_; OffScreenRenderWidgetHostView* parent_host_view_;
OffScreenRenderWidgetHostView* popup_host_view_; OffScreenRenderWidgetHostView* popup_host_view_;
std::unique_ptr<SkBitmap> popup_bitmap_; std::unique_ptr<SkBitmap> popup_bitmap_;
OffScreenRenderWidgetHostView* child_host_view_; OffScreenRenderWidgetHostView* child_host_view_;
std::set<OffScreenRenderWidgetHostView*> guest_host_views_; std::set<OffScreenRenderWidgetHostView*> guest_host_views_;
NativeWindow* native_window_; NativeWindow* native_window_;
OffScreenOutputDevice* software_output_device_; OffScreenOutputDevice* software_output_device_;
@ -283,7 +284,7 @@ class OffScreenRenderWidgetHostView
gfx::Vector2dF last_scroll_offset_; gfx::Vector2dF last_scroll_offset_;
gfx::Size size_; gfx::Size size_;
bool painting_; bool painting_;
bool is_showing_; bool is_showing_;
bool is_destroyed_; bool is_destroyed_;
gfx::Rect popup_position_; gfx::Rect popup_position_;

View file

@ -34,7 +34,7 @@ void OffScreenWebContentsView::SetWebContents(
#if !defined(OS_MACOSX) #if !defined(OS_MACOSX)
gfx::NativeView OffScreenWebContentsView::GetNativeView() const { gfx::NativeView OffScreenWebContentsView::GetNativeView() const {
if (!web_contents_) return gfx::NativeView(); if (!web_contents_) return gfx::NativeView();
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
if (!relay) return gfx::NativeView(); if (!relay) return gfx::NativeView();
return relay->window->GetNativeView(); return relay->window->GetNativeView();
@ -42,7 +42,7 @@ gfx::NativeView OffScreenWebContentsView::GetNativeView() const {
gfx::NativeView OffScreenWebContentsView::GetContentNativeView() const { gfx::NativeView OffScreenWebContentsView::GetContentNativeView() const {
if (!web_contents_) return gfx::NativeView(); if (!web_contents_) return gfx::NativeView();
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
if (!relay) return gfx::NativeView(); if (!relay) return gfx::NativeView();
return relay->window->GetNativeView(); return relay->window->GetNativeView();
@ -50,7 +50,7 @@ gfx::NativeView OffScreenWebContentsView::GetContentNativeView() const {
gfx::NativeWindow OffScreenWebContentsView::GetTopLevelNativeWindow() const { gfx::NativeWindow OffScreenWebContentsView::GetTopLevelNativeWindow() const {
if (!web_contents_) return gfx::NativeWindow(); if (!web_contents_) return gfx::NativeWindow();
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
if (!relay) return gfx::NativeWindow(); if (!relay) return gfx::NativeWindow();
return relay->window->GetNativeWindow(); return relay->window->GetNativeWindow();
@ -90,18 +90,18 @@ void OffScreenWebContentsView::CreateView(const gfx::Size& initial_size,
content::RenderWidgetHostViewBase* content::RenderWidgetHostViewBase*
OffScreenWebContentsView::CreateViewForWidget( OffScreenWebContentsView::CreateViewForWidget(
content::RenderWidgetHost* render_widget_host, bool is_guest_view_hack) { content::RenderWidgetHost* render_widget_host, bool is_guest_view_hack) {
if (render_widget_host->GetView()) { if (render_widget_host->GetView()) {
return static_cast<content::RenderWidgetHostViewBase*>( return static_cast<content::RenderWidgetHostViewBase*>(
render_widget_host->GetView()); render_widget_host->GetView());
} }
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
return new OffScreenRenderWidgetHostView( return new OffScreenRenderWidgetHostView(
transparent_, transparent_,
callback_, callback_,
render_widget_host, render_widget_host,
nullptr, nullptr,
relay->window.get()); relay->window.get());
} }
@ -113,19 +113,19 @@ content::RenderWidgetHostViewBase*
return static_cast<content::RenderWidgetHostViewBase*>( return static_cast<content::RenderWidgetHostViewBase*>(
render_widget_host->GetView()); render_widget_host->GetView());
} }
OffScreenRenderWidgetHostView* embedder_host_view = nullptr; OffScreenRenderWidgetHostView* embedder_host_view = nullptr;
if (embedder_render_widget_host) { if (embedder_render_widget_host) {
embedder_host_view = static_cast<OffScreenRenderWidgetHostView*>( embedder_host_view = static_cast<OffScreenRenderWidgetHostView*>(
embedder_render_widget_host->GetView()); embedder_render_widget_host->GetView());
} }
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
return new OffScreenRenderWidgetHostView( return new OffScreenRenderWidgetHostView(
transparent_, transparent_,
callback_, callback_,
render_widget_host, render_widget_host,
embedder_host_view, embedder_host_view,
relay->window.get()); relay->window.get());
} }
@ -134,10 +134,10 @@ content::RenderWidgetHostViewBase*
content::RenderWidgetHost* render_widget_host) { content::RenderWidgetHost* render_widget_host) {
auto relay = NativeWindowRelay::FromWebContents(web_contents_); auto relay = NativeWindowRelay::FromWebContents(web_contents_);
return new OffScreenRenderWidgetHostView( return new OffScreenRenderWidgetHostView(
transparent_, transparent_,
callback_, callback_,
render_widget_host, render_widget_host,
GetView(), GetView(),
relay->window.get()); relay->window.get());
} }
@ -164,13 +164,13 @@ void OffScreenWebContentsView::GetScreenInfo(
screen_info->orientation_angle = 0; screen_info->orientation_angle = 0;
screen_info->orientation_type = screen_info->orientation_type =
content::SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY; content::SCREEN_ORIENTATION_VALUES_LANDSCAPE_PRIMARY;
if (GetView()) { if (GetView()) {
screen_info->rect = gfx::Rect(GetView()->size()); screen_info->rect = gfx::Rect(GetView()->size());
screen_info->available_rect = gfx::Rect(GetView()->size()); screen_info->available_rect = gfx::Rect(GetView()->size());
screen_info->device_scale_factor = GetView()->scale_factor(); screen_info->device_scale_factor = GetView()->scale_factor();
} else { } else {
const display::Display display = const display::Display display =
display::Screen::GetScreen()->GetPrimaryDisplay(); display::Screen::GetScreen()->GetPrimaryDisplay();
screen_info->rect = display.bounds(); screen_info->rect = display.bounds();
screen_info->available_rect = display.work_area(); screen_info->available_rect = display.work_area();