| 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 <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/browser_compositor_view_mac.h" | |
| 31 #include "content/browser/compositor/resize_lock.h" | 30 #include "content/browser/compositor/resize_lock.h" |
| 32 #include "content/browser/frame_host/frame_tree.h" | 31 #include "content/browser/frame_host/frame_tree.h" |
| 33 #include "content/browser/frame_host/frame_tree_node.h" | 32 #include "content/browser/frame_host/frame_tree_node.h" |
| 34 #include "content/browser/frame_host/render_frame_host_impl.h" | 33 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 35 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h" | 34 #include "content/browser/renderer_host/compositing_iosurface_context_mac.h" |
| 36 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" | 35 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" |
| 37 #include "content/browser/renderer_host/compositing_iosurface_mac.h" | 36 #include "content/browser/renderer_host/compositing_iosurface_mac.h" |
| 38 #include "content/browser/renderer_host/render_widget_helper.h" | 37 #include "content/browser/renderer_host/render_widget_helper.h" |
| 39 #include "content/browser/renderer_host/render_view_host_impl.h" | 38 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 40 #import "content/browser/renderer_host/render_widget_host_view_mac_dictionary_he
lper.h" | 39 #import "content/browser/renderer_host/render_widget_host_view_mac_dictionary_he
lper.h" |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 ui::Layer* RenderWidgetHostViewMac::GetLayer() { | 416 ui::Layer* RenderWidgetHostViewMac::GetLayer() { |
| 418 return root_layer_.get(); | 417 return root_layer_.get(); |
| 419 } | 418 } |
| 420 | 419 |
| 421 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { | 420 RenderWidgetHostImpl* RenderWidgetHostViewMac::GetHost() { |
| 422 return render_widget_host_; | 421 return render_widget_host_; |
| 423 } | 422 } |
| 424 | 423 |
| 425 void RenderWidgetHostViewMac::SchedulePaintInRect( | 424 void RenderWidgetHostViewMac::SchedulePaintInRect( |
| 426 const gfx::Rect& damage_rect_in_dip) { | 425 const gfx::Rect& damage_rect_in_dip) { |
| 427 [browser_compositor_view_ compositor]->Draw(); | 426 if (browser_compositor_lock_) |
| 427 browser_compositor_damaged_during_lock_ = true; |
| 428 else |
| 429 [browser_compositor_view_ compositor]->ScheduleFullRedraw(); |
| 430 } |
| 431 |
| 432 void RenderWidgetHostViewMac::DelegatedCompositorDidSwapBuffers() { |
| 433 // If this view is not visible then do not lock the compositor, because the |
| 434 // wait for the surface to be drawn will time out. |
| 435 NSWindow* window = [cocoa_view_ window]; |
| 436 if (!window) |
| 437 return; |
| 438 if (window && [window respondsToSelector:@selector(occlusionState)]) { |
| 439 bool window_is_occluded = |
| 440 !([window occlusionState] & NSWindowOcclusionStateVisible); |
| 441 if (window_is_occluded) |
| 442 return; |
| 443 } |
| 444 browser_compositor_lock_ = |
| 445 [browser_compositor_view_ compositor]->GetCompositorLock(); |
| 446 } |
| 447 |
| 448 void RenderWidgetHostViewMac::DelegatedCompositorAbortedSwapBuffers() { |
| 449 PostReleaseBrowserCompositorLock(); |
| 428 } | 450 } |
| 429 | 451 |
| 430 bool RenderWidgetHostViewMac::IsVisible() { | 452 bool RenderWidgetHostViewMac::IsVisible() { |
| 431 return !render_widget_host_->is_hidden(); | 453 return !render_widget_host_->is_hidden(); |
| 432 } | 454 } |
| 433 | 455 |
| 434 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { | 456 gfx::Size RenderWidgetHostViewMac::DesiredFrameSize() { |
| 435 return GetViewBounds().size(); | 457 return GetViewBounds().size(); |
| 436 } | 458 } |
| 437 | 459 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 } | 524 } |
| 503 | 525 |
| 504 render_widget_host_->SetView(this); | 526 render_widget_host_->SetView(this); |
| 505 } | 527 } |
| 506 | 528 |
| 507 RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { | 529 RenderWidgetHostViewMac::~RenderWidgetHostViewMac() { |
| 508 // This is being called from |cocoa_view_|'s destructor, so invalidate the | 530 // This is being called from |cocoa_view_|'s destructor, so invalidate the |
| 509 // pointer. | 531 // pointer. |
| 510 cocoa_view_ = nil; | 532 cocoa_view_ = nil; |
| 511 | 533 |
| 512 // Delete the delegated frame state. | |
| 513 delegated_frame_host_.reset(); | |
| 514 root_layer_.reset(); | |
| 515 | |
| 516 UnlockMouse(); | 534 UnlockMouse(); |
| 517 | 535 |
| 518 // Make sure that the layer doesn't reach into the now-invalid object. | 536 // Make sure that the layer doesn't reach into the now-invalid object. |
| 519 DestroyCompositedIOSurfaceAndLayer(kDestroyContext); | 537 DestroyCompositedIOSurfaceAndLayer(kDestroyContext); |
| 520 DestroySoftwareLayer(); | 538 DestroySoftwareLayer(); |
| 521 | 539 |
| 522 // We are owned by RenderWidgetHostViewCocoa, so if we go away before the | 540 // We are owned by RenderWidgetHostViewCocoa, so if we go away before the |
| 523 // RenderWidgetHost does we need to tell it not to hold a stale pointer to | 541 // RenderWidgetHost does we need to tell it not to hold a stale pointer to |
| 524 // us. | 542 // us. |
| 525 if (render_widget_host_) | 543 if (render_widget_host_) |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 817 CGDirectDisplayID display_id = [screen_number unsignedIntValue]; | 835 CGDirectDisplayID display_id = [screen_number unsignedIntValue]; |
| 818 | 836 |
| 819 display_link_ = DisplayLinkMac::GetForDisplay(display_id); | 837 display_link_ = DisplayLinkMac::GetForDisplay(display_id); |
| 820 if (!display_link_) { | 838 if (!display_link_) { |
| 821 // Note that on some headless systems, the display link will fail to be | 839 // Note that on some headless systems, the display link will fail to be |
| 822 // created, so this should not be a fatal error. | 840 // created, so this should not be a fatal error. |
| 823 LOG(ERROR) << "Failed to create display link."; | 841 LOG(ERROR) << "Failed to create display link."; |
| 824 } | 842 } |
| 825 } | 843 } |
| 826 | 844 |
| 845 void RenderWidgetHostViewMac::PostReleaseBrowserCompositorLock() { |
| 846 base::MessageLoop::current()->PostTask(FROM_HERE, |
| 847 base::Bind(&RenderWidgetHostViewMac::ReleaseBrowserCompositorLock, |
| 848 weak_factory_.GetWeakPtr())); |
| 849 } |
| 850 |
| 851 void RenderWidgetHostViewMac::ReleaseBrowserCompositorLock() { |
| 852 if (!browser_compositor_view_) |
| 853 return; |
| 854 |
| 855 browser_compositor_lock_ = NULL; |
| 856 if (browser_compositor_damaged_during_lock_) { |
| 857 browser_compositor_damaged_during_lock_ = false; |
| 858 [browser_compositor_view_ compositor]->ScheduleFullRedraw(); |
| 859 } |
| 860 } |
| 861 |
| 827 void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { | 862 void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { |
| 828 if (!render_widget_host_ || !display_link_) | 863 if (!render_widget_host_ || !display_link_) |
| 829 return; | 864 return; |
| 830 | 865 |
| 831 base::TimeTicks timebase; | 866 base::TimeTicks timebase; |
| 832 base::TimeDelta interval; | 867 base::TimeDelta interval; |
| 833 if (!display_link_->GetVSyncParameters(&timebase, &interval)) | 868 if (!display_link_->GetVSyncParameters(&timebase, &interval)) |
| 834 return; | 869 return; |
| 835 | 870 |
| 836 render_widget_host_->UpdateVSyncParameters(timebase, interval); | 871 render_widget_host_->UpdateVSyncParameters(timebase, interval); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; | 908 [[cocoa_view_ window] disableScreenUpdatesUntilFlush]; |
| 874 } | 909 } |
| 875 | 910 |
| 876 void RenderWidgetHostViewMac::WasHidden() { | 911 void RenderWidgetHostViewMac::WasHidden() { |
| 877 if (render_widget_host_->is_hidden()) | 912 if (render_widget_host_->is_hidden()) |
| 878 return; | 913 return; |
| 879 | 914 |
| 880 // Any pending frames will not be displayed until this is shown again. Ack | 915 // Any pending frames will not be displayed until this is shown again. Ack |
| 881 // them now. | 916 // them now. |
| 882 SendPendingSwapAck(); | 917 SendPendingSwapAck(); |
| 918 PostReleaseBrowserCompositorLock(); |
| 883 | 919 |
| 884 // If we have a renderer, then inform it that we are being hidden so it can | 920 // If we have a renderer, then inform it that we are being hidden so it can |
| 885 // reduce its resource utilization. | 921 // reduce its resource utilization. |
| 886 render_widget_host_->WasHidden(); | 922 render_widget_host_->WasHidden(); |
| 887 software_frame_manager_->SetVisibility(false); | 923 software_frame_manager_->SetVisibility(false); |
| 888 if (delegated_frame_host_) | 924 if (delegated_frame_host_) |
| 889 delegated_frame_host_->WasHidden(); | 925 delegated_frame_host_->WasHidden(); |
| 890 | 926 |
| 891 // There can be a transparent flash as this view is removed and the next is | 927 // There can be a transparent flash as this view is removed and the next is |
| 892 // added, because of OSX windowing races between displaying the contents of | 928 // added, because of OSX windowing races between displaying the contents of |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 | 1133 |
| 1098 [fullscreen_window_manager_ exitFullscreenMode]; | 1134 [fullscreen_window_manager_ exitFullscreenMode]; |
| 1099 fullscreen_window_manager_.reset(); | 1135 fullscreen_window_manager_.reset(); |
| 1100 [pepper_fullscreen_window_ close]; | 1136 [pepper_fullscreen_window_ close]; |
| 1101 | 1137 |
| 1102 // This can be called as part of processing the window's responder | 1138 // This can be called as part of processing the window's responder |
| 1103 // chain, for instance |-performKeyEquivalent:|. In that case the | 1139 // chain, for instance |-performKeyEquivalent:|. In that case the |
| 1104 // object needs to survive until the stack unwinds. | 1140 // object needs to survive until the stack unwinds. |
| 1105 pepper_fullscreen_window_.autorelease(); | 1141 pepper_fullscreen_window_.autorelease(); |
| 1106 | 1142 |
| 1143 // Delete the delegated frame state, which will reach back into |
| 1144 // render_widget_host_. |
| 1145 browser_compositor_lock_ = NULL; |
| 1146 [browser_compositor_view_ resetClient]; |
| 1147 delegated_frame_host_.reset(); |
| 1148 root_layer_.reset(); |
| 1149 |
| 1107 // We get this call just before |render_widget_host_| deletes | 1150 // We get this call just before |render_widget_host_| deletes |
| 1108 // itself. But we are owned by |cocoa_view_|, which may be retained | 1151 // itself. But we are owned by |cocoa_view_|, which may be retained |
| 1109 // by some other code. Examples are WebContentsViewMac's | 1152 // by some other code. Examples are WebContentsViewMac's |
| 1110 // |latent_focus_view_| and TabWindowController's | 1153 // |latent_focus_view_| and TabWindowController's |
| 1111 // |cachedContentView_|. | 1154 // |cachedContentView_|. |
| 1112 render_widget_host_ = NULL; | 1155 render_widget_host_ = NULL; |
| 1113 } | 1156 } |
| 1114 | 1157 |
| 1115 // Called from the renderer to tell us what the tooltip text should be. It | 1158 // Called from the renderer to tell us what the tooltip text should be. It |
| 1116 // calls us frequently so we need to cache the value to prevent doing a lot | 1159 // calls us frequently so we need to cache the value to prevent doing a lot |
| (...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1885 } | 1928 } |
| 1886 return false; | 1929 return false; |
| 1887 } | 1930 } |
| 1888 | 1931 |
| 1889 void RenderWidgetHostViewMac::OnSwapCompositorFrame( | 1932 void RenderWidgetHostViewMac::OnSwapCompositorFrame( |
| 1890 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { | 1933 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) { |
| 1891 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); | 1934 TRACE_EVENT0("browser", "RenderWidgetHostViewMac::OnSwapCompositorFrame"); |
| 1892 | 1935 |
| 1893 if (frame->delegated_frame_data) { | 1936 if (frame->delegated_frame_data) { |
| 1894 if (!browser_compositor_view_) { | 1937 if (!browser_compositor_view_) { |
| 1895 browser_compositor_view_.reset( | 1938 browser_compositor_view_.reset([[BrowserCompositorViewMac alloc] |
| 1896 [[BrowserCompositorViewMac alloc] initWithSuperview:cocoa_view_]); | 1939 initWithSuperview:cocoa_view_ withClient:this]); |
| 1897 root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED)); | 1940 root_layer_.reset(new ui::Layer(ui::LAYER_TEXTURED)); |
| 1898 delegated_frame_host_.reset(new DelegatedFrameHost(this)); | 1941 delegated_frame_host_.reset(new DelegatedFrameHost(this)); |
| 1899 [browser_compositor_view_ compositor]->SetRootLayer(root_layer_.get()); | 1942 [browser_compositor_view_ compositor]->SetRootLayer(root_layer_.get()); |
| 1900 } | 1943 } |
| 1901 | 1944 |
| 1902 float scale_factor = frame->metadata.device_scale_factor; | 1945 float scale_factor = frame->metadata.device_scale_factor; |
| 1903 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size); | 1946 gfx::Size dip_size = ToCeiledSize(frame->metadata.viewport_size); |
| 1904 gfx::Size pixel_size = ConvertSizeToPixel( | 1947 gfx::Size pixel_size = ConvertSizeToPixel( |
| 1905 scale_factor, dip_size); | 1948 scale_factor, dip_size); |
| 1906 [browser_compositor_view_ compositor]->SetScaleAndSize( | 1949 [browser_compositor_view_ compositor]->SetScaleAndSize( |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2464 [software_layer_ setFrame:new_background_frame]; | 2507 [software_layer_ setFrame:new_background_frame]; |
| 2465 } | 2508 } |
| 2466 } | 2509 } |
| 2467 } | 2510 } |
| 2468 | 2511 |
| 2469 SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() { | 2512 SkBitmap::Config RenderWidgetHostViewMac::PreferredReadbackFormat() { |
| 2470 return SkBitmap::kARGB_8888_Config; | 2513 return SkBitmap::kARGB_8888_Config; |
| 2471 } | 2514 } |
| 2472 | 2515 |
| 2473 //////////////////////////////////////////////////////////////////////////////// | 2516 //////////////////////////////////////////////////////////////////////////////// |
| 2517 // BrowserCompositorViewMacClient, public: |
| 2518 |
| 2519 void RenderWidgetHostViewMac::BrowserCompositorDidDrawFrame() { |
| 2520 PostReleaseBrowserCompositorLock(); |
| 2521 } |
| 2522 |
| 2523 //////////////////////////////////////////////////////////////////////////////// |
| 2474 // CompositingIOSurfaceLayerClient, public: | 2524 // CompositingIOSurfaceLayerClient, public: |
| 2475 | 2525 |
| 2476 void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { | 2526 void RenderWidgetHostViewMac::AcceleratedLayerDidDrawFrame(bool succeeded) { |
| 2477 SendPendingLatencyInfoToHost(); | 2527 SendPendingLatencyInfoToHost(); |
| 2478 SendPendingSwapAck(); | 2528 SendPendingSwapAck(); |
| 2479 if (!succeeded) | 2529 if (!succeeded) |
| 2480 GotAcceleratedCompositingError(); | 2530 GotAcceleratedCompositingError(); |
| 2481 } | 2531 } |
| 2482 | 2532 |
| 2483 } // namespace content | 2533 } // namespace content |
| (...skipping 1890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4374 | 4424 |
| 4375 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 4425 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
| 4376 // regions that are not draggable. (See ControlRegionView in | 4426 // regions that are not draggable. (See ControlRegionView in |
| 4377 // native_app_window_cocoa.mm). This requires the render host view to be | 4427 // native_app_window_cocoa.mm). This requires the render host view to be |
| 4378 // draggable by default. | 4428 // draggable by default. |
| 4379 - (BOOL)mouseDownCanMoveWindow { | 4429 - (BOOL)mouseDownCanMoveWindow { |
| 4380 return YES; | 4430 return YES; |
| 4381 } | 4431 } |
| 4382 | 4432 |
| 4383 @end | 4433 @end |
| OLD | NEW |