OLD | NEW |
---|---|
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 <OpenGL/gl.h> | 8 #include <OpenGL/gl.h> |
9 #include <QuartzCore/QuartzCore.h> | 9 #include <QuartzCore/QuartzCore.h> |
10 | 10 |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
406 ui::Layer* RenderWidgetHostViewMac::GetLayer() { | 406 ui::Layer* RenderWidgetHostViewMac::GetLayer() { |
407 return root_layer_.get(); | 407 return root_layer_.get(); |
408 } | 408 } |
409 | 409 |
410 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { | 410 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { |
411 return render_widget_host_; | 411 return render_widget_host_; |
412 } | 412 } |
413 | 413 |
414 void RenderWidgetHostViewMac::SchedulePaintInRect( | 414 void RenderWidgetHostViewMac::SchedulePaintInRect( |
415 const gfx::Rect& damage_rect_in_dip) { | 415 const gfx::Rect& damage_rect_in_dip) { |
416 // Do not paint immediately because this is being called from deep inside | |
417 // DelegatedFrameHost, and not all of its state is set up yet. | |
416 if (browser_compositor_view_) | 418 if (browser_compositor_view_) |
417 browser_compositor_view_->GetCompositor()->ScheduleFullRedraw(); | 419 browser_compositor_has_pending_paint_= true; |
piman
2014/07/07 18:27:43
nit: space before =
ccameron
2014/07/07 18:45:23
Done.
| |
420 base::MessageLoop::current()->PostTask(FROM_HERE, | |
piman
2014/07/07 18:27:43
It's better to avoid posting the task if:
- browse
ccameron
2014/07/07 18:45:23
Ah -- good point -- removed the redundant post tas
| |
421 base::Bind(&RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint, | |
422 weak_factory_.GetWeakPtr())); | |
423 } | |
424 | |
425 void RenderWidgetHostViewMac::DoBrowserCompositorPendingPaint() { | |
426 if (browser_compositor_has_pending_paint_) { | |
427 browser_compositor_view_->GetCompositor()->Draw(); | |
piman
2014/07/07 18:27:43
You'll need to check with enne wrt the interaction
ccameron
2014/07/07 18:45:23
Yeah, we had an email thread about this ... adding
| |
428 browser_compositor_has_pending_paint_ = false; | |
429 } | |
418 } | 430 } |
419 | 431 |
420 bool RenderWidgetHostViewMac::IsVisible() { | 432 bool RenderWidgetHostViewMac::IsVisible() { |
421 return !render_widget_host_->is_hidden(); | 433 return !render_widget_host_->is_hidden(); |
422 } | 434 } |
423 | 435 |
424 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { | 436 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { |
425 return GetViewBounds().size(); | 437 return GetViewBounds().size(); |
426 } | 438 } |
427 | 439 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
486 } | 498 } |
487 | 499 |
488 NSView* RenderWidgetHostViewMac::BrowserCompositorSuperview() { | 500 NSView* RenderWidgetHostViewMac::BrowserCompositorSuperview() { |
489 return cocoa_view_; | 501 return cocoa_view_; |
490 } | 502 } |
491 | 503 |
492 ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() { | 504 ui::Layer* RenderWidgetHostViewMac::BrowserCompositorRootLayer() { |
493 return root_layer_.get(); | 505 return root_layer_.get(); |
494 } | 506 } |
495 | 507 |
508 bool RenderWidgetHostViewMac::BrowserCompositorShouldDrawImmediately() { | |
509 return is_paused_for_resize_or_repaint_; | |
510 } | |
511 | |
496 /////////////////////////////////////////////////////////////////////////////// | 512 /////////////////////////////////////////////////////////////////////////////// |
497 // RenderWidgetHostViewBase, public: | 513 // RenderWidgetHostViewBase, public: |
498 | 514 |
499 // static | 515 // static |
500 void RenderWidgetHostViewBase::GetDefaultScreenInfo( | 516 void RenderWidgetHostViewBase::GetDefaultScreenInfo( |
501 blink::WebScreenInfo* results) { | 517 blink::WebScreenInfo* results) { |
502 *results = GetWebScreenInfo(NULL); | 518 *results = GetWebScreenInfo(NULL); |
503 } | 519 } |
504 | 520 |
505 /////////////////////////////////////////////////////////////////////////////// | 521 /////////////////////////////////////////////////////////////////////////////// |
506 // RenderWidgetHostViewMac, public: | 522 // RenderWidgetHostViewMac, public: |
507 | 523 |
508 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) | 524 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
509 : render_widget_host_(RenderWidgetHostImpl::From(widget)), | 525 : render_widget_host_(RenderWidgetHostImpl::From(widget)), |
510 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), | 526 text_input_type_(ui::TEXT_INPUT_TYPE_NONE), |
511 can_compose_inline_(true), | 527 can_compose_inline_(true), |
528 browser_compositor_has_pending_paint_(false), | |
512 browser_compositor_view_placeholder_( | 529 browser_compositor_view_placeholder_( |
513 new BrowserCompositorViewPlaceholderMac), | 530 new BrowserCompositorViewPlaceholderMac), |
514 pending_latency_info_delay_(0), | 531 pending_latency_info_delay_(0), |
515 pending_latency_info_delay_weak_ptr_factory_(this), | 532 pending_latency_info_delay_weak_ptr_factory_(this), |
516 backing_store_scale_factor_(1), | 533 backing_store_scale_factor_(1), |
517 is_loading_(false), | 534 is_loading_(false), |
535 is_paused_for_resize_or_repaint_(false), | |
518 weak_factory_(this), | 536 weak_factory_(this), |
519 fullscreen_parent_host_view_(NULL), | 537 fullscreen_parent_host_view_(NULL), |
520 overlay_view_weak_factory_(this), | 538 overlay_view_weak_factory_(this), |
521 software_frame_weak_ptr_factory_(this) { | 539 software_frame_weak_ptr_factory_(this) { |
522 software_frame_manager_.reset(new SoftwareFrameManager( | 540 software_frame_manager_.reset(new SoftwareFrameManager( |
523 software_frame_weak_ptr_factory_.GetWeakPtr())); | 541 software_frame_weak_ptr_factory_.GetWeakPtr())); |
524 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| | 542 // |cocoa_view_| owns us and we will be deleted when |cocoa_view_| |
525 // goes away. Since we autorelease it, our caller must put | 543 // goes away. Since we autorelease it, our caller must put |
526 // |GetNativeView()| into the view hierarchy right after calling us. | 544 // |GetNativeView()| into the view hierarchy right after calling us. |
527 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] | 545 cocoa_view_ = [[[RenderWidgetHostViewCocoa alloc] |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
633 return; | 651 return; |
634 if (browser_compositor_view_) | 652 if (browser_compositor_view_) |
635 return; | 653 return; |
636 | 654 |
637 TRACE_EVENT0("browser", | 655 TRACE_EVENT0("browser", |
638 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); | 656 "RenderWidgetHostViewMac::EnsureBrowserCompositorView"); |
639 | 657 |
640 browser_compositor_view_.reset(new BrowserCompositorViewMac(this)); | 658 browser_compositor_view_.reset(new BrowserCompositorViewMac(this)); |
641 delegated_frame_host_->AddedToWindow(); | 659 delegated_frame_host_->AddedToWindow(); |
642 delegated_frame_host_->WasShown(); | 660 delegated_frame_host_->WasShown(); |
661 RenderWidgetHelper::SetRenderWidgetIDForWidget( | |
662 browser_compositor_view_->GetView(), | |
663 render_widget_host_->GetProcess()->GetID(), | |
664 render_widget_host_->GetRoutingID()); | |
643 } | 665 } |
644 | 666 |
645 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { | 667 void RenderWidgetHostViewMac::DestroyBrowserCompositorView() { |
646 TRACE_EVENT0("browser", | 668 TRACE_EVENT0("browser", |
647 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); | 669 "RenderWidgetHostViewMac::DestroyBrowserCompositorView"); |
648 if (!browser_compositor_view_) | 670 if (!browser_compositor_view_) |
649 return; | 671 return; |
650 | 672 |
651 delegated_frame_host_->WasHidden(); | 673 delegated_frame_host_->WasHidden(); |
652 delegated_frame_host_->RemovingFromWindow(); | 674 delegated_frame_host_->RemovingFromWindow(); |
675 RenderWidgetHelper::ResetRenderWidgetIDForWidget( | |
676 browser_compositor_view_->GetView()); | |
653 browser_compositor_view_.reset(); | 677 browser_compositor_view_.reset(); |
678 browser_compositor_has_pending_paint_ = false; | |
654 } | 679 } |
655 | 680 |
656 void RenderWidgetHostViewMac::EnsureSoftwareLayer() { | 681 void RenderWidgetHostViewMac::EnsureSoftwareLayer() { |
657 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer"); | 682 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::EnsureSoftwareLayer"); |
658 if (software_layer_) | 683 if (software_layer_) |
659 return; | 684 return; |
660 | 685 |
661 software_layer_.reset([[SoftwareLayer alloc] init]); | 686 software_layer_.reset([[SoftwareLayer alloc] init]); |
662 DCHECK(software_layer_); | 687 DCHECK(software_layer_); |
663 | 688 |
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1824 if (compositing_iosurface_) { | 1849 if (compositing_iosurface_) { |
1825 return compositing_iosurface_->HasIOSurface() && | 1850 return compositing_iosurface_->HasIOSurface() && |
1826 (desired_size.IsEmpty() || | 1851 (desired_size.IsEmpty() || |
1827 compositing_iosurface_->dip_io_surface_size() == desired_size); | 1852 compositing_iosurface_->dip_io_surface_size() == desired_size); |
1828 } | 1853 } |
1829 if (software_frame_manager_->HasCurrentFrame()) { | 1854 if (software_frame_manager_->HasCurrentFrame()) { |
1830 return (desired_size.IsEmpty() || | 1855 return (desired_size.IsEmpty() || |
1831 software_frame_manager_->GetCurrentFrameSizeInDIP() == | 1856 software_frame_manager_->GetCurrentFrameSizeInDIP() == |
1832 desired_size); | 1857 desired_size); |
1833 } | 1858 } |
1859 if (browser_compositor_view_) | |
1860 return browser_compositor_view_->HasFrameWithSizeInDIP(desired_size); | |
1834 return false; | 1861 return false; |
1835 } | 1862 } |
1836 | 1863 |
1837 void RenderWidgetHostViewMac::OnSwapCompositorFrame( | 1864 void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
1838 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { | 1865 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { |
1839 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); | 1866 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); |
1840 | 1867 |
1841 if (frame->delegated_frame_data) { | 1868 if (frame->delegated_frame_data) { |
1842 float scale_factor = frame->metadata.device_scale_factor; | 1869 float scale_factor = frame->metadata.device_scale_factor; |
1843 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size); | 1870 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size); |
1844 gfx::Size pixel_size = ConvertSizeToPixel( | 1871 gfx::Size pixel_size = ConvertSizeToPixel( |
1845 scale_factor, dip_size); | 1872 scale_factor, dip_size); |
1846 root_layer_->SetBounds(gfx::Rect(dip_size)); | 1873 root_layer_->SetBounds(gfx::Rect(dip_size)); |
1847 | 1874 |
1848 if (!render_widget_host_->is_hidden()) { | 1875 if (!render_widget_host_->is_hidden()) { |
1849 EnsureBrowserCompositorView(); | 1876 EnsureBrowserCompositorView(); |
1850 browser_compositor_view_->GetCompositor()->SetScaleAndSize( | 1877 browser_compositor_view_->GetCompositor()->SetScaleAndSize( |
1851 scale_factor, pixel_size); | 1878 scale_factor, pixel_size); |
1852 } | 1879 } |
1853 | 1880 |
1854 delegated_frame_host_->SwapDelegatedFrame( | 1881 delegated_frame_host_->SwapDelegatedFrame( |
1855 output_surface_id, | 1882 output_surface_id, |
1856 frame->delegated_frame_data.Pass(), | 1883 frame->delegated_frame_data.Pass(), |
1857 frame->metadata.device_scale_factor, | 1884 frame->metadata.device_scale_factor, |
1858 frame->metadata.latency_info); | 1885 frame->metadata.latency_info); |
1886 | |
1887 DoBrowserCompositorPendingPaint(); | |
1859 } else if (frame->software_frame_data) { | 1888 } else if (frame->software_frame_data) { |
1860 if (!software_frame_manager_->SwapToNewFrame( | 1889 if (!software_frame_manager_->SwapToNewFrame( |
1861 output_surface_id, | 1890 output_surface_id, |
1862 frame->software_frame_data.get(), | 1891 frame->software_frame_data.get(), |
1863 frame->metadata.device_scale_factor, | 1892 frame->metadata.device_scale_factor, |
1864 render_widget_host_->GetProcess()->GetHandle())) { | 1893 render_widget_host_->GetProcess()->GetHandle())) { |
1865 render_widget_host_->GetProcess()->ReceivedBadMessage(); | 1894 render_widget_host_->GetProcess()->ReceivedBadMessage(); |
1866 return; | 1895 return; |
1867 } | 1896 } |
1868 | 1897 |
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2262 RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id, | 2291 RenderWidgetHostImpl::AcknowledgeBufferPresent(pending_swap_ack_->route_id, |
2263 pending_swap_ack_->gpu_host_id, | 2292 pending_swap_ack_->gpu_host_id, |
2264 ack_params); | 2293 ack_params); |
2265 pending_swap_ack_.reset(); | 2294 pending_swap_ack_.reset(); |
2266 } | 2295 } |
2267 | 2296 |
2268 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { | 2297 void RenderWidgetHostViewMac::PauseForPendingResizeOrRepaintsAndDraw() { |
2269 if (!render_widget_host_ || render_widget_host_->is_hidden()) | 2298 if (!render_widget_host_ || render_widget_host_->is_hidden()) |
2270 return; | 2299 return; |
2271 | 2300 |
2272 // Synchronized resizing does not yet work with browser compositor. | |
2273 // http://crbug.com/388005 | |
2274 if (delegated_frame_host_) | |
2275 return; | |
2276 | |
2277 // Pausing for the overlay/underlay view prevents the other one from receiving | 2301 // Pausing for the overlay/underlay view prevents the other one from receiving |
2278 // frames. This may lead to large delays, causing overlaps. | 2302 // frames. This may lead to large delays, causing overlaps. |
2279 // See crbug.com/352020. | 2303 // See crbug.com/352020. |
2280 if (underlay_view_ || overlay_view_) | 2304 if (underlay_view_ || overlay_view_) |
2281 return; | 2305 return; |
2282 | 2306 |
2283 // Ensure that all frames are acked before waiting for a frame to come in. | 2307 // Ensure that all frames are acked before waiting for a frame to come in. |
2284 // Note that we will draw a frame at the end of this function, so it is safe | 2308 // Note that we will draw a frame at the end of this function, so it is safe |
2285 // to ack a never-drawn frame here. | 2309 // to ack a never-drawn frame here. |
2286 SendPendingSwapAck(); | 2310 SendPendingSwapAck(); |
2287 | 2311 |
2288 // Wait for a frame of the right size to come in. | 2312 // Wait for a frame of the right size to come in. |
2313 is_paused_for_resize_or_repaint_ = true; | |
2289 render_widget_host_->PauseForPendingResizeOrRepaints(); | 2314 render_widget_host_->PauseForPendingResizeOrRepaints(); |
2315 is_paused_for_resize_or_repaint_ = false; | |
2290 | 2316 |
2291 // Immediately draw any frames that haven't been drawn yet. This is necessary | 2317 // Immediately draw any frames that haven't been drawn yet. This is necessary |
2292 // to keep the window and the window's contents in sync. | 2318 // to keep the window and the window's contents in sync. |
2293 [cocoa_view_ displayIfNeeded]; | 2319 [cocoa_view_ displayIfNeeded]; |
2294 [software_layer_ displayIfNeeded]; | 2320 [software_layer_ displayIfNeeded]; |
2295 [compositing_iosurface_layer_ displayIfNeeded]; | 2321 [compositing_iosurface_layer_ displayIfNeeded]; |
2296 } | 2322 } |
2297 | 2323 |
2298 void RenderWidgetHostViewMac::LayoutLayers() { | 2324 void RenderWidgetHostViewMac::LayoutLayers() { |
2299 if (delegated_frame_host_) { | 2325 if (delegated_frame_host_) { |
(...skipping 1734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4034 | 4060 |
4035 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 4061 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
4036 // regions that are not draggable. (See ControlRegionView in | 4062 // regions that are not draggable. (See ControlRegionView in |
4037 // native_app_window_cocoa.mm). This requires the render host view to be | 4063 // native_app_window_cocoa.mm). This requires the render host view to be |
4038 // draggable by default. | 4064 // draggable by default. |
4039 - (BOOL)mouseDownCanMoveWindow { | 4065 - (BOOL)mouseDownCanMoveWindow { |
4040 return YES; | 4066 return YES; |
4041 } | 4067 } |
4042 | 4068 |
4043 @end | 4069 @end |
OLD | NEW |