Chromium Code Reviews| 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 |