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 #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ | 5 #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ |
6 #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ | 6 #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ |
7 | 7 |
8 #import <Cocoa/Cocoa.h> | 8 #import <Cocoa/Cocoa.h> |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
11 #include <string> | 11 #include <string> |
12 #include <utility> | 12 #include <utility> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/mac/scoped_nsobject.h" | 15 #include "base/mac/scoped_nsobject.h" |
16 #include "base/memory/scoped_ptr.h" | 16 #include "base/memory/scoped_ptr.h" |
17 #include "base/memory/weak_ptr.h" | 17 #include "base/memory/weak_ptr.h" |
18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
19 #include "content/browser/compositor/delegated_frame_host.h" | 19 #include "content/browser/compositor/delegated_frame_host.h" |
| 20 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" |
20 #include "content/browser/renderer_host/display_link_mac.h" | 21 #include "content/browser/renderer_host/display_link_mac.h" |
21 #include "content/browser/renderer_host/render_widget_host_view_base.h" | 22 #include "content/browser/renderer_host/render_widget_host_view_base.h" |
22 #include "content/browser/renderer_host/software_frame_manager.h" | 23 #include "content/browser/renderer_host/software_frame_manager.h" |
23 #include "content/common/content_export.h" | 24 #include "content/common/content_export.h" |
24 #include "content/common/cursors/webcursor.h" | 25 #include "content/common/cursors/webcursor.h" |
25 #include "content/common/edit_command.h" | 26 #include "content/common/edit_command.h" |
26 #import "content/public/browser/render_widget_host_view_mac_base.h" | 27 #import "content/public/browser/render_widget_host_view_mac_base.h" |
27 #include "ipc/ipc_sender.h" | 28 #include "ipc/ipc_sender.h" |
28 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" | 29 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" |
29 #include "ui/base/cocoa/base_view.h" | 30 #include "ui/base/cocoa/base_view.h" |
30 | 31 |
31 namespace content { | 32 namespace content { |
32 class CompositingIOSurfaceMac; | 33 class CompositingIOSurfaceMac; |
33 class CompositingIOSurfaceContext; | 34 class CompositingIOSurfaceContext; |
34 class RenderWidgetHostViewMac; | 35 class RenderWidgetHostViewMac; |
35 class RenderWidgetHostViewMacEditCommandHelper; | 36 class RenderWidgetHostViewMacEditCommandHelper; |
36 class WebContents; | 37 class WebContents; |
37 } | 38 } |
38 | 39 |
39 namespace ui { | 40 namespace ui { |
40 class Compositor; | 41 class Compositor; |
41 class Layer; | 42 class Layer; |
42 } | 43 } |
43 | 44 |
| 45 @class BrowserCompositorViewMac; |
44 @class CompositingIOSurfaceLayer; | 46 @class CompositingIOSurfaceLayer; |
45 @class FullscreenWindowManager; | 47 @class FullscreenWindowManager; |
46 @protocol RenderWidgetHostViewMacDelegate; | 48 @protocol RenderWidgetHostViewMacDelegate; |
| 49 @class SoftwareLayer; |
47 @class ToolTip; | 50 @class ToolTip; |
48 | 51 |
49 @protocol RenderWidgetHostViewMacOwner | 52 @protocol RenderWidgetHostViewMacOwner |
50 - (content::RenderWidgetHostViewMac*)renderWidgetHostViewMac; | 53 - (content::RenderWidgetHostViewMac*)renderWidgetHostViewMac; |
51 @end | 54 @end |
52 | 55 |
53 // This is the view that lives in the Cocoa view hierarchy. In Windows-land, | 56 // This is the view that lives in the Cocoa view hierarchy. In Windows-land, |
54 // RenderWidgetHostViewWin is both the view and the delegate. We split the roles | 57 // RenderWidgetHostViewWin is both the view and the delegate. We split the roles |
55 // but that means that the view needs to own the delegate and will dispose of it | 58 // but that means that the view needs to own the delegate and will dispose of it |
56 // when it's removed from the view system. | 59 // when it's removed from the view system. |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 // Updates the current plugin focus state. | 182 // Updates the current plugin focus state. |
180 - (void)pluginFocusChanged:(BOOL)focused forPlugin:(int)pluginId; | 183 - (void)pluginFocusChanged:(BOOL)focused forPlugin:(int)pluginId; |
181 // Evaluates the event in the context of plugin IME, if plugin IME is enabled. | 184 // Evaluates the event in the context of plugin IME, if plugin IME is enabled. |
182 // Returns YES if the event was handled. | 185 // Returns YES if the event was handled. |
183 - (BOOL)postProcessEventForPluginIme:(NSEvent*)event; | 186 - (BOOL)postProcessEventForPluginIme:(NSEvent*)event; |
184 - (void)updateCursor:(NSCursor*)cursor; | 187 - (void)updateCursor:(NSCursor*)cursor; |
185 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange | 188 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange |
186 actualRange:(NSRangePointer)actualRange; | 189 actualRange:(NSRangePointer)actualRange; |
187 @end | 190 @end |
188 | 191 |
189 @interface SoftwareLayer : CALayer | |
190 | |
191 - (id)init; | |
192 | |
193 - (void)setContentsToData:(const void *)data | |
194 withRowBytes:(size_t)rowBytes | |
195 withPixelSize:(gfx::Size)pixelSize | |
196 withScaleFactor:(float)scaleFactor; | |
197 | |
198 // Remove the layer from the layer hierarchy. | |
199 - (void)disableRendering; | |
200 | |
201 @end | |
202 | |
203 namespace content { | 192 namespace content { |
204 class RenderWidgetHostImpl; | 193 class RenderWidgetHostImpl; |
205 | 194 |
206 /////////////////////////////////////////////////////////////////////////////// | 195 /////////////////////////////////////////////////////////////////////////////// |
207 // RenderWidgetHostViewMac | 196 // RenderWidgetHostViewMac |
208 // | 197 // |
209 // An object representing the "View" of a rendered web page. This object is | 198 // An object representing the "View" of a rendered web page. This object is |
210 // responsible for displaying the content of the web page, and integrating with | 199 // responsible for displaying the content of the web page, and integrating with |
211 // the Cocoa view system. It is the implementation of the RenderWidgetHostView | 200 // the Cocoa view system. It is the implementation of the RenderWidgetHostView |
212 // that the cross-platform RenderWidgetHost object uses | 201 // that the cross-platform RenderWidgetHost object uses |
213 // to display the data. | 202 // to display the data. |
214 // | 203 // |
215 // Comment excerpted from render_widget_host.h: | 204 // Comment excerpted from render_widget_host.h: |
216 // | 205 // |
217 // "The lifetime of the RenderWidgetHost* is tied to the render process. | 206 // "The lifetime of the RenderWidgetHost* is tied to the render process. |
218 // If the render process dies, the RenderWidgetHost* goes away and all | 207 // If the render process dies, the RenderWidgetHost* goes away and all |
219 // references to it must become NULL." | 208 // references to it must become NULL." |
220 // | 209 // |
221 // RenderWidgetHostView class hierarchy described in render_widget_host_view.h. | 210 // RenderWidgetHostView class hierarchy described in render_widget_host_view.h. |
222 class CONTENT_EXPORT RenderWidgetHostViewMac | 211 class CONTENT_EXPORT RenderWidgetHostViewMac |
223 : public RenderWidgetHostViewBase, | 212 : public RenderWidgetHostViewBase, |
224 public DelegatedFrameHostClient, | 213 public DelegatedFrameHostClient, |
225 public IPC::Sender, | 214 public IPC::Sender, |
226 public SoftwareFrameManagerClient { | 215 public SoftwareFrameManagerClient, |
| 216 public CompositingIOSurfaceLayerClient { |
227 public: | 217 public: |
228 // The view will associate itself with the given widget. The native view must | 218 // The view will associate itself with the given widget. The native view must |
229 // be hooked up immediately to the view hierarchy, or else when it is | 219 // be hooked up immediately to the view hierarchy, or else when it is |
230 // deleted it will delete this out from under the caller. | 220 // deleted it will delete this out from under the caller. |
231 explicit RenderWidgetHostViewMac(RenderWidgetHost* widget); | 221 explicit RenderWidgetHostViewMac(RenderWidgetHost* widget); |
232 virtual ~RenderWidgetHostViewMac(); | 222 virtual ~RenderWidgetHostViewMac(); |
233 | 223 |
234 RenderWidgetHostViewCocoa* cocoa_view() const { return cocoa_view_; } | 224 RenderWidgetHostViewCocoa* cocoa_view() const { return cocoa_view_; } |
235 | 225 |
236 // |delegate| is used to separate out the logic from the NSResponder delegate. | 226 // |delegate| is used to separate out the logic from the NSResponder delegate. |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 // IPC::Sender implementation. | 336 // IPC::Sender implementation. |
347 virtual bool Send(IPC::Message* message) OVERRIDE; | 337 virtual bool Send(IPC::Message* message) OVERRIDE; |
348 | 338 |
349 // SoftwareFrameManagerClient implementation: | 339 // SoftwareFrameManagerClient implementation: |
350 virtual void SoftwareFrameWasFreed( | 340 virtual void SoftwareFrameWasFreed( |
351 uint32 output_surface_id, unsigned frame_id) OVERRIDE; | 341 uint32 output_surface_id, unsigned frame_id) OVERRIDE; |
352 virtual void ReleaseReferencesToSoftwareFrame() OVERRIDE; | 342 virtual void ReleaseReferencesToSoftwareFrame() OVERRIDE; |
353 | 343 |
354 virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE; | 344 virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE; |
355 | 345 |
| 346 // CompositingIOSurfaceLayerClient implementation. |
| 347 virtual void AcceleratedLayerDidDrawFrame(bool succeeded) OVERRIDE; |
| 348 virtual bool AcceleratedLayerHasNotAckedPendingFrame() const OVERRIDE; |
| 349 |
356 // Forwards the mouse event to the renderer. | 350 // Forwards the mouse event to the renderer. |
357 void ForwardMouseEvent(const blink::WebMouseEvent& event); | 351 void ForwardMouseEvent(const blink::WebMouseEvent& event); |
358 | 352 |
359 void KillSelf(); | 353 void KillSelf(); |
360 | 354 |
361 void SetTextInputActive(bool active); | 355 void SetTextInputActive(bool active); |
362 | 356 |
363 // Sends completed plugin IME notification and text back to the renderer. | 357 // Sends completed plugin IME notification and text back to the renderer. |
364 void PluginImeCompositionCompleted(const base::string16& text, int plugin_id); | 358 void PluginImeCompositionCompleted(const base::string16& text, int plugin_id); |
365 | 359 |
366 const std::string& selected_text() const { return selected_text_; } | 360 const std::string& selected_text() const { return selected_text_; } |
367 | 361 |
368 // Update the IOSurface to be drawn and call setNeedsDisplay on | 362 // Update the IOSurface to be drawn and call setNeedsDisplay on |
369 // |cocoa_view_|. | 363 // |cocoa_view_|. |
370 void CompositorSwapBuffers(uint64 surface_handle, | 364 void CompositorSwapBuffers(uint64 surface_handle, |
371 const gfx::Size& size, | 365 const gfx::Size& size, |
372 float scale_factor, | 366 float scale_factor, |
373 const std::vector<ui::LatencyInfo>& latency_info); | 367 const std::vector<ui::LatencyInfo>& latency_info); |
374 | 368 |
375 void GotBrowserCompositorSoftwareFrame(cc::SoftwareFrameData* frame_data, | |
376 float scale_factor, | |
377 SkCanvas* canvas); | |
378 | |
379 // Draw the IOSurface by making its context current to this view. | 369 // Draw the IOSurface by making its context current to this view. |
380 void DrawIOSurfaceWithoutCoreAnimation(); | 370 void DrawIOSurfaceWithoutCoreAnimation(); |
381 | 371 |
382 // Called when a GPU error is detected. Posts a task to destroy all | 372 // Called when a GPU error is detected. Posts a task to destroy all |
383 // compositing state. | 373 // compositing state. |
384 void GotAcceleratedCompositingError(); | 374 void GotAcceleratedCompositingError(); |
385 | 375 |
386 // Sets the overlay view, which should be drawn in the same IOSurface | 376 // Sets the overlay view, which should be drawn in the same IOSurface |
387 // atop of this view, if both views are drawing accelerated content. | 377 // atop of this view, if both views are drawing accelerated content. |
388 // Overlay is stored as a weak ptr. | 378 // Overlay is stored as a weak ptr. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 // The compositing or software layers will be added as sublayers to this. | 434 // The compositing or software layers will be added as sublayers to this. |
445 base::scoped_nsobject<CALayer> background_layer_; | 435 base::scoped_nsobject<CALayer> background_layer_; |
446 | 436 |
447 // The CoreAnimation layer for software compositing. This should be NULL | 437 // The CoreAnimation layer for software compositing. This should be NULL |
448 // when software compositing is not in use. | 438 // when software compositing is not in use. |
449 base::scoped_nsobject<SoftwareLayer> software_layer_; | 439 base::scoped_nsobject<SoftwareLayer> software_layer_; |
450 | 440 |
451 // Accelerated compositing structures. These may be dynamically created and | 441 // Accelerated compositing structures. These may be dynamically created and |
452 // destroyed together in Create/DestroyCompositedIOSurfaceAndLayer. | 442 // destroyed together in Create/DestroyCompositedIOSurfaceAndLayer. |
453 base::scoped_nsobject<CompositingIOSurfaceLayer> compositing_iosurface_layer_; | 443 base::scoped_nsobject<CompositingIOSurfaceLayer> compositing_iosurface_layer_; |
454 scoped_ptr<CompositingIOSurfaceMac> compositing_iosurface_; | 444 scoped_refptr<CompositingIOSurfaceMac> compositing_iosurface_; |
455 scoped_refptr<CompositingIOSurfaceContext> compositing_iosurface_context_; | 445 scoped_refptr<CompositingIOSurfaceContext> compositing_iosurface_context_; |
456 | 446 |
457 // Timer used to dynamically transition the compositing layer in and out of | |
458 // asynchronous mode. | |
459 base::DelayTimer<RenderWidgetHostViewMac> | |
460 compositing_iosurface_layer_async_timer_; | |
461 | |
462 // Delegated frame management and compositior. | 447 // Delegated frame management and compositior. |
| 448 base::scoped_nsobject<BrowserCompositorViewMac> browser_compositor_view_; |
463 scoped_ptr<DelegatedFrameHost> delegated_frame_host_; | 449 scoped_ptr<DelegatedFrameHost> delegated_frame_host_; |
464 scoped_ptr<ui::Compositor> compositor_; | |
465 scoped_ptr<ui::Layer> root_layer_; | 450 scoped_ptr<ui::Layer> root_layer_; |
466 | 451 |
467 // This holds the current software compositing framebuffer, if any. | 452 // This holds the current software compositing framebuffer, if any. |
468 scoped_ptr<SoftwareFrameManager> software_frame_manager_; | 453 scoped_ptr<SoftwareFrameManager> software_frame_manager_; |
469 | 454 |
470 // Whether to allow overlapping views. | 455 // Whether to allow overlapping views. |
471 bool allow_overlapping_views_; | 456 bool allow_overlapping_views_; |
472 | 457 |
473 // Whether to use the CoreAnimation path to draw content. | 458 // Whether to use the CoreAnimation path to draw content. |
474 bool use_core_animation_; | 459 bool use_core_animation_; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 void SendPendingSwapAck(); | 506 void SendPendingSwapAck(); |
522 | 507 |
523 void PauseForPendingResizeOrRepaintsAndDraw(); | 508 void PauseForPendingResizeOrRepaintsAndDraw(); |
524 | 509 |
525 // The geometric arrangement of the layers depends on cocoa_view's size, the | 510 // The geometric arrangement of the layers depends on cocoa_view's size, the |
526 // compositing IOSurface's rounded size, and the software frame size. Update | 511 // compositing IOSurface's rounded size, and the software frame size. Update |
527 // all of them using this function when any of those parameters changes. Also | 512 // all of them using this function when any of those parameters changes. Also |
528 // update the scale factor of the layers. | 513 // update the scale factor of the layers. |
529 void LayoutLayers(); | 514 void LayoutLayers(); |
530 | 515 |
531 bool HasPendingSwapAck() const { return pending_swap_ack_; } | |
532 | |
533 // DelegatedFrameHostClient implementation. | 516 // DelegatedFrameHostClient implementation. |
534 virtual ui::Compositor* GetCompositor() const OVERRIDE; | 517 virtual ui::Compositor* GetCompositor() const OVERRIDE; |
535 virtual ui::Layer* GetLayer() OVERRIDE; | 518 virtual ui::Layer* GetLayer() OVERRIDE; |
536 virtual RenderWidgetHostImpl* GetHost() OVERRIDE; | 519 virtual RenderWidgetHostImpl* GetHost() OVERRIDE; |
537 virtual void SchedulePaintInRect( | 520 virtual void SchedulePaintInRect( |
538 const gfx::Rect& damage_rect_in_dip) OVERRIDE; | 521 const gfx::Rect& damage_rect_in_dip) OVERRIDE; |
539 virtual bool IsVisible() OVERRIDE; | 522 virtual bool IsVisible() OVERRIDE; |
540 virtual scoped_ptr<ResizeLock> CreateResizeLock( | 523 virtual scoped_ptr<ResizeLock> CreateResizeLock( |
541 bool defer_compositor_lock) OVERRIDE; | 524 bool defer_compositor_lock) OVERRIDE; |
542 virtual gfx::Size DesiredFrameSize() OVERRIDE; | 525 virtual gfx::Size DesiredFrameSize() OVERRIDE; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 | 571 |
589 // Unbind the GL context (if any) that is bound to |cocoa_view_|. | 572 // Unbind the GL context (if any) that is bound to |cocoa_view_|. |
590 void ClearBoundContextDrawable(); | 573 void ClearBoundContextDrawable(); |
591 | 574 |
592 // Called when a GPU SwapBuffers is received. | 575 // Called when a GPU SwapBuffers is received. |
593 void GotAcceleratedFrame(); | 576 void GotAcceleratedFrame(); |
594 | 577 |
595 // Called when a software DIB is received. | 578 // Called when a software DIB is received. |
596 void GotSoftwareFrame(); | 579 void GotSoftwareFrame(); |
597 | 580 |
598 // Called if it has been a quarter-second since a GPU SwapBuffers has been | |
599 // received. In this case, switch from polling for frames to pushing them. | |
600 void TimerSinceGotAcceleratedFrameFired(); | |
601 | |
602 // IPC message handlers. | 581 // IPC message handlers. |
603 void OnPluginFocusChanged(bool focused, int plugin_id); | 582 void OnPluginFocusChanged(bool focused, int plugin_id); |
604 void OnStartPluginIme(); | 583 void OnStartPluginIme(); |
605 void OnDidChangeScrollbarsForMainFrame(bool has_horizontal_scrollbar, | 584 void OnDidChangeScrollbarsForMainFrame(bool has_horizontal_scrollbar, |
606 bool has_vertical_scrollbar); | 585 bool has_vertical_scrollbar); |
607 | 586 |
608 // Convert |rect| from the views coordinate (upper-left origin) into | 587 // Convert |rect| from the views coordinate (upper-left origin) into |
609 // the OpenGL coordinate (lower-left origin) and scale for HiDPI displays. | 588 // the OpenGL coordinate (lower-left origin) and scale for HiDPI displays. |
610 gfx::Rect GetScaledOpenGLPixelRect(const gfx::Rect& rect); | 589 gfx::Rect GetScaledOpenGLPixelRect(const gfx::Rect& rect); |
611 | 590 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 scoped_ptr<RenderWidgetHostViewFrameSubscriber> frame_subscriber_; | 652 scoped_ptr<RenderWidgetHostViewFrameSubscriber> frame_subscriber_; |
674 | 653 |
675 base::WeakPtrFactory<RenderWidgetHostViewMac> | 654 base::WeakPtrFactory<RenderWidgetHostViewMac> |
676 software_frame_weak_ptr_factory_; | 655 software_frame_weak_ptr_factory_; |
677 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewMac); | 656 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewMac); |
678 }; | 657 }; |
679 | 658 |
680 } // namespace content | 659 } // namespace content |
681 | 660 |
682 #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ | 661 #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ |
OLD | NEW |