| 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 #include "third_party/WebKit/public/web/mac/WebInputEventFactory.h" | 65 #include "third_party/WebKit/public/web/mac/WebInputEventFactory.h" |
| 66 #import "third_party/mozilla/ComplexTextInputPanel.h" | 66 #import "third_party/mozilla/ComplexTextInputPanel.h" |
| 67 #include "ui/base/cocoa/animation_utils.h" | 67 #include "ui/base/cocoa/animation_utils.h" |
| 68 #import "ui/base/cocoa/fullscreen_window_manager.h" | 68 #import "ui/base/cocoa/fullscreen_window_manager.h" |
| 69 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" | 69 #import "ui/base/cocoa/underlay_opengl_hosting_window.h" |
| 70 #include "ui/events/keycodes/keyboard_codes.h" | 70 #include "ui/events/keycodes/keyboard_codes.h" |
| 71 #include "ui/base/layout.h" | 71 #include "ui/base/layout.h" |
| 72 #include "ui/compositor/compositor.h" | 72 #include "ui/compositor/compositor.h" |
| 73 #include "ui/compositor/layer.h" | 73 #include "ui/compositor/layer.h" |
| 74 #include "ui/gfx/display.h" | 74 #include "ui/gfx/display.h" |
| 75 #include "ui/gfx/frame_time.h" |
| 75 #include "ui/gfx/point.h" | 76 #include "ui/gfx/point.h" |
| 76 #include "ui/gfx/rect_conversions.h" | 77 #include "ui/gfx/rect_conversions.h" |
| 77 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" | 78 #include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" |
| 78 #include "ui/gfx/screen.h" | 79 #include "ui/gfx/screen.h" |
| 79 #include "ui/gfx/size_conversions.h" | 80 #include "ui/gfx/size_conversions.h" |
| 80 #include "ui/gl/gl_switches.h" | 81 #include "ui/gl/gl_switches.h" |
| 81 | 82 |
| 82 using content::BrowserAccessibility; | 83 using content::BrowserAccessibility; |
| 83 using content::BrowserAccessibilityManager; | 84 using content::BrowserAccessibilityManager; |
| 84 using content::EditCommand; | 85 using content::EditCommand; |
| (...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 // Note that on some headless systems, the display link will fail to be | 858 // Note that on some headless systems, the display link will fail to be |
| 858 // created, so this should not be a fatal error. | 859 // created, so this should not be a fatal error. |
| 859 LOG(ERROR) << "Failed to create display link."; | 860 LOG(ERROR) << "Failed to create display link."; |
| 860 } | 861 } |
| 861 } | 862 } |
| 862 | 863 |
| 863 void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { | 864 void RenderWidgetHostViewMac::SendVSyncParametersToRenderer() { |
| 864 if (!render_widget_host_ || !display_link_) | 865 if (!render_widget_host_ || !display_link_) |
| 865 return; | 866 return; |
| 866 | 867 |
| 867 base::TimeTicks timebase; | 868 if (!display_link_->GetVSyncParameters(&vsync_timebase_, &vsync_interval_)) { |
| 868 base::TimeDelta interval; | 869 vsync_timebase_ = base::TimeTicks(); |
| 869 if (!display_link_->GetVSyncParameters(&timebase, &interval)) | 870 vsync_interval_ = base::TimeDelta(); |
| 870 return; | 871 return; |
| 872 } |
| 871 | 873 |
| 872 render_widget_host_->UpdateVSyncParameters(timebase, interval); | 874 render_widget_host_->UpdateVSyncParameters(vsync_timebase_, vsync_interval_); |
| 873 } | 875 } |
| 874 | 876 |
| 875 void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { | 877 void RenderWidgetHostViewMac::UpdateBackingStoreScaleFactor() { |
| 876 if (!render_widget_host_) | 878 if (!render_widget_host_) |
| 877 return; | 879 return; |
| 878 | 880 |
| 879 float new_scale_factor = ui::GetScaleFactorForNativeView(cocoa_view_); | 881 float new_scale_factor = ui::GetScaleFactorForNativeView(cocoa_view_); |
| 880 if (new_scale_factor == backing_store_scale_factor_) | 882 if (new_scale_factor == backing_store_scale_factor_) |
| 881 return; | 883 return; |
| 882 backing_store_scale_factor_ = new_scale_factor; | 884 backing_store_scale_factor_ = new_scale_factor; |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1421 void RenderWidgetHostViewMac::PluginImeCompositionCompleted( | 1423 void RenderWidgetHostViewMac::PluginImeCompositionCompleted( |
| 1422 const base::string16& text, int plugin_id) { | 1424 const base::string16& text, int plugin_id) { |
| 1423 if (render_widget_host_) { | 1425 if (render_widget_host_) { |
| 1424 render_widget_host_->Send(new ViewMsg_PluginImeCompositionCompleted( | 1426 render_widget_host_->Send(new ViewMsg_PluginImeCompositionCompleted( |
| 1425 render_widget_host_->GetRoutingID(), text, plugin_id)); | 1427 render_widget_host_->GetRoutingID(), text, plugin_id)); |
| 1426 } | 1428 } |
| 1427 } | 1429 } |
| 1428 | 1430 |
| 1429 void RenderWidgetHostViewMac::CompositorSwapBuffers( | 1431 void RenderWidgetHostViewMac::CompositorSwapBuffers( |
| 1430 IOSurfaceID surface_handle, | 1432 IOSurfaceID surface_handle, |
| 1433 const gfx::Rect& damage_rect, |
| 1431 const gfx::Size& size, | 1434 const gfx::Size& size, |
| 1432 float surface_scale_factor, | 1435 float surface_scale_factor, |
| 1433 const std::vector<ui::LatencyInfo>& latency_info) { | 1436 const std::vector<ui::LatencyInfo>& latency_info) { |
| 1434 // Ensure that the frame be acked unless it is explicitly passed to a | 1437 // Ensure that the frame be acked unless it is explicitly passed to a |
| 1435 // display function. | 1438 // display function. |
| 1436 base::ScopedClosureRunner scoped_ack( | 1439 base::ScopedClosureRunner scoped_ack( |
| 1437 base::Bind(&RenderWidgetHostViewMac::SendPendingSwapAck, | 1440 base::Bind(&RenderWidgetHostViewMac::SendPendingSwapAck, |
| 1438 weak_factory_.GetWeakPtr())); | 1441 weak_factory_.GetWeakPtr())); |
| 1439 | 1442 |
| 1440 if (render_widget_host_->is_hidden()) | 1443 if (render_widget_host_->is_hidden()) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1479 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; | 1482 LOG(ERROR) << "Failed SetIOSurface on CompositingIOSurfaceMac"; |
| 1480 return; | 1483 return; |
| 1481 } | 1484 } |
| 1482 } | 1485 } |
| 1483 | 1486 |
| 1484 // Grab video frames now that the IOSurface has been set up. Note that this | 1487 // Grab video frames now that the IOSurface has been set up. Note that this |
| 1485 // will be done in an offscreen context, so it is necessary to re-set the | 1488 // will be done in an offscreen context, so it is necessary to re-set the |
| 1486 // current context afterward. | 1489 // current context afterward. |
| 1487 bool frame_was_captured = false; | 1490 bool frame_was_captured = false; |
| 1488 if (frame_subscriber_) { | 1491 if (frame_subscriber_) { |
| 1489 const base::TimeTicks present_time = base::TimeTicks::Now(); | 1492 const base::TimeTicks now = gfx::FrameTime::Now(); |
| 1493 base::TimeTicks present_time; |
| 1494 if (vsync_timebase_.is_null() || vsync_interval_ <= base::TimeDelta()) { |
| 1495 present_time = now; |
| 1496 } else { |
| 1497 const int64 intervals_elapsed = (now - vsync_timebase_) / vsync_interval_; |
| 1498 present_time = vsync_timebase_ + |
| 1499 (intervals_elapsed + 1) * vsync_interval_; |
| 1500 } |
| 1501 |
| 1490 scoped_refptr<media::VideoFrame> frame; | 1502 scoped_refptr<media::VideoFrame> frame; |
| 1491 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; | 1503 RenderWidgetHostViewFrameSubscriber::DeliverFrameCallback callback; |
| 1492 if (frame_subscriber_->ShouldCaptureFrame(present_time, | 1504 if (frame_subscriber_->ShouldCaptureFrame( |
| 1493 &frame, &callback)) { | 1505 damage_rect, present_time, &frame, &callback)) { |
| 1494 // Flush the context that updated the IOSurface, to ensure that the | 1506 // Flush the context that updated the IOSurface, to ensure that the |
| 1495 // context that does the copy picks up the correct version. | 1507 // context that does the copy picks up the correct version. |
| 1496 { | 1508 { |
| 1497 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( | 1509 gfx::ScopedCGLSetCurrentContext scoped_set_current_context( |
| 1498 compositing_iosurface_context_->cgl_context()); | 1510 compositing_iosurface_context_->cgl_context()); |
| 1499 glFlush(); | 1511 glFlush(); |
| 1500 } | 1512 } |
| 1501 compositing_iosurface_->CopyToVideoFrame( | 1513 compositing_iosurface_->CopyToVideoFrame( |
| 1502 gfx::Rect(size), frame, | 1514 gfx::Rect(size), frame, |
| 1503 base::Bind(callback, present_time)); | 1515 base::Bind(callback, present_time)); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1739 gpu_host_id, | 1751 gpu_host_id, |
| 1740 compositing_iosurface_ ? | 1752 compositing_iosurface_ ? |
| 1741 compositing_iosurface_->GetRendererID() : 0); | 1753 compositing_iosurface_->GetRendererID() : 0); |
| 1742 | 1754 |
| 1743 switch (GetSurfaceHandleType(params.surface_handle)) { | 1755 switch (GetSurfaceHandleType(params.surface_handle)) { |
| 1744 case kSurfaceHandleTypeIOSurface: { | 1756 case kSurfaceHandleTypeIOSurface: { |
| 1745 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle( | 1757 IOSurfaceID io_surface_id = IOSurfaceIDFromSurfaceHandle( |
| 1746 params.surface_handle); | 1758 params.surface_handle); |
| 1747 | 1759 |
| 1748 CompositorSwapBuffers(io_surface_id, | 1760 CompositorSwapBuffers(io_surface_id, |
| 1761 gfx::Rect(), |
| 1749 params.size, | 1762 params.size, |
| 1750 params.scale_factor, | 1763 params.scale_factor, |
| 1751 params.latency_info); | 1764 params.latency_info); |
| 1752 } break; | 1765 } break; |
| 1753 case kSurfaceHandleTypeCAContext: { | 1766 case kSurfaceHandleTypeCAContext: { |
| 1754 // Disable the fade-out animation as the layer is added. | 1767 // Disable the fade-out animation as the layer is added. |
| 1755 ScopedCAActionDisabler disabler; | 1768 ScopedCAActionDisabler disabler; |
| 1756 | 1769 |
| 1757 CAContextID context_id = CAContextIDFromSurfaceHandle( | 1770 CAContextID context_id = CAContextIDFromSurfaceHandle( |
| 1758 params.surface_handle); | 1771 params.surface_handle); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1783 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, | 1796 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, |
| 1784 int gpu_host_id) { | 1797 int gpu_host_id) { |
| 1785 TRACE_EVENT0("browser", | 1798 TRACE_EVENT0("browser", |
| 1786 "RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer"); | 1799 "RenderWidgetHostViewMac::AcceleratedSurfacePostSubBuffer"); |
| 1787 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1800 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1788 | 1801 |
| 1789 AddPendingSwapAck(params.route_id, | 1802 AddPendingSwapAck(params.route_id, |
| 1790 gpu_host_id, | 1803 gpu_host_id, |
| 1791 compositing_iosurface_ ? | 1804 compositing_iosurface_ ? |
| 1792 compositing_iosurface_->GetRendererID() : 0); | 1805 compositing_iosurface_->GetRendererID() : 0); |
| 1793 CompositorSwapBuffers(IOSurfaceIDFromSurfaceHandle(params.surface_handle), | 1806 CompositorSwapBuffers( |
| 1794 params.surface_size, | 1807 IOSurfaceIDFromSurfaceHandle(params.surface_handle), |
| 1795 params.surface_scale_factor, | 1808 gfx::Rect(params.x, params.y, params.width, params.height), |
| 1796 params.latency_info); | 1809 params.surface_size, |
| 1810 params.surface_scale_factor, |
| 1811 params.latency_info); |
| 1797 } | 1812 } |
| 1798 | 1813 |
| 1799 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { | 1814 void RenderWidgetHostViewMac::AcceleratedSurfaceSuspend() { |
| 1800 if (render_widget_host_->is_hidden()) | 1815 if (render_widget_host_->is_hidden()) |
| 1801 DestroyCompositedIOSurfaceAndLayer(); | 1816 DestroyCompositedIOSurfaceAndLayer(); |
| 1802 } | 1817 } |
| 1803 | 1818 |
| 1804 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { | 1819 void RenderWidgetHostViewMac::AcceleratedSurfaceRelease() { |
| 1805 DestroyCompositedIOSurfaceAndLayer(); | 1820 DestroyCompositedIOSurfaceAndLayer(); |
| 1806 } | 1821 } |
| (...skipping 2215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4022 | 4037 |
| 4023 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding | 4038 // "-webkit-app-region: drag | no-drag" is implemented on Mac by excluding |
| 4024 // regions that are not draggable. (See ControlRegionView in | 4039 // regions that are not draggable. (See ControlRegionView in |
| 4025 // native_app_window_cocoa.mm). This requires the render host view to be | 4040 // native_app_window_cocoa.mm). This requires the render host view to be |
| 4026 // draggable by default. | 4041 // draggable by default. |
| 4027 - (BOOL)mouseDownCanMoveWindow { | 4042 - (BOOL)mouseDownCanMoveWindow { |
| 4028 return YES; | 4043 return YES; |
| 4029 } | 4044 } |
| 4030 | 4045 |
| 4031 @end | 4046 @end |
| OLD | NEW |