Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_mac.mm

Issue 267073003: Make --enable-delegated-renderer show stuff on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporate review feedback Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_mac.h" 5 #include "content/browser/renderer_host/render_widget_host_view_mac.h"
6 6
7 #import <objc/runtime.h> 7 #import <objc/runtime.h>
8 #include <QuartzCore/QuartzCore.h> 8 #include <QuartzCore/QuartzCore.h>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/callback_helpers.h" 12 #include "base/callback_helpers.h"
13 #include "base/command_line.h" 13 #include "base/command_line.h"
14 #include "base/debug/crash_logging.h" 14 #include "base/debug/crash_logging.h"
15 #include "base/debug/trace_event.h" 15 #include "base/debug/trace_event.h"
16 #include "base/logging.h" 16 #include "base/logging.h"
17 #include "base/mac/mac_util.h" 17 #include "base/mac/mac_util.h"
18 #include "base/mac/scoped_cftyperef.h" 18 #include "base/mac/scoped_cftyperef.h"
19 #import "base/mac/scoped_nsobject.h" 19 #import "base/mac/scoped_nsobject.h"
20 #include "base/mac/sdk_forward_declarations.h" 20 #include "base/mac/sdk_forward_declarations.h"
21 #include "base/message_loop/message_loop.h" 21 #include "base/message_loop/message_loop.h"
22 #include "base/metrics/histogram.h" 22 #include "base/metrics/histogram.h"
23 #include "base/strings/string_util.h" 23 #include "base/strings/string_util.h"
24 #include "base/strings/stringprintf.h" 24 #include "base/strings/stringprintf.h"
25 #include "base/strings/sys_string_conversions.h" 25 #include "base/strings/sys_string_conversions.h"
26 #include "base/strings/utf_string_conversions.h" 26 #include "base/strings/utf_string_conversions.h"
27 #include "base/sys_info.h" 27 #include "base/sys_info.h"
28 #import "content/browser/accessibility/browser_accessibility_cocoa.h" 28 #import "content/browser/accessibility/browser_accessibility_cocoa.h"
29 #include "content/browser/accessibility/browser_accessibility_manager_mac.h" 29 #include "content/browser/accessibility/browser_accessibility_manager_mac.h"
30 #include "content/browser/compositor/resize_lock.h"
30 #include "content/browser/frame_host/frame_tree.h" 31 #include "content/browser/frame_host/frame_tree.h"
31 #include "content/browser/frame_host/frame_tree_node.h" 32 #include "content/browser/frame_host/frame_tree_node.h"
32 #include "content/browser/frame_host/render_frame_host_impl.h" 33 #include "content/browser/frame_host/render_frame_host_impl.h"
34 #include "content/browser/gpu/gpu_process_host.h"
35 #include "content/browser/gpu/gpu_surface_tracker.h"
33 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h" 36 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h"
34 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" 37 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h"
35 #include "content/browser/renderer_host/compositing_iosurface_mac.h" 38 #include "content/browser/renderer_host/compositing_iosurface_mac.h"
39 #include "content/browser/renderer_host/render_widget_helper.h"
36 #include "content/browser/renderer_host/render_view_host_impl.h" 40 #include "content/browser/renderer_host/render_view_host_impl.h"
37 #import "content/browser/renderer_host/render_widget_host_view_mac_dictionary_he lper.h" 41 #import "content/browser/renderer_host/render_widget_host_view_mac_dictionary_he lper.h"
38 #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_h elper.h" 42 #import "content/browser/renderer_host/render_widget_host_view_mac_editcommand_h elper.h"
39 #import "content/browser/renderer_host/text_input_client_mac.h" 43 #import "content/browser/renderer_host/text_input_client_mac.h"
40 #include "content/common/accessibility_messages.h" 44 #include "content/common/accessibility_messages.h"
41 #include "content/common/edit_command.h" 45 #include "content/common/edit_command.h"
42 #include "content/common/gpu/gpu_messages.h" 46 #include "content/common/gpu/gpu_messages.h"
43 #include "content/common/input_messages.h" 47 #include "content/common/input_messages.h"
44 #include "content/common/view_messages.h" 48 #include "content/common/view_messages.h"
45 #include "content/common/webplugin_geometry.h" 49 #include "content/common/webplugin_geometry.h"
46 #include "content/port/browser/render_widget_host_view_frame_subscriber.h" 50 #include "content/port/browser/render_widget_host_view_frame_subscriber.h"
47 #include "content/public/browser/browser_thread.h" 51 #include "content/public/browser/browser_thread.h"
48 #include "content/public/browser/native_web_keyboard_event.h" 52 #include "content/public/browser/native_web_keyboard_event.h"
49 #include "content/public/browser/notification_service.h" 53 #include "content/public/browser/notification_service.h"
50 #include "content/public/browser/notification_types.h" 54 #include "content/public/browser/notification_types.h"
51 #import "content/public/browser/render_widget_host_view_mac_delegate.h" 55 #import "content/public/browser/render_widget_host_view_mac_delegate.h"
52 #include "content/public/browser/user_metrics.h" 56 #include "content/public/browser/user_metrics.h"
53 #include "content/public/browser/web_contents.h" 57 #include "content/public/browser/web_contents.h"
54 #include "skia/ext/platform_canvas.h" 58 #include "skia/ext/platform_canvas.h"
55 #include "third_party/WebKit/public/platform/WebScreenInfo.h" 59 #include "third_party/WebKit/public/platform/WebScreenInfo.h"
56 #include "third_party/WebKit/public/web/WebInputEvent.h" 60 #include "third_party/WebKit/public/web/WebInputEvent.h"
57 #include "third_party/WebKit/public/web/mac/WebInputEventFactory.h" 61 #include "third_party/WebKit/public/web/mac/WebInputEventFactory.h"
58 #import "third_party/mozilla/ComplexTextInputPanel.h" 62 #import "third_party/mozilla/ComplexTextInputPanel.h"
59 #include "ui/base/cocoa/animation_utils.h" 63 #include "ui/base/cocoa/animation_utils.h"
60 #import "ui/base/cocoa/fullscreen_window_manager.h" 64 #import "ui/base/cocoa/fullscreen_window_manager.h"
61 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" 65 #import "ui/base/cocoa/underlay_opengl_hosting_window.h"
62 #include "ui/events/keycodes/keyboard_codes.h" 66 #include "ui/events/keycodes/keyboard_codes.h"
63 #include "ui/base/layout.h" 67 #include "ui/base/layout.h"
68 #include "ui/compositor/compositor.h"
69 #include "ui/compositor/layer.h"
64 #include "ui/gfx/display.h" 70 #include "ui/gfx/display.h"
65 #include "ui/gfx/point.h" 71 #include "ui/gfx/point.h"
66 #include "ui/gfx/rect_conversions.h" 72 #include "ui/gfx/rect_conversions.h"
67 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" 73 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h"
68 #include "ui/gfx/screen.h" 74 #include "ui/gfx/screen.h"
69 #include "ui/gfx/size_conversions.h" 75 #include "ui/gfx/size_conversions.h"
70 #include "ui/gl/gl_switches.h" 76 #include "ui/gl/gl_switches.h"
71 #include "ui/gl/io_surface_support_mac.h" 77 #include "ui/gl/io_surface_support_mac.h"
72 78
73 using content::BrowserAccessibility; 79 using content::BrowserAccessibility;
(...skipping 27 matching lines...) Expand all
101 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 107 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
102 @interface NSView (NSOpenGLSurfaceResolutionLionAPI) 108 @interface NSView (NSOpenGLSurfaceResolutionLionAPI)
103 - (void)setWantsBestResolutionOpenGLSurface:(BOOL)flag; 109 - (void)setWantsBestResolutionOpenGLSurface:(BOOL)flag;
104 @end 110 @end
105 111
106 static NSString* const NSWindowDidChangeBackingPropertiesNotification = 112 static NSString* const NSWindowDidChangeBackingPropertiesNotification =
107 @"NSWindowDidChangeBackingPropertiesNotification"; 113 @"NSWindowDidChangeBackingPropertiesNotification";
108 114
109 #endif // 10.7 115 #endif // 10.7
110 116
117 // Declare methods used to present swaps to this view.
118 @interface NSView (ContentCompositingView)
119 - (void)onNativeSurfaceBuffersSwappedWithParams:
120 (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params;
121 @end
122
123 @implementation NSView (ContentCompositingView)
124 - (void)onNativeSurfaceBuffersSwappedWithParams:
125 (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params {
126 }
127 @end
128
111 // This method will return YES for OS X versions 10.7.3 and later, and NO 129 // This method will return YES for OS X versions 10.7.3 and later, and NO
112 // otherwise. 130 // otherwise.
113 // Used to prevent a crash when building with the 10.7 SDK and accessing the 131 // Used to prevent a crash when building with the 10.7 SDK and accessing the
114 // notification below. See: http://crbug.com/260595. 132 // notification below. See: http://crbug.com/260595.
115 static BOOL SupportsBackingPropertiesChangedNotification() { 133 static BOOL SupportsBackingPropertiesChangedNotification() {
116 // windowDidChangeBackingProperties: method has been added to the 134 // windowDidChangeBackingProperties: method has been added to the
117 // NSWindowDelegate protocol in 10.7.3, at the same time as the 135 // NSWindowDelegate protocol in 10.7.3, at the same time as the
118 // NSWindowDidChangeBackingPropertiesNotification notification was added. 136 // NSWindowDidChangeBackingPropertiesNotification notification was added.
119 // If the protocol contains this method description, the notification should 137 // If the protocol contains this method description, the notification should
120 // be supported as well. 138 // be supported as well.
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 // Disable the fade-out animation as the layer is removed. 404 // Disable the fade-out animation as the layer is removed.
387 ScopedCAActionDisabler disabler; 405 ScopedCAActionDisabler disabler;
388 [layer removeFromSuperlayer]; 406 [layer removeFromSuperlayer];
389 } 407 }
390 408
391 } // namespace 409 } // namespace
392 410
393 namespace content { 411 namespace content {
394 412
395 /////////////////////////////////////////////////////////////////////////////// 413 ///////////////////////////////////////////////////////////////////////////////
414 // RenderWidgetHelper, public:
415
416 void RenderWidgetHelper::OnNativeSurfaceBuffersSwapped(
417 GpuProcessHost* gpu_process_host,
418 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params) {
419 if (BrowserThread::CurrentlyOn(BrowserThread::IO)) {
420 // Immediately acknowledge this frame on the IO thread instead of the UI
421 // thread. The UI thread will wait on the GPU process. If the UI thread
422 // were to be responsible for acking swaps, then there would be a cycle
423 // and a potential deadlock.
424 // TODO(ccameron): This immediate ack circumvents GPU back-pressure that
425 // is necessary to throttle renderers. Fix that.
426 // TODO(ccameron): It is possible that the IOSurface will be deleted or
427 // reused soon as it is acked. Take out a reference to the IOSurface here,
428 // to ensure the IOSurface does not disappear before routing to the UI
429 // thread.
430 AcceleratedSurfaceMsg_BufferPresented_Params ack_params;
431 ack_params.sync_point = 0;
432 ack_params.renderer_id = 0;
433 gpu_process_host->Send(new AcceleratedSurfaceMsg_BufferPresented(
434 params.route_id, ack_params));
435
436 gpu_process_host = NULL;
437 BrowserThread::PostTask(
438 BrowserThread::UI,
439 FROM_HERE,
440 base::Bind(&OnNativeSurfaceBuffersSwapped, gpu_process_host, params));
piman 2014/05/06 20:02:54 It kinda calls for having a different function for
ccameron 2014/05/06 20:39:00 Done.
441 return;
442 }
443
444 gfx::AcceleratedWidget native_widget =
445 GpuSurfaceTracker::Get()->AcquireNativeWidget(params.surface_id);
446 [native_widget onNativeSurfaceBuffersSwappedWithParams:params];
447 }
448
449 ////////////////////////////////////////////////////////////////////////////////
450 // DelegatedFrameHost, public:
451
452 ui::Compositor* RenderWidgetHostViewMac::GetCompositor() const {
453 return compositor_.get();
454 }
455
456 ui::Layer* RenderWidgetHostViewMac::GetLayer() {
457 return root_layer_.get();
458 }
459
460 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() {
461 return render_widget_host_;
462 }
463
464 void RenderWidgetHostViewMac::SchedulePaintInRect(
465 const gfx::Rect& damage_rect_in_dip) {
466 compositor_->ScheduleFullRedraw();
467 }
468
469 bool RenderWidgetHostViewMac::IsVisible() {
470 return !render_widget_host_->is_hidden();
471 }
472
473 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() {
474 return GetViewBounds().size();
475 }
476
477 float RenderWidgetHostViewMac::CurrentDeviceScaleFactor() {
478 return ViewScaleFactor();
479 }
480
481 gfx::Size RenderWidgetHostViewMac::ConvertViewSizeToPixel(
482 const gfx::Size& size) {
483 return gfx::ToEnclosingRect(gfx::ScaleRect(gfx::Rect(size),
484 ViewScaleFactor())).size();
485 }
486
487 scoped_ptr<ResizeLock> RenderWidgetHostViewMac::CreateResizeLock(
488 bool defer_compositor_lock) {
489 NOTREACHED();
490 ResizeLock* lock = NULL;
491 return scoped_ptr<ResizeLock>(lock);
492 }
493
494 DelegatedFrameHost* RenderWidgetHostViewMac::GetDelegatedFrameHost() const {
495 return delegated_frame_host_.get();
496 }
497
498 ///////////////////////////////////////////////////////////////////////////////
396 // RenderWidgetHostViewBase, public: 499 // RenderWidgetHostViewBase, public:
397 500
398 // static 501 // static
399 void RenderWidgetHostViewBase::GetDefaultScreenInfo( 502 void RenderWidgetHostViewBase::GetDefaultScreenInfo(
400 blink::WebScreenInfo* results) { 503 blink::WebScreenInfo* results) {
401 *results = GetWebScreenInfo(NULL); 504 *results = GetWebScreenInfo(NULL);
402 } 505 }
403 506
404 /////////////////////////////////////////////////////////////////////////////// 507 ///////////////////////////////////////////////////////////////////////////////
405 // RenderWidgetHostViewMac, public: 508 // RenderWidgetHostViewMac, public:
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 } 544 }
442 545
443 render_widget_host_->SetView(this); 546 render_widget_host_->SetView(this);
444 } 547 }
445 548
446 RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { 549 RenderWidgetHostViewMac::~RenderWidgetHostViewMac() {
447 // This is being called from |cocoa_view_|'s destructor, so invalidate the 550 // This is being called from |cocoa_view_|'s destructor, so invalidate the
448 // pointer. 551 // pointer.
449 cocoa_view_ = nil; 552 cocoa_view_ = nil;
450 553
554 // Delete the delegated frame state.
555 delegated_frame_host_.reset();
556 compositor_.reset();
557 root_layer_.reset();
558
451 UnlockMouse(); 559 UnlockMouse();
452 560
453 // Make sure that the layer doesn't reach into the now-invalid object. 561 // Make sure that the layer doesn't reach into the now-invalid object.
454 DestroyCompositedIOSurfaceAndLayer(kDestroyContext); 562 DestroyCompositedIOSurfaceAndLayer(kDestroyContext);
455 DestroySoftwareLayer(); 563 DestroySoftwareLayer();
456 564
457 // We are owned by RenderWidgetHostViewCocoa, so if we go away before the 565 // We are owned by RenderWidgetHostViewCocoa, so if we go away before the
458 // RenderWidgetHost does we need to tell it not to hold a stale pointer to 566 // RenderWidgetHost does we need to tell it not to hold a stale pointer to
459 // us. 567 // us.
460 if (render_widget_host_) 568 if (render_widget_host_)
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 } 896 }
789 897
790 void RenderWidgetHostViewMac::WasShown() { 898 void RenderWidgetHostViewMac::WasShown() {
791 if (!render_widget_host_->is_hidden()) 899 if (!render_widget_host_->is_hidden())
792 return; 900 return;
793 901
794 if (web_contents_switch_paint_time_.is_null()) 902 if (web_contents_switch_paint_time_.is_null())
795 web_contents_switch_paint_time_ = base::TimeTicks::Now(); 903 web_contents_switch_paint_time_ = base::TimeTicks::Now();
796 render_widget_host_->WasShown(); 904 render_widget_host_->WasShown();
797 software_frame_manager_->SetVisibility(true); 905 software_frame_manager_->SetVisibility(true);
906 if (delegated_frame_host_)
907 delegated_frame_host_->WasShown();
798 908
799 // Call setNeedsDisplay before pausing for new frames to come in -- if any 909 // Call setNeedsDisplay before pausing for new frames to come in -- if any
800 // do, and are drawn, then the needsDisplay bit will be cleared. 910 // do, and are drawn, then the needsDisplay bit will be cleared.
801 [software_layer_ setNeedsDisplay]; 911 [software_layer_ setNeedsDisplay];
802 [compositing_iosurface_layer_ setNeedsDisplay]; 912 [compositing_iosurface_layer_ setNeedsDisplay];
803 PauseForPendingResizeOrRepaintsAndDraw(); 913 PauseForPendingResizeOrRepaintsAndDraw();
804 914
805 // We're messing with the window, so do this to ensure no flashes. 915 // We're messing with the window, so do this to ensure no flashes.
806 if (!use_core_animation_) 916 if (!use_core_animation_)
807 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; 917 [[cocoa_view_ window] disableScreenUpdatesUntilFlush];
808 } 918 }
809 919
810 void RenderWidgetHostViewMac::WasHidden() { 920 void RenderWidgetHostViewMac::WasHidden() {
811 if (render_widget_host_->is_hidden()) 921 if (render_widget_host_->is_hidden())
812 return; 922 return;
813 923
814 // Any pending frames will not be displayed until this is shown again. Ack 924 // Any pending frames will not be displayed until this is shown again. Ack
815 // them now. 925 // them now.
816 SendPendingSwapAck(); 926 SendPendingSwapAck();
817 927
818 // If we have a renderer, then inform it that we are being hidden so it can 928 // If we have a renderer, then inform it that we are being hidden so it can
819 // reduce its resource utilization. 929 // reduce its resource utilization.
820 render_widget_host_->WasHidden(); 930 render_widget_host_->WasHidden();
821 software_frame_manager_->SetVisibility(false); 931 software_frame_manager_->SetVisibility(false);
932 if (delegated_frame_host_)
933 delegated_frame_host_->WasHidden();
822 934
823 // There can be a transparent flash as this view is removed and the next is 935 // There can be a transparent flash as this view is removed and the next is
824 // added, because of OSX windowing races between displaying the contents of 936 // added, because of OSX windowing races between displaying the contents of
825 // the NSView and its corresponding OpenGL context. 937 // the NSView and its corresponding OpenGL context.
826 // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding 938 // disableScreenUpdatesUntilFlush prevents the transparent flash by avoiding
827 // screen updates until the next tab draws. 939 // screen updates until the next tab draws.
828 if (!use_core_animation_) 940 if (!use_core_animation_)
829 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; 941 [[cocoa_view_ window] disableScreenUpdatesUntilFlush];
830 942
831 web_contents_switch_paint_time_ = base::TimeTicks(); 943 web_contents_switch_paint_time_ = base::TimeTicks();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 void RenderWidgetHostViewMac::Blur() { 1025 void RenderWidgetHostViewMac::Blur() {
914 UnlockMouse(); 1026 UnlockMouse();
915 [[cocoa_view_ window] makeFirstResponder:nil]; 1027 [[cocoa_view_ window] makeFirstResponder:nil];
916 } 1028 }
917 1029
918 bool RenderWidgetHostViewMac::HasFocus() const { 1030 bool RenderWidgetHostViewMac::HasFocus() const {
919 return [[cocoa_view_ window] firstResponder] == cocoa_view_; 1031 return [[cocoa_view_ window] firstResponder] == cocoa_view_;
920 } 1032 }
921 1033
922 bool RenderWidgetHostViewMac::IsSurfaceAvailableForCopy() const { 1034 bool RenderWidgetHostViewMac::IsSurfaceAvailableForCopy() const {
1035 if (delegated_frame_host_)
1036 return delegated_frame_host_->CanCopyToBitmap();
1037
923 return software_frame_manager_->HasCurrentFrame() || 1038 return software_frame_manager_->HasCurrentFrame() ||
924 (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()); 1039 (compositing_iosurface_ && compositing_iosurface_->HasIOSurface());
925 } 1040 }
926 1041
927 void RenderWidgetHostViewMac::Show() { 1042 void RenderWidgetHostViewMac::Show() {
928 [cocoa_view_ setHidden:NO]; 1043 [cocoa_view_ setHidden:NO];
929 1044
930 WasShown(); 1045 WasShown();
931 } 1046 }
932 1047
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
1153 1268
1154 bool RenderWidgetHostViewMac::IsPopup() const { 1269 bool RenderWidgetHostViewMac::IsPopup() const {
1155 return popup_type_ != blink::WebPopupTypeNone; 1270 return popup_type_ != blink::WebPopupTypeNone;
1156 } 1271 }
1157 1272
1158 void RenderWidgetHostViewMac::CopyFromCompositingSurface( 1273 void RenderWidgetHostViewMac::CopyFromCompositingSurface(
1159 const gfx::Rect& src_subrect, 1274 const gfx::Rect& src_subrect,
1160 const gfx::Size& dst_size, 1275 const gfx::Size& dst_size,
1161 const base::Callback<void(bool, const SkBitmap&)>& callback, 1276 const base::Callback<void(bool, const SkBitmap&)>& callback,
1162 const SkBitmap::Config config) { 1277 const SkBitmap::Config config) {
1278 if (delegated_frame_host_) {
1279 delegated_frame_host_->CopyFromCompositingSurface(
1280 src_subrect, dst_size, callback, config);
1281 return;
1282 }
1283
1163 if (config != SkBitmap::kARGB_8888_Config) { 1284 if (config != SkBitmap::kARGB_8888_Config) {
1164 NOTIMPLEMENTED(); 1285 NOTIMPLEMENTED();
1165 callback.Run(false, SkBitmap()); 1286 callback.Run(false, SkBitmap());
1166 } 1287 }
1167 base::ScopedClosureRunner scoped_callback_runner( 1288 base::ScopedClosureRunner scoped_callback_runner(
1168 base::Bind(callback, false, SkBitmap())); 1289 base::Bind(callback, false, SkBitmap()));
1169 float scale = ScaleFactorForView(cocoa_view_); 1290 float scale = ScaleFactorForView(cocoa_view_);
1170 gfx::Size dst_pixel_size = gfx::ToFlooredSize( 1291 gfx::Size dst_pixel_size = gfx::ToFlooredSize(
1171 gfx::ScaleSize(dst_size, scale)); 1292 gfx::ScaleSize(dst_size, scale));
1172 if (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()) { 1293 if (compositing_iosurface_ && compositing_iosurface_->HasIOSurface()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 1331
1211 ignore_result(scoped_callback_runner.Release()); 1332 ignore_result(scoped_callback_runner.Release());
1212 callback.Run(true, target_bitmap); 1333 callback.Run(true, target_bitmap);
1213 } 1334 }
1214 } 1335 }
1215 1336
1216 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame( 1337 void RenderWidgetHostViewMac::CopyFromCompositingSurfaceToVideoFrame(
1217 const gfx::Rect& src_subrect, 1338 const gfx::Rect& src_subrect,
1218 const scoped_refptr<media::VideoFrame>& target, 1339 const scoped_refptr<media::VideoFrame>& target,
1219 const base::Callback<void(bool)>& callback) { 1340 const base::Callback<void(bool)>& callback) {
1341 if (delegated_frame_host_) {
1342 delegated_frame_host_->CopyFromCompositingSurfaceToVideoFrame(
1343 src_subrect, target, callback);
1344 return;
1345 }
1346
1220 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false)); 1347 base::ScopedClosureRunner scoped_callback_runner(base::Bind(callback, false));
1221 if (!render_widget_host_->is_accelerated_compositing_active() || 1348 if (!render_widget_host_->is_accelerated_compositing_active() ||
1222 !compositing_iosurface_ || 1349 !compositing_iosurface_ ||
1223 !compositing_iosurface_->HasIOSurface()) 1350 !compositing_iosurface_->HasIOSurface())
1224 return; 1351 return;
1225 1352
1226 if (!target.get()) { 1353 if (!target.get()) {
1227 NOTREACHED(); 1354 NOTREACHED();
1228 return; 1355 return;
1229 } 1356 }
1230 1357
1231 if (target->format() != media::VideoFrame::YV12 && 1358 if (target->format() != media::VideoFrame::YV12 &&
1232 target->format() != media::VideoFrame::I420) { 1359 target->format() != media::VideoFrame::I420) {
1233 NOTREACHED(); 1360 NOTREACHED();
1234 return; 1361 return;
1235 } 1362 }
1236 1363
1237 if (src_subrect.IsEmpty()) 1364 if (src_subrect.IsEmpty())
1238 return; 1365 return;
1239 1366
1240 ignore_result(scoped_callback_runner.Release()); 1367 ignore_result(scoped_callback_runner.Release());
1241 compositing_iosurface_->CopyToVideoFrame( 1368 compositing_iosurface_->CopyToVideoFrame(
1242 GetScaledOpenGLPixelRect(src_subrect), 1369 GetScaledOpenGLPixelRect(src_subrect),
1243 target, 1370 target,
1244 callback); 1371 callback);
1245 } 1372 }
1246 1373
1247 bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const { 1374 bool RenderWidgetHostViewMac::CanCopyToVideoFrame() const {
1375 if (delegated_frame_host_)
1376 return delegated_frame_host_->CanCopyToVideoFrame();
1377
1248 return (!software_frame_manager_->HasCurrentFrame() && 1378 return (!software_frame_manager_->HasCurrentFrame() &&
1249 render_widget_host_->is_accelerated_compositing_active() && 1379 render_widget_host_->is_accelerated_compositing_active() &&
1250 compositing_iosurface_ && 1380 compositing_iosurface_ &&
1251 compositing_iosurface_->HasIOSurface()); 1381 compositing_iosurface_->HasIOSurface());
1252 } 1382 }
1253 1383
1254 bool RenderWidgetHostViewMac::CanSubscribeFrame() const { 1384 bool RenderWidgetHostViewMac::CanSubscribeFrame() const {
1385 if (delegated_frame_host_)
1386 return delegated_frame_host_->CanSubscribeFrame();
1387
1255 return !software_frame_manager_->HasCurrentFrame(); 1388 return !software_frame_manager_->HasCurrentFrame();
1256 } 1389 }
1257 1390
1258 void RenderWidgetHostViewMac::BeginFrameSubscription( 1391 void RenderWidgetHostViewMac::BeginFrameSubscription(
1259 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) { 1392 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) {
1393 if (delegated_frame_host_) {
1394 delegated_frame_host_->BeginFrameSubscription(subscriber.Pass());
1395 return;
1396 }
1260 frame_subscriber_ = subscriber.Pass(); 1397 frame_subscriber_ = subscriber.Pass();
1261 } 1398 }
1262 1399
1263 void RenderWidgetHostViewMac::EndFrameSubscription() { 1400 void RenderWidgetHostViewMac::EndFrameSubscription() {
1401 if (delegated_frame_host_) {
1402 delegated_frame_host_->EndFrameSubscription();
1403 return;
1404 }
1405
1264 frame_subscriber_.reset(); 1406 frame_subscriber_.reset();
1265 } 1407 }
1266 1408
1267 // Sets whether or not to accept first responder status. 1409 // Sets whether or not to accept first responder status.
1268 void RenderWidgetHostViewMac::SetTakesFocusOnlyOnMouseDown(bool flag) { 1410 void RenderWidgetHostViewMac::SetTakesFocusOnlyOnMouseDown(bool flag) {
1269 [cocoa_view_ setTakesFocusOnlyOnMouseDown:flag]; 1411 [cocoa_view_ setTakesFocusOnlyOnMouseDown:flag];
1270 } 1412 }
1271 1413
1272 void RenderWidgetHostViewMac::ForwardMouseEvent(const WebMouseEvent& event) { 1414 void RenderWidgetHostViewMac::ForwardMouseEvent(const WebMouseEvent& event) {
1273 if (render_widget_host_) 1415 if (render_widget_host_)
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
1771 return (software_frame_manager_->HasCurrentFrame() && 1913 return (software_frame_manager_->HasCurrentFrame() &&
1772 (desired_size.IsEmpty() || 1914 (desired_size.IsEmpty() ||
1773 software_frame_manager_->GetCurrentFrameSizeInDIP() == 1915 software_frame_manager_->GetCurrentFrameSizeInDIP() ==
1774 desired_size)); 1916 desired_size));
1775 } 1917 }
1776 return false; 1918 return false;
1777 } 1919 }
1778 1920
1779 void RenderWidgetHostViewMac::OnSwapCompositorFrame( 1921 void RenderWidgetHostViewMac::OnSwapCompositorFrame(
1780 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { 1922 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) {
1781 // Only software compositor frames are accepted. 1923 if (frame->delegated_frame_data) {
1782 if (!frame->software_frame_data) { 1924 if (!compositor_) {
1925 compositor_.reset(new ui::Compositor(cocoa_view_));
1926 root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED));
1927 delegated_frame_host_.reset(new DelegatedFrameHost(this));
1928 }
1929
1930 delegated_frame_host_->SwapDelegatedFrame(
1931 output_surface_id,
1932 frame->delegated_frame_data.Pass(),
1933 frame->metadata.device_scale_factor,
1934 frame->metadata.latency_info);
1935
1936 gfx::Size size = ToCeiledSize(frame->metadata.viewport_size);
1937 float scale_factor = frame->metadata.page_scale_factor;
1938 if (compositor_->size() != size ||
1939 compositor_->device_scale_factor() != scale_factor) {
1940 compositor_->SetScaleAndSize(scale_factor, size);
1941 root_layer_->SetBounds(gfx::Rect(0, 0, size.width(), size.height()));
1942 }
1943 if (compositor_->root_layer() != root_layer_)
1944 compositor_->SetRootLayer(root_layer_.get());
1945 } else if (frame->software_frame_data) {
1946 if (!software_frame_manager_->SwapToNewFrame(
1947 output_surface_id,
1948 frame->software_frame_data.get(),
1949 frame->metadata.device_scale_factor,
1950 render_widget_host_->GetProcess()->GetHandle())) {
1951 render_widget_host_->GetProcess()->ReceivedBadMessage();
1952 return;
1953 }
1954
1955 // Add latency info to report when the frame finishes drawing.
1956 AddPendingLatencyInfo(frame->metadata.latency_info);
1957 GotSoftwareFrame();
1958
1959 cc::CompositorFrameAck ack;
1960 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1961 render_widget_host_->GetRoutingID(),
1962 software_frame_manager_->GetCurrentFrameOutputSurfaceId(),
1963 render_widget_host_->GetProcess()->GetID(),
1964 ack);
1965 software_frame_manager_->SwapToNewFrameComplete(
1966 !render_widget_host_->is_hidden());
1967
1968 // Notify observers, tab capture observers in particular, that a new
1969 // software frame has come in.
1970 NotificationService::current()->Notify(
1971 NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE,
1972 Source<RenderWidgetHost>(render_widget_host_),
1973 NotificationService::NoDetails());
1974 } else {
1783 DLOG(ERROR) << "Received unexpected frame type."; 1975 DLOG(ERROR) << "Received unexpected frame type.";
1784 RecordAction( 1976 RecordAction(
1785 base::UserMetricsAction("BadMessageTerminate_UnexpectedFrameType")); 1977 base::UserMetricsAction("BadMessageTerminate_UnexpectedFrameType"));
1786 render_widget_host_->GetProcess()->ReceivedBadMessage(); 1978 render_widget_host_->GetProcess()->ReceivedBadMessage();
1787 return;
1788 } 1979 }
1789
1790 if (!software_frame_manager_->SwapToNewFrame(
1791 output_surface_id,
1792 frame->software_frame_data.get(),
1793 frame->metadata.device_scale_factor,
1794 render_widget_host_->GetProcess()->GetHandle())) {
1795 render_widget_host_->GetProcess()->ReceivedBadMessage();
1796 return;
1797 }
1798
1799 // Add latency info to report when the frame finishes drawing.
1800 AddPendingLatencyInfo(frame->metadata.latency_info);
1801 GotSoftwareFrame();
1802
1803 cc::CompositorFrameAck ack;
1804 RenderWidgetHostImpl::SendSwapCompositorFrameAck(
1805 render_widget_host_->GetRoutingID(),
1806 software_frame_manager_->GetCurrentFrameOutputSurfaceId(),
1807 render_widget_host_->GetProcess()->GetID(),
1808 ack);
1809 software_frame_manager_->SwapToNewFrameComplete(
1810 !render_widget_host_->is_hidden());
1811
1812 // Notify observers, tab capture observers in particular, that a new software
1813 // frame has come in.
1814 NotificationService::current()->Notify(
1815 NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE,
1816 Source<RenderWidgetHost>(render_widget_host_),
1817 NotificationService::NoDetails());
1818 } 1980 }
1819 1981
1820 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { 1982 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() {
1821 } 1983 }
1822 1984
1823 void RenderWidgetHostViewMac::AcceleratedSurfaceInitialized(int host_id, 1985 void RenderWidgetHostViewMac::AcceleratedSurfaceInitialized(int host_id,
1824 int route_id) { 1986 int route_id) {
1825 } 1987 }
1826 1988
1827 void RenderWidgetHostViewMac::GetScreenInfo(blink::WebScreenInfo* results) { 1989 void RenderWidgetHostViewMac::GetScreenInfo(blink::WebScreenInfo* results) {
(...skipping 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after
3107 if (!renderWidgetHostView_->render_widget_host_) 3269 if (!renderWidgetHostView_->render_widget_host_)
3108 return; 3270 return;
3109 3271
3110 // Move the CALayers to their positions in the new view size. Note that 3272 // Move the CALayers to their positions in the new view size. Note that
3111 // this will not draw anything because the non-background layers' sizes 3273 // this will not draw anything because the non-background layers' sizes
3112 // didn't actually change. 3274 // didn't actually change.
3113 renderWidgetHostView_->LayoutLayers(); 3275 renderWidgetHostView_->LayoutLayers();
3114 3276
3115 renderWidgetHostView_->render_widget_host_->SendScreenRects(); 3277 renderWidgetHostView_->render_widget_host_->SendScreenRects();
3116 renderWidgetHostView_->render_widget_host_->WasResized(); 3278 renderWidgetHostView_->render_widget_host_->WasResized();
3279 if (renderWidgetHostView_->delegated_frame_host_)
3280 renderWidgetHostView_->delegated_frame_host_->WasResized();
3117 3281
3118 // Wait for the frame that WasResize might have requested. If the view is 3282 // Wait for the frame that WasResize might have requested. If the view is
3119 // being made visible at a new size, then this call will have no effect 3283 // being made visible at a new size, then this call will have no effect
3120 // because the view widget is still hidden, and the pause call in WasShown 3284 // because the view widget is still hidden, and the pause call in WasShown
3121 // will have this effect for us. 3285 // will have this effect for us.
3122 renderWidgetHostView_->PauseForPendingResizeOrRepaintsAndDraw(); 3286 renderWidgetHostView_->PauseForPendingResizeOrRepaintsAndDraw();
3123 } 3287 }
3124 3288
3125 // Fills with white the parts of the area to the right and bottom for |rect| 3289 // Fills with white the parts of the area to the right and bottom for |rect|
3126 // that intersect |damagedRect|. 3290 // that intersect |damagedRect|.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3166 height = -height; 3330 height = -height;
3167 } 3331 }
3168 3332
3169 NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)]; 3333 NSRect r = [self flipRectToNSRect:gfx::Rect(x, y, width, height)];
3170 CGContextSetFillColorWithColor(context, 3334 CGContextSetFillColorWithColor(context,
3171 CGColorGetConstantColor(kCGColorWhite)); 3335 CGColorGetConstantColor(kCGColorWhite));
3172 CGContextFillRect(context, NSRectToCGRect(r)); 3336 CGContextFillRect(context, NSRectToCGRect(r));
3173 } 3337 }
3174 } 3338 }
3175 3339
3340 - (void)onNativeSurfaceBuffersSwappedWithParams:
3341 (GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params)params {
3342
3343 renderWidgetHostView_->CompositorSwapBuffers(
3344 params.surface_handle,
3345 params.size,
3346 params.scale_factor,
3347 params.latency_info);
3348 }
3349
3176 - (void)drawRect:(NSRect)dirtyRect { 3350 - (void)drawRect:(NSRect)dirtyRect {
3177 TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect"); 3351 TRACE_EVENT0("browser", "RenderWidgetHostViewCocoa::drawRect");
3178 DCHECK(!renderWidgetHostView_->use_core_animation_); 3352 DCHECK(!renderWidgetHostView_->use_core_animation_);
3179 3353
3180 if (!renderWidgetHostView_->render_widget_host_) { 3354 if (!renderWidgetHostView_->render_widget_host_) {
3181 // When using CoreAnimation, this path is used to paint the contents area 3355 // When using CoreAnimation, this path is used to paint the contents area
3182 // white before any frames come in. When layers to draw frames exist, this 3356 // white before any frames come in. When layers to draw frames exist, this
3183 // is not hit. 3357 // is not hit.
3184 [[NSColor whiteColor] set]; 3358 [[NSColor whiteColor] set];
3185 NSRectFill(dirtyRect); 3359 NSRectFill(dirtyRect);
(...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after
4279 } 4453 }
4280 4454
4281 - (void)disableRendering { 4455 - (void)disableRendering {
4282 // Disable the fade-out animation as the layer is removed. 4456 // Disable the fade-out animation as the layer is removed.
4283 ScopedCAActionDisabler disabler; 4457 ScopedCAActionDisabler disabler;
4284 [self removeFromSuperlayer]; 4458 [self removeFromSuperlayer];
4285 renderWidgetHostView_ = nil; 4459 renderWidgetHostView_ = nil;
4286 } 4460 }
4287 4461
4288 @end // implementation SoftwareLayer 4462 @end // implementation SoftwareLayer
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_mac.h ('k') | content/common/gpu/image_transport_surface_mac.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698