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 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ 6 #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ 7 8 #import <Cocoa/Cocoa.h> 9 #include <IOSurface/IOSurfaceAPI.h> 10 #include <list> 11 #include <map> 12 #include <string> 13 #include <utility> 14 #include <vector> 15 16 #include "base/mac/scoped_nsobject.h" 17 #include "base/memory/scoped_ptr.h" 18 #include "base/memory/weak_ptr.h" 19 #include "base/time/time.h" 20 #include "content/browser/compositor/browser_compositor_view_mac.h" 21 #include "content/browser/compositor/delegated_frame_host.h" 22 #include "content/browser/renderer_host/compositing_iosurface_layer_mac.h" 23 #include "content/browser/renderer_host/display_link_mac.h" 24 #include "content/browser/renderer_host/render_widget_host_view_base.h" 25 #include "content/browser/renderer_host/software_frame_manager.h" 26 #include "content/common/content_export.h" 27 #include "content/common/cursors/webcursor.h" 28 #include "content/common/edit_command.h" 29 #import "content/public/browser/render_widget_host_view_mac_base.h" 30 #include "ipc/ipc_sender.h" 31 #include "third_party/WebKit/public/web/WebCompositionUnderline.h" 32 #include "ui/base/cocoa/base_view.h" 33 34 struct ViewHostMsg_TextInputState_Params; 35 36 namespace content { 37 class CompositingIOSurfaceMac; 38 class CompositingIOSurfaceContext; 39 class RenderWidgetHostViewMac; 40 class RenderWidgetHostViewMacEditCommandHelper; 41 class WebContents; 42 } 43 44 namespace ui { 45 class Compositor; 46 class Layer; 47 } 48 49 @class BrowserCompositorViewMac; 50 @class CompositingIOSurfaceLayer; 51 @class FullscreenWindowManager; 52 @protocol RenderWidgetHostViewMacDelegate; 53 @class SoftwareLayer; 54 @class ToolTip; 55 56 @protocol RenderWidgetHostViewMacOwner 57 - (content::RenderWidgetHostViewMac*)renderWidgetHostViewMac; 58 @end 59 60 // This is the view that lives in the Cocoa view hierarchy. In Windows-land, 61 // RenderWidgetHostViewWin is both the view and the delegate. We split the roles 62 // but that means that the view needs to own the delegate and will dispose of it 63 // when it's removed from the view system. 64 @interface RenderWidgetHostViewCocoa 65 : BaseView <RenderWidgetHostViewMacBase, 66 RenderWidgetHostViewMacOwner, 67 NSTextInputClient> { 68 @private 69 scoped_ptr<content::RenderWidgetHostViewMac> renderWidgetHostView_; 70 // This ivar is the cocoa delegate of the NSResponder. 71 base::scoped_nsobject<NSObject<RenderWidgetHostViewMacDelegate>> 72 responderDelegate_; 73 BOOL canBeKeyView_; 74 BOOL takesFocusOnlyOnMouseDown_; 75 BOOL closeOnDeactivate_; 76 scoped_ptr<content::RenderWidgetHostViewMacEditCommandHelper> 77 editCommand_helper_; 78 79 // These are part of the magic tooltip code from WebKit's WebHTMLView: 80 id trackingRectOwner_; // (not retained) 81 void* trackingRectUserData_; 82 NSTrackingRectTag lastToolTipTag_; 83 base::scoped_nsobject<NSString> toolTip_; 84 85 // Is YES if there was a mouse-down as yet unbalanced with a mouse-up. 86 BOOL hasOpenMouseDown_; 87 88 NSWindow* lastWindow_; // weak 89 90 // The cursor for the page. This is passed up from the renderer. 91 base::scoped_nsobject<NSCursor> currentCursor_; 92 93 // Variables used by our implementaion of the NSTextInput protocol. 94 // An input method of Mac calls the methods of this protocol not only to 95 // notify an application of its status, but also to retrieve the status of 96 // the application. That is, an application cannot control an input method 97 // directly. 98 // This object keeps the status of a composition of the renderer and returns 99 // it when an input method asks for it. 100 // We need to implement Objective-C methods for the NSTextInput protocol. On 101 // the other hand, we need to implement a C++ method for an IPC-message 102 // handler which receives input-method events from the renderer. 103 104 // Represents the input-method attributes supported by this object. 105 base::scoped_nsobject<NSArray> validAttributesForMarkedText_; 106 107 // Indicates if we are currently handling a key down event. 108 BOOL handlingKeyDown_; 109 110 // Indicates if there is any marked text. 111 BOOL hasMarkedText_; 112 113 // Indicates if unmarkText is called or not when handling a keyboard 114 // event. 115 BOOL unmarkTextCalled_; 116 117 // The range of current marked text inside the whole content of the DOM node 118 // being edited. 119 // TODO(suzhe): This is currently a fake value, as we do not support accessing 120 // the whole content yet. 121 NSRange markedRange_; 122 123 // The selected range, cached from a message sent by the renderer. 124 NSRange selectedRange_; 125 126 // Text to be inserted which was generated by handling a key down event. 127 base::string16 textToBeInserted_; 128 129 // Marked text which was generated by handling a key down event. 130 base::string16 markedText_; 131 132 // Underline information of the |markedText_|. 133 std::vector<blink::WebCompositionUnderline> underlines_; 134 135 // Indicates if doCommandBySelector method receives any edit command when 136 // handling a key down event. 137 BOOL hasEditCommands_; 138 139 // Contains edit commands received by the -doCommandBySelector: method when 140 // handling a key down event, not including inserting commands, eg. insertTab, 141 // etc. 142 content::EditCommands editCommands_; 143 144 // The plugin that currently has focus (-1 if no plugin has focus). 145 int focusedPluginIdentifier_; 146 147 // Whether or not plugin IME is currently enabled active. 148 BOOL pluginImeActive_; 149 150 // Whether the previous mouse event was ignored due to hitTest check. 151 BOOL mouseEventWasIgnored_; 152 153 // Event monitor for scroll wheel end event. 154 id endWheelMonitor_; 155 156 // OpenGL Support: 157 158 // recursive globalFrameDidChange protection: 159 BOOL handlingGlobalFrameDidChange_; 160 161 // The scale factor of the display this view is in. 162 float deviceScaleFactor_; 163 164 // If true then escape key down events are suppressed until the first escape 165 // key up event. (The up event is suppressed as well). This is used by the 166 // flash fullscreen code to avoid sending a key up event without a matching 167 // key down event. 168 BOOL suppressNextEscapeKeyUp_; 169 } 170 171 @property(nonatomic, readonly) NSRange selectedRange; 172 @property(nonatomic, readonly) BOOL suppressNextEscapeKeyUp; 173 174 - (void)setCanBeKeyView:(BOOL)can; 175 - (void)setTakesFocusOnlyOnMouseDown:(BOOL)b; 176 - (void)setCloseOnDeactivate:(BOOL)b; 177 - (void)setToolTipAtMousePoint:(NSString *)string; 178 // True for always-on-top special windows (e.g. Balloons and Panels). 179 - (BOOL)acceptsMouseEventsWhenInactive; 180 // Cancel ongoing composition (abandon the marked text). 181 - (void)cancelComposition; 182 // Confirm ongoing composition. 183 - (void)confirmComposition; 184 // Enables or disables plugin IME. 185 - (void)setPluginImeActive:(BOOL)active; 186 // Updates the current plugin focus state. 187 - (void)pluginFocusChanged:(BOOL)focused forPlugin:(int)pluginId; 188 // Evaluates the event in the context of plugin IME, if plugin IME is enabled. 189 // Returns YES if the event was handled. 190 - (BOOL)postProcessEventForPluginIme:(NSEvent*)event; 191 - (void)updateCursor:(NSCursor*)cursor; 192 - (NSRect)firstViewRectForCharacterRange:(NSRange)theRange 193 actualRange:(NSRangePointer)actualRange; 194 @end 195 196 namespace content { 197 class RenderWidgetHostImpl; 198 199 /////////////////////////////////////////////////////////////////////////////// 200 // RenderWidgetHostViewMac 201 // 202 // An object representing the "View" of a rendered web page. This object is 203 // responsible for displaying the content of the web page, and integrating with 204 // the Cocoa view system. It is the implementation of the RenderWidgetHostView 205 // that the cross-platform RenderWidgetHost object uses 206 // to display the data. 207 // 208 // Comment excerpted from render_widget_host.h: 209 // 210 // "The lifetime of the RenderWidgetHost* is tied to the render process. 211 // If the render process dies, the RenderWidgetHost* goes away and all 212 // references to it must become NULL." 213 // 214 // RenderWidgetHostView class hierarchy described in render_widget_host_view.h. 215 class CONTENT_EXPORT RenderWidgetHostViewMac 216 : public RenderWidgetHostViewBase, 217 public DelegatedFrameHostClient, 218 public IPC::Sender, 219 public SoftwareFrameManagerClient, 220 public CompositingIOSurfaceLayerClient { 221 public: 222 // The view will associate itself with the given widget. The native view must 223 // be hooked up immediately to the view hierarchy, or else when it is 224 // deleted it will delete this out from under the caller. 225 explicit RenderWidgetHostViewMac(RenderWidgetHost* widget); 226 virtual ~RenderWidgetHostViewMac(); 227 228 RenderWidgetHostViewCocoa* cocoa_view() const { return cocoa_view_; } 229 230 // |delegate| is used to separate out the logic from the NSResponder delegate. 231 // |delegate| is retained by this class. 232 // |delegate| should be set at most once. 233 CONTENT_EXPORT void SetDelegate( 234 NSObject<RenderWidgetHostViewMacDelegate>* delegate); 235 void SetAllowOverlappingViews(bool overlapping); 236 237 // RenderWidgetHostView implementation. 238 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 239 virtual void InitAsChild(gfx::NativeView parent_view) OVERRIDE; 240 virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; 241 virtual void SetSize(const gfx::Size& size) OVERRIDE; 242 virtual void SetBounds(const gfx::Rect& rect) OVERRIDE; 243 virtual gfx::NativeView GetNativeView() const OVERRIDE; 244 virtual gfx::NativeViewId GetNativeViewId() const OVERRIDE; 245 virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE; 246 virtual bool HasFocus() const OVERRIDE; 247 virtual bool IsSurfaceAvailableForCopy() const OVERRIDE; 248 virtual void Show() OVERRIDE; 249 virtual void Hide() OVERRIDE; 250 virtual bool IsShowing() OVERRIDE; 251 virtual gfx::Rect GetViewBounds() const OVERRIDE; 252 virtual void SetShowingContextMenu(bool showing) OVERRIDE; 253 virtual void SetActive(bool active) OVERRIDE; 254 virtual void SetTakesFocusOnlyOnMouseDown(bool flag) OVERRIDE; 255 virtual void SetWindowVisibility(bool visible) OVERRIDE; 256 virtual void WindowFrameChanged() OVERRIDE; 257 virtual void ShowDefinitionForSelection() OVERRIDE; 258 virtual bool SupportsSpeech() const OVERRIDE; 259 virtual void SpeakSelection() OVERRIDE; 260 virtual bool IsSpeaking() const OVERRIDE; 261 virtual void StopSpeaking() OVERRIDE; 262 virtual void SetBackgroundOpaque(bool opaque) OVERRIDE; 263 264 // Implementation of RenderWidgetHostViewBase. 265 virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, 266 const gfx::Rect& pos) OVERRIDE; 267 virtual void InitAsFullscreen( 268 RenderWidgetHostView* reference_host_view) OVERRIDE; 269 virtual void WasShown() OVERRIDE; 270 virtual void WasHidden() OVERRIDE; 271 virtual void MovePluginWindows( 272 const std::vector<WebPluginGeometry>& moves) OVERRIDE; 273 virtual void Focus() OVERRIDE; 274 virtual void Blur() OVERRIDE; 275 virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE; 276 virtual void SetIsLoading(bool is_loading) OVERRIDE; 277 virtual void TextInputStateChanged( 278 const ViewHostMsg_TextInputState_Params& params) OVERRIDE; 279 virtual void ImeCancelComposition() OVERRIDE; 280 virtual void ImeCompositionRangeChanged( 281 const gfx::Range& range, 282 const std::vector<gfx::Rect>& character_bounds) OVERRIDE; 283 virtual void RenderProcessGone(base::TerminationStatus status, 284 int error_code) OVERRIDE; 285 virtual void Destroy() OVERRIDE; 286 virtual void SetTooltipText(const base::string16& tooltip_text) OVERRIDE; 287 virtual void SelectionChanged(const base::string16& text, 288 size_t offset, 289 const gfx::Range& range) OVERRIDE; 290 virtual void SelectionBoundsChanged( 291 const ViewHostMsg_SelectionBounds_Params& params) OVERRIDE; 292 virtual void ScrollOffsetChanged() OVERRIDE; 293 virtual void CopyFromCompositingSurface( 294 const gfx::Rect& src_subrect, 295 const gfx::Size& dst_size, 296 const base::Callback<void(bool, const SkBitmap&)>& callback, 297 SkBitmap::Config config) OVERRIDE; 298 virtual void CopyFromCompositingSurfaceToVideoFrame( 299 const gfx::Rect& src_subrect, 300 const scoped_refptr<media::VideoFrame>& target, 301 const base::Callback<void(bool)>& callback) OVERRIDE; 302 virtual bool CanCopyToVideoFrame() const OVERRIDE; 303 virtual bool CanSubscribeFrame() const OVERRIDE; 304 virtual void BeginFrameSubscription( 305 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) OVERRIDE; 306 virtual void EndFrameSubscription() OVERRIDE; 307 virtual void OnSwapCompositorFrame( 308 uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame) OVERRIDE; 309 virtual void AcceleratedSurfaceInitialized(int host_id, 310 int route_id) OVERRIDE; 311 virtual void CreateBrowserAccessibilityManagerIfNeeded() OVERRIDE; 312 virtual gfx::Point AccessibilityOriginInScreen(const gfx::Rect& bounds) 313 OVERRIDE; 314 virtual void OnAccessibilitySetFocus(int acc_obj_id) OVERRIDE; 315 virtual void AccessibilityShowMenu(int acc_obj_id) OVERRIDE; 316 virtual bool PostProcessEventForPluginIme( 317 const NativeWebKeyboardEvent& event) OVERRIDE; 318 319 virtual void AcceleratedSurfaceBuffersSwapped( 320 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, 321 int gpu_host_id) OVERRIDE; 322 virtual void AcceleratedSurfacePostSubBuffer( 323 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 324 int gpu_host_id) OVERRIDE; 325 virtual void AcceleratedSurfaceSuspend() OVERRIDE; 326 virtual void AcceleratedSurfaceRelease() OVERRIDE; 327 virtual bool HasAcceleratedSurface(const gfx::Size& desired_size) OVERRIDE; 328 virtual void GetScreenInfo(blink::WebScreenInfo* results) OVERRIDE; 329 virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE; 330 virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE; 331 332 virtual bool LockMouse() OVERRIDE; 333 virtual void UnlockMouse() OVERRIDE; 334 virtual void WheelEventAck(const blink::WebMouseWheelEvent& event, 335 InputEventAckState ack_result) OVERRIDE; 336 337 // IPC::Sender implementation. 338 virtual bool Send(IPC::Message* message) OVERRIDE; 339 340 // SoftwareFrameManagerClient implementation: 341 virtual void SoftwareFrameWasFreed( 342 uint32 output_surface_id, unsigned frame_id) OVERRIDE; 343 virtual void ReleaseReferencesToSoftwareFrame() OVERRIDE; 344 345 virtual SkBitmap::Config PreferredReadbackFormat() OVERRIDE; 346 347 // CompositingIOSurfaceLayerClient implementation. 348 virtual void AcceleratedLayerDidDrawFrame(bool succeeded) OVERRIDE; 349 350 // Forwards the mouse event to the renderer. 351 void ForwardMouseEvent(const blink::WebMouseEvent& event); 352 353 void KillSelf(); 354 355 void SetTextInputActive(bool active); 356 357 // Sends completed plugin IME notification and text back to the renderer. 358 void PluginImeCompositionCompleted(const base::string16& text, int plugin_id); 359 360 const std::string& selected_text() const { return selected_text_; } 361 362 // Update the IOSurface to be drawn and call setNeedsDisplay on 363 // |cocoa_view_|. 364 void CompositorSwapBuffers(IOSurfaceID surface_handle, 365 const gfx::Size& size, 366 float scale_factor, 367 const std::vector<ui::LatencyInfo>& latency_info); 368 369 // Called when a GPU error is detected. Posts a task to destroy all 370 // compositing state. 371 void GotAcceleratedCompositingError(); 372 373 // Sets the overlay view, which should be drawn in the same IOSurface 374 // atop of this view, if both views are drawing accelerated content. 375 // Overlay is stored as a weak ptr. 376 void SetOverlayView(RenderWidgetHostViewMac* overlay, 377 const gfx::Point& offset); 378 379 // Removes the previously set overlay view. 380 void RemoveOverlayView(); 381 382 // Returns true and stores first rectangle for character range if the 383 // requested |range| is already cached, otherwise returns false. 384 // Exposed for testing. 385 CONTENT_EXPORT bool GetCachedFirstRectForCharacterRange( 386 NSRange range, NSRect* rect, NSRange* actual_range); 387 388 // Returns true if there is line break in |range| and stores line breaking 389 // point to |line_breaking_point|. The |line_break_point| is valid only if 390 // this function returns true. 391 bool GetLineBreakIndex(const std::vector<gfx::Rect>& bounds, 392 const gfx::Range& range, 393 size_t* line_break_point); 394 395 // Returns composition character boundary rectangle. The |range| is 396 // composition based range. Also stores |actual_range| which is corresponding 397 // to actually used range for returned rectangle. 398 gfx::Rect GetFirstRectForCompositionRange(const gfx::Range& range, 399 gfx::Range* actual_range); 400 401 // Converts from given whole character range to composition oriented range. If 402 // the conversion failed, return gfx::Range::InvalidRange. 403 gfx::Range ConvertCharacterRangeToCompositionRange( 404 const gfx::Range& request_range); 405 406 WebContents* GetWebContents(); 407 408 // These member variables should be private, but the associated ObjC class 409 // needs access to them and can't be made a friend. 410 411 // The associated Model. Can be NULL if Destroy() is called when 412 // someone (other than superview) has retained |cocoa_view_|. 413 RenderWidgetHostImpl* render_widget_host_; 414 415 // Current text input type. 416 ui::TextInputType text_input_type_; 417 bool can_compose_inline_; 418 419 // The background CoreAnimation layer which is hosted by |cocoa_view_|. 420 // The compositing or software layers will be added as sublayers to this. 421 base::scoped_nsobject<CALayer> background_layer_; 422 423 // The CoreAnimation layer for software compositing. This should be NULL 424 // when software compositing is not in use. 425 base::scoped_nsobject<SoftwareLayer> software_layer_; 426 427 // Accelerated compositing structures. These may be dynamically created and 428 // destroyed together in Create/DestroyCompositedIOSurfaceAndLayer. 429 base::scoped_nsobject<CompositingIOSurfaceLayer> compositing_iosurface_layer_; 430 scoped_refptr<CompositingIOSurfaceMac> compositing_iosurface_; 431 scoped_refptr<CompositingIOSurfaceContext> compositing_iosurface_context_; 432 433 // Delegated frame management and compositior. 434 base::scoped_nsobject<BrowserCompositorViewMac> browser_compositor_view_; 435 scoped_ptr<DelegatedFrameHost> delegated_frame_host_; 436 scoped_ptr<ui::Layer> root_layer_; 437 438 // This holds the current software compositing framebuffer, if any. 439 scoped_ptr<SoftwareFrameManager> software_frame_manager_; 440 441 // Latency info to send back when the next frame appears on the 442 // screen. 443 std::vector<ui::LatencyInfo> pending_latency_info_; 444 445 NSWindow* pepper_fullscreen_window() const { 446 return pepper_fullscreen_window_; 447 } 448 449 CONTENT_EXPORT void release_pepper_fullscreen_window_for_testing(); 450 451 RenderWidgetHostViewMac* fullscreen_parent_host_view() const { 452 return fullscreen_parent_host_view_; 453 } 454 455 RenderWidgetHostViewFrameSubscriber* frame_subscriber() const { 456 return frame_subscriber_.get(); 457 } 458 459 int window_number() const; 460 461 // The scale factor for the screen that the view is currently on. 462 float ViewScaleFactor() const; 463 464 // Update the scale factor for the backing store and for any CALayers. 465 void UpdateBackingStoreScaleFactor(); 466 467 // Ensure that the display link is associated with the correct display. 468 void UpdateDisplayLink(); 469 470 // The scale factor of the backing store. Note that this is updated based on 471 // ViewScaleFactor with some delay. 472 float backing_store_scale_factor_; 473 474 void AddPendingLatencyInfo( 475 const std::vector<ui::LatencyInfo>& latency_info); 476 void SendPendingLatencyInfoToHost(); 477 478 void SendPendingSwapAck(); 479 480 void PauseForPendingResizeOrRepaintsAndDraw(); 481 482 // The geometric arrangement of the layers depends on cocoa_view's size, the 483 // compositing IOSurface's rounded size, and the software frame size. Update 484 // all of them using this function when any of those parameters changes. Also 485 // update the scale factor of the layers. 486 void LayoutLayers(); 487 488 // DelegatedFrameHostClient implementation. 489 virtual ui::Compositor* GetCompositor() const OVERRIDE; 490 virtual ui::Layer* GetLayer() OVERRIDE; 491 virtual RenderWidgetHostImpl* GetHost() OVERRIDE; 492 virtual void SchedulePaintInRect( 493 const gfx::Rect& damage_rect_in_dip) OVERRIDE; 494 virtual bool IsVisible() OVERRIDE; 495 virtual scoped_ptr<ResizeLock> CreateResizeLock( 496 bool defer_compositor_lock) OVERRIDE; 497 virtual gfx::Size DesiredFrameSize() OVERRIDE; 498 virtual float CurrentDeviceScaleFactor() OVERRIDE; 499 virtual gfx::Size ConvertViewSizeToPixel(const gfx::Size& size) OVERRIDE; 500 virtual DelegatedFrameHost* GetDelegatedFrameHost() const OVERRIDE; 501 502 private: 503 friend class RenderWidgetHostViewMacTest; 504 505 struct PendingSwapAck { 506 PendingSwapAck(int32 route_id, int gpu_host_id, int32 renderer_id) 507 : route_id(route_id), 508 gpu_host_id(gpu_host_id), 509 renderer_id(renderer_id) {} 510 int32 route_id; 511 int gpu_host_id; 512 int32 renderer_id; 513 }; 514 scoped_ptr<PendingSwapAck> pending_swap_ack_; 515 void AddPendingSwapAck(int32 route_id, int gpu_host_id, int32 renderer_id); 516 517 // Returns whether this render view is a popup (autocomplete window). 518 bool IsPopup() const; 519 520 // Shuts down the render_widget_host_. This is a separate function so we can 521 // invoke it from the message loop. 522 void ShutdownHost(); 523 524 void EnsureSoftwareLayer(); 525 void DestroySoftwareLayer(); 526 527 bool EnsureCompositedIOSurface() WARN_UNUSED_RESULT; 528 void EnsureCompositedIOSurfaceLayer(); 529 enum DestroyCompositedIOSurfaceLayerBehavior { 530 kLeaveLayerInHierarchy, 531 kRemoveLayerFromHierarchy, 532 }; 533 void DestroyCompositedIOSurfaceLayer( 534 DestroyCompositedIOSurfaceLayerBehavior destroy_layer_behavior); 535 void DestroyCompositedIOSurfaceAndLayer(); 536 537 void DestroyCompositingStateOnError(); 538 539 // Called when a GPU SwapBuffers is received. 540 void GotAcceleratedFrame(); 541 542 // Called when a software DIB is received. 543 void GotSoftwareFrame(); 544 545 // IPC message handlers. 546 void OnPluginFocusChanged(bool focused, int plugin_id); 547 void OnStartPluginIme(); 548 549 // Convert |rect| from the views coordinate (upper-left origin) into 550 // the OpenGL coordinate (lower-left origin) and scale for HiDPI displays. 551 gfx::Rect GetScaledOpenGLPixelRect(const gfx::Rect& rect); 552 553 // Send updated vsync parameters to the renderer. 554 void SendVSyncParametersToRenderer(); 555 556 // The associated view. This is weak and is inserted into the view hierarchy 557 // to own this RenderWidgetHostViewMac object. Set to nil at the start of the 558 // destructor. 559 RenderWidgetHostViewCocoa* cocoa_view_; 560 561 // Indicates if the page is loading. 562 bool is_loading_; 563 564 // The text to be shown in the tooltip, supplied by the renderer. 565 base::string16 tooltip_text_; 566 567 // Factory used to safely scope delayed calls to ShutdownHost(). 568 base::WeakPtrFactory<RenderWidgetHostViewMac> weak_factory_; 569 570 // selected text on the renderer. 571 std::string selected_text_; 572 573 // The window used for popup widgets. 574 base::scoped_nsobject<NSWindow> popup_window_; 575 576 // The fullscreen window used for pepper flash. 577 base::scoped_nsobject<NSWindow> pepper_fullscreen_window_; 578 base::scoped_nsobject<FullscreenWindowManager> fullscreen_window_manager_; 579 // Our parent host view, if this is fullscreen. NULL otherwise. 580 RenderWidgetHostViewMac* fullscreen_parent_host_view_; 581 582 // The overlay view which is rendered above this one in the same 583 // accelerated IOSurface. 584 // Overlay view has |underlay_view_| set to this view. 585 base::WeakPtr<RenderWidgetHostViewMac> overlay_view_; 586 587 // The underlay view which this view is rendered above in the same 588 // accelerated IOSurface. 589 // Underlay view has |overlay_view_| set to this view. 590 base::WeakPtr<RenderWidgetHostViewMac> underlay_view_; 591 592 // Factory used to safely reference overlay view set in SetOverlayView. 593 base::WeakPtrFactory<RenderWidgetHostViewMac> 594 overlay_view_weak_factory_; 595 596 // Display link for getting vsync info. 597 scoped_refptr<DisplayLinkMac> display_link_; 598 599 // The current composition character range and its bounds. 600 gfx::Range composition_range_; 601 std::vector<gfx::Rect> composition_bounds_; 602 603 // The current caret bounds. 604 gfx::Rect caret_rect_; 605 606 // Subscriber that listens to frame presentation events. 607 scoped_ptr<RenderWidgetHostViewFrameSubscriber> frame_subscriber_; 608 609 base::WeakPtrFactory<RenderWidgetHostViewMac> 610 software_frame_weak_ptr_factory_; 611 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewMac); 612 }; 613 614 } // namespace content 615 616 #endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ 617