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 <list> 10#include <map> 11#include <string> 12#include <utility> 13#include <vector> 14 15#include "base/mac/scoped_nsobject.h" 16#include "base/memory/scoped_ptr.h" 17#include "base/memory/weak_ptr.h" 18#include "base/time/time.h" 19#include "content/browser/accessibility/browser_accessibility_delegate_mac.h" 20#include "content/browser/renderer_host/render_widget_host_view_base.h" 21#include "content/common/edit_command.h" 22#import "content/public/browser/render_widget_host_view_mac_base.h" 23#include "ipc/ipc_sender.h" 24#include "third_party/WebKit/public/web/WebCompositionUnderline.h" 25#include "ui/base/cocoa/base_view.h" 26#include "webkit/common/cursors/webcursor.h" 27 28namespace content { 29class CompositingIOSurfaceMac; 30class CompositingIOSurfaceContext; 31class RenderWidgetHostViewMac; 32class RenderWidgetHostViewMacEditCommandHelper; 33} 34 35@class CompositingIOSurfaceLayer; 36@class FullscreenWindowManager; 37@protocol RenderWidgetHostViewMacDelegate; 38@class ToolTip; 39 40@protocol RenderWidgetHostViewMacOwner 41- (content::RenderWidgetHostViewMac*)renderWidgetHostViewMac; 42@end 43 44// This is the view that lives in the Cocoa view hierarchy. In Windows-land, 45// RenderWidgetHostViewWin is both the view and the delegate. We split the roles 46// but that means that the view needs to own the delegate and will dispose of it 47// when it's removed from the view system. 48@interface RenderWidgetHostViewCocoa 49 : BaseView <RenderWidgetHostViewMacBase, 50 RenderWidgetHostViewMacOwner, 51 NSTextInputClient, 52 BrowserAccessibilityDelegateCocoa> { 53 @private 54 scoped_ptr<content::RenderWidgetHostViewMac> renderWidgetHostView_; 55 NSObject<RenderWidgetHostViewMacDelegate>* delegate_; // weak 56 BOOL canBeKeyView_; 57 BOOL takesFocusOnlyOnMouseDown_; 58 BOOL closeOnDeactivate_; 59 scoped_ptr<content::RenderWidgetHostViewMacEditCommandHelper> 60 editCommand_helper_; 61 62 // These are part of the magic tooltip code from WebKit's WebHTMLView: 63 id trackingRectOwner_; // (not retained) 64 void* trackingRectUserData_; 65 NSTrackingRectTag lastToolTipTag_; 66 base::scoped_nsobject<NSString> toolTip_; 67 68 // Is YES if there was a mouse-down as yet unbalanced with a mouse-up. 69 BOOL hasOpenMouseDown_; 70 71 NSWindow* lastWindow_; // weak 72 73 // The cursor for the page. This is passed up from the renderer. 74 base::scoped_nsobject<NSCursor> currentCursor_; 75 76 // Variables used by our implementaion of the NSTextInput protocol. 77 // An input method of Mac calls the methods of this protocol not only to 78 // notify an application of its status, but also to retrieve the status of 79 // the application. That is, an application cannot control an input method 80 // directly. 81 // This object keeps the status of a composition of the renderer and returns 82 // it when an input method asks for it. 83 // We need to implement Objective-C methods for the NSTextInput protocol. On 84 // the other hand, we need to implement a C++ method for an IPC-message 85 // handler which receives input-method events from the renderer. 86 87 // Represents the input-method attributes supported by this object. 88 base::scoped_nsobject<NSArray> validAttributesForMarkedText_; 89 90 // Indicates if we are currently handling a key down event. 91 BOOL handlingKeyDown_; 92 93 // Indicates if there is any marked text. 94 BOOL hasMarkedText_; 95 96 // Indicates if unmarkText is called or not when handling a keyboard 97 // event. 98 BOOL unmarkTextCalled_; 99 100 // The range of current marked text inside the whole content of the DOM node 101 // being edited. 102 // TODO(suzhe): This is currently a fake value, as we do not support accessing 103 // the whole content yet. 104 NSRange markedRange_; 105 106 // The selected range, cached from a message sent by the renderer. 107 NSRange selectedRange_; 108 109 // Text to be inserted which was generated by handling a key down event. 110 string16 textToBeInserted_; 111 112 // Marked text which was generated by handling a key down event. 113 string16 markedText_; 114 115 // Underline information of the |markedText_|. 116 std::vector<WebKit::WebCompositionUnderline> underlines_; 117 118 // Indicates if doCommandBySelector method receives any edit command when 119 // handling a key down event. 120 BOOL hasEditCommands_; 121 122 // Contains edit commands received by the -doCommandBySelector: method when 123 // handling a key down event, not including inserting commands, eg. insertTab, 124 // etc. 125 content::EditCommands editCommands_; 126 127 // The plugin that currently has focus (-1 if no plugin has focus). 128 int focusedPluginIdentifier_; 129 130 // Whether or not plugin IME is currently enabled active. 131 BOOL pluginImeActive_; 132 133 // Whether the previous mouse event was ignored due to hitTest check. 134 BOOL mouseEventWasIgnored_; 135 136 // Event monitor for scroll wheel end event. 137 id endWheelMonitor_; 138 139 // OpenGL Support: 140 141 // recursive globalFrameDidChange protection: 142 BOOL handlingGlobalFrameDidChange_; 143 144 // The scale factor of the display this view is in. 145 float deviceScaleFactor_; 146 147 // If true then escape key down events are suppressed until the first escape 148 // key up event. (The up event is suppressed as well). This is used by the 149 // flash fullscreen code to avoid sending a key up event without a matching 150 // key down event. 151 BOOL suppressNextEscapeKeyUp_; 152} 153 154@property(nonatomic, readonly) NSRange selectedRange; 155@property(nonatomic, readonly) BOOL suppressNextEscapeKeyUp; 156 157- (void)setCanBeKeyView:(BOOL)can; 158- (void)setTakesFocusOnlyOnMouseDown:(BOOL)b; 159- (void)setCloseOnDeactivate:(BOOL)b; 160- (void)setToolTipAtMousePoint:(NSString *)string; 161// True for always-on-top special windows (e.g. Balloons and Panels). 162- (BOOL)acceptsMouseEventsWhenInactive; 163// Cancel ongoing composition (abandon the marked text). 164- (void)cancelComposition; 165// Confirm ongoing composition. 166- (void)confirmComposition; 167// Enables or disables plugin IME. 168- (void)setPluginImeActive:(BOOL)active; 169// Updates the current plugin focus state. 170- (void)pluginFocusChanged:(BOOL)focused forPlugin:(int)pluginId; 171// Evaluates the event in the context of plugin IME, if plugin IME is enabled. 172// Returns YES if the event was handled. 173- (BOOL)postProcessEventForPluginIme:(NSEvent*)event; 174- (void)updateCursor:(NSCursor*)cursor; 175- (NSRect)firstViewRectForCharacterRange:(NSRange)theRange 176 actualRange:(NSRangePointer)actualRange; 177@end 178 179namespace content { 180class RenderWidgetHostImpl; 181 182/////////////////////////////////////////////////////////////////////////////// 183// RenderWidgetHostViewMac 184// 185// An object representing the "View" of a rendered web page. This object is 186// responsible for displaying the content of the web page, and integrating with 187// the Cocoa view system. It is the implementation of the RenderWidgetHostView 188// that the cross-platform RenderWidgetHost object uses 189// to display the data. 190// 191// Comment excerpted from render_widget_host.h: 192// 193// "The lifetime of the RenderWidgetHost* is tied to the render process. 194// If the render process dies, the RenderWidgetHost* goes away and all 195// references to it must become NULL." 196// 197// RenderWidgetHostView class hierarchy described in render_widget_host_view.h. 198class RenderWidgetHostViewMac : public RenderWidgetHostViewBase, 199 public IPC::Sender { 200 public: 201 virtual ~RenderWidgetHostViewMac(); 202 203 RenderWidgetHostViewCocoa* cocoa_view() const { return cocoa_view_; } 204 205 CONTENT_EXPORT void SetDelegate( 206 NSObject<RenderWidgetHostViewMacDelegate>* delegate); 207 void SetAllowOverlappingViews(bool overlapping); 208 209 // RenderWidgetHostView implementation. 210 virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; 211 virtual void InitAsChild(gfx::NativeView parent_view) OVERRIDE; 212 virtual RenderWidgetHost* GetRenderWidgetHost() const OVERRIDE; 213 virtual void SetSize(const gfx::Size& size) OVERRIDE; 214 virtual void SetBounds(const gfx::Rect& rect) OVERRIDE; 215 virtual gfx::NativeView GetNativeView() const OVERRIDE; 216 virtual gfx::NativeViewId GetNativeViewId() const OVERRIDE; 217 virtual gfx::NativeViewAccessible GetNativeViewAccessible() OVERRIDE; 218 virtual bool HasFocus() const OVERRIDE; 219 virtual bool IsSurfaceAvailableForCopy() const OVERRIDE; 220 virtual void Show() OVERRIDE; 221 virtual void Hide() OVERRIDE; 222 virtual bool IsShowing() OVERRIDE; 223 virtual gfx::Rect GetViewBounds() const OVERRIDE; 224 virtual void SetShowingContextMenu(bool showing) OVERRIDE; 225 virtual void SetActive(bool active) OVERRIDE; 226 virtual void SetTakesFocusOnlyOnMouseDown(bool flag) OVERRIDE; 227 virtual void SetWindowVisibility(bool visible) OVERRIDE; 228 virtual void WindowFrameChanged() OVERRIDE; 229 virtual void ShowDefinitionForSelection() OVERRIDE; 230 virtual bool SupportsSpeech() const OVERRIDE; 231 virtual void SpeakSelection() OVERRIDE; 232 virtual bool IsSpeaking() const OVERRIDE; 233 virtual void StopSpeaking() OVERRIDE; 234 virtual void SetBackground(const SkBitmap& background) OVERRIDE; 235 236 // Implementation of RenderWidgetHostViewPort. 237 virtual void InitAsPopup(RenderWidgetHostView* parent_host_view, 238 const gfx::Rect& pos) OVERRIDE; 239 virtual void InitAsFullscreen( 240 RenderWidgetHostView* reference_host_view) OVERRIDE; 241 virtual void WasShown() OVERRIDE; 242 virtual void WasHidden() OVERRIDE; 243 virtual void MovePluginWindows( 244 const gfx::Vector2d& scroll_offset, 245 const std::vector<WebPluginGeometry>& moves) OVERRIDE; 246 virtual void Focus() OVERRIDE; 247 virtual void Blur() OVERRIDE; 248 virtual void UpdateCursor(const WebCursor& cursor) OVERRIDE; 249 virtual void SetIsLoading(bool is_loading) OVERRIDE; 250 virtual void TextInputTypeChanged(ui::TextInputType type, 251 bool can_compose_inline, 252 ui::TextInputMode input_mode) OVERRIDE; 253 virtual void ImeCancelComposition() OVERRIDE; 254 virtual void ImeCompositionRangeChanged( 255 const ui::Range& range, 256 const std::vector<gfx::Rect>& character_bounds) OVERRIDE; 257 virtual void DidUpdateBackingStore( 258 const gfx::Rect& scroll_rect, 259 const gfx::Vector2d& scroll_delta, 260 const std::vector<gfx::Rect>& copy_rects, 261 const ui::LatencyInfo& latency_info) OVERRIDE; 262 virtual void RenderProcessGone(base::TerminationStatus status, 263 int error_code) OVERRIDE; 264 virtual void Destroy() OVERRIDE; 265 virtual void SetTooltipText(const string16& tooltip_text) OVERRIDE; 266 virtual void SelectionChanged(const string16& text, 267 size_t offset, 268 const ui::Range& range) OVERRIDE; 269 virtual void SelectionBoundsChanged( 270 const ViewHostMsg_SelectionBounds_Params& params) OVERRIDE; 271 virtual void ScrollOffsetChanged() OVERRIDE; 272 virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE; 273 virtual void CopyFromCompositingSurface( 274 const gfx::Rect& src_subrect, 275 const gfx::Size& dst_size, 276 const base::Callback<void(bool, const SkBitmap&)>& callback) OVERRIDE; 277 virtual void CopyFromCompositingSurfaceToVideoFrame( 278 const gfx::Rect& src_subrect, 279 const scoped_refptr<media::VideoFrame>& target, 280 const base::Callback<void(bool)>& callback) OVERRIDE; 281 virtual bool CanCopyToVideoFrame() const OVERRIDE; 282 virtual bool CanSubscribeFrame() const OVERRIDE; 283 virtual void BeginFrameSubscription( 284 scoped_ptr<RenderWidgetHostViewFrameSubscriber> subscriber) OVERRIDE; 285 virtual void EndFrameSubscription() OVERRIDE; 286 virtual void OnAcceleratedCompositingStateChange() OVERRIDE; 287 virtual void OnAccessibilityNotifications( 288 const std::vector<AccessibilityHostMsg_NotificationParams>& params 289 ) OVERRIDE; 290 virtual bool PostProcessEventForPluginIme( 291 const NativeWebKeyboardEvent& event) OVERRIDE; 292 293 virtual void AcceleratedSurfaceBuffersSwapped( 294 const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params, 295 int gpu_host_id) OVERRIDE; 296 virtual void AcceleratedSurfacePostSubBuffer( 297 const GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params& params, 298 int gpu_host_id) OVERRIDE; 299 virtual void AcceleratedSurfaceSuspend() OVERRIDE; 300 virtual void AcceleratedSurfaceRelease() OVERRIDE; 301 virtual bool HasAcceleratedSurface(const gfx::Size& desired_size) OVERRIDE; 302 virtual void AboutToWaitForBackingStoreMsg() OVERRIDE; 303 virtual void GetScreenInfo(WebKit::WebScreenInfo* results) OVERRIDE; 304 virtual gfx::Rect GetBoundsInRootWindow() OVERRIDE; 305 virtual gfx::GLSurfaceHandle GetCompositingSurface() OVERRIDE; 306 307 virtual void SetHasHorizontalScrollbar( 308 bool has_horizontal_scrollbar) OVERRIDE; 309 virtual void SetScrollOffsetPinning( 310 bool is_pinned_to_left, bool is_pinned_to_right) OVERRIDE; 311 virtual bool LockMouse() OVERRIDE; 312 virtual void UnlockMouse() OVERRIDE; 313 virtual void UnhandledWheelEvent( 314 const WebKit::WebMouseWheelEvent& event) OVERRIDE; 315 316 // IPC::Sender implementation. 317 virtual bool Send(IPC::Message* message) OVERRIDE; 318 319 // Forwards the mouse event to the renderer. 320 void ForwardMouseEvent(const WebKit::WebMouseEvent& event); 321 322 void KillSelf(); 323 324 void SetTextInputActive(bool active); 325 326 // Change this view to use CoreAnimation to draw. 327 void EnableCoreAnimation(); 328 329 // Sends completed plugin IME notification and text back to the renderer. 330 void PluginImeCompositionCompleted(const string16& text, int plugin_id); 331 332 const std::string& selected_text() const { return selected_text_; } 333 334 // Update the IOSurface to be drawn and call setNeedsDisplay on 335 // |cocoa_view_|. 336 void CompositorSwapBuffers(uint64 surface_handle, 337 const gfx::Size& size, 338 float scale_factor, 339 const ui::LatencyInfo& latency_info); 340 341 // Draw the IOSurface by making its context current to this view. 342 bool DrawIOSurfaceWithoutCoreAnimation(); 343 344 // Called when a GPU error is detected. Deletes all compositing state. 345 void GotAcceleratedCompositingError(); 346 347 // Returns true and stores first rectangle for character range if the 348 // requested |range| is already cached, otherwise returns false. 349 // Exposed for testing. 350 CONTENT_EXPORT bool GetCachedFirstRectForCharacterRange( 351 NSRange range, NSRect* rect, NSRange* actual_range); 352 353 // Returns true if there is line break in |range| and stores line breaking 354 // point to |line_breaking_point|. The |line_break_point| is valid only if 355 // this function returns true. 356 bool GetLineBreakIndex(const std::vector<gfx::Rect>& bounds, 357 const ui::Range& range, 358 size_t* line_break_point); 359 360 // Returns composition character boundary rectangle. The |range| is 361 // composition based range. Also stores |actual_range| which is corresponding 362 // to actually used range for returned rectangle. 363 gfx::Rect GetFirstRectForCompositionRange(const ui::Range& range, 364 ui::Range* actual_range); 365 366 // Converts from given whole character range to composition oriented range. If 367 // the conversion failed, return ui::Range::InvalidRange. 368 ui::Range ConvertCharacterRangeToCompositionRange( 369 const ui::Range& request_range); 370 371 // These member variables should be private, but the associated ObjC class 372 // needs access to them and can't be made a friend. 373 374 // The associated Model. Can be NULL if Destroy() is called when 375 // someone (other than superview) has retained |cocoa_view_|. 376 RenderWidgetHostImpl* render_widget_host_; 377 378 // This is true when we are currently painting and thus should handle extra 379 // paint requests by expanding the invalid rect rather than actually painting. 380 bool about_to_validate_and_paint_; 381 382 // This is true when we have already scheduled a call to 383 // |-callSetNeedsDisplayInRect:| but it has not been fulfilled yet. Used to 384 // prevent us from scheduling multiple calls. 385 bool call_set_needs_display_in_rect_pending_; 386 387 // Whether last rendered frame was accelerated. 388 bool last_frame_was_accelerated_; 389 390 // The invalid rect that needs to be painted by callSetNeedsDisplayInRect. 391 // This value is only meaningful when 392 // |call_set_needs_display_in_rect_pending_| is true. 393 NSRect invalid_rect_; 394 395 // The time at which this view started displaying white pixels as a result of 396 // not having anything to paint (empty backing store from renderer). This 397 // value returns true for is_null() if we are not recording whiteout times. 398 base::TimeTicks whiteout_start_time_; 399 400 // The time it took after this view was selected for it to be fully painted. 401 base::TimeTicks web_contents_switch_paint_time_; 402 403 // Current text input type. 404 ui::TextInputType text_input_type_; 405 bool can_compose_inline_; 406 407 base::scoped_nsobject<CALayer> software_layer_; 408 409 // Accelerated compositing structures. These may be dynamically created and 410 // destroyed together in Create/DestroyCompositedIOSurfaceAndLayer. 411 base::scoped_nsobject<CompositingIOSurfaceLayer> compositing_iosurface_layer_; 412 scoped_ptr<CompositingIOSurfaceMac> compositing_iosurface_; 413 scoped_refptr<CompositingIOSurfaceContext> compositing_iosurface_context_; 414 415 // Whether to allow overlapping views. 416 bool allow_overlapping_views_; 417 418 // Whether to use the CoreAnimation path to draw content. 419 bool use_core_animation_; 420 421 ui::LatencyInfo software_latency_info_; 422 423 NSWindow* pepper_fullscreen_window() const { 424 return pepper_fullscreen_window_; 425 } 426 427 CONTENT_EXPORT void release_pepper_fullscreen_window_for_testing(); 428 429 RenderWidgetHostViewMac* fullscreen_parent_host_view() const { 430 return fullscreen_parent_host_view_; 431 } 432 433 RenderWidgetHostViewFrameSubscriber* frame_subscriber() const { 434 return frame_subscriber_.get(); 435 } 436 437 int window_number() const; 438 439 float scale_factor() const; 440 441 bool is_hidden() const { return is_hidden_; } 442 443 void FrameSwapped(); 444 445 private: 446 friend class RenderWidgetHostView; 447 friend class RenderWidgetHostViewMacTest; 448 449 void GetVSyncParameters( 450 base::TimeTicks* timebase, base::TimeDelta* interval); 451 452 // The view will associate itself with the given widget. The native view must 453 // be hooked up immediately to the view hierarchy, or else when it is 454 // deleted it will delete this out from under the caller. 455 explicit RenderWidgetHostViewMac(RenderWidgetHost* widget); 456 457 // Returns whether this render view is a popup (autocomplete window). 458 bool IsPopup() const; 459 460 // Shuts down the render_widget_host_. This is a separate function so we can 461 // invoke it from the message loop. 462 void ShutdownHost(); 463 464 bool CreateCompositedIOSurface(); 465 bool CreateCompositedIOSurfaceLayer(); 466 enum DestroyContextBehavior { 467 kLeaveContextBoundToView, 468 kDestroyContext, 469 }; 470 void DestroyCompositedIOSurfaceAndLayer(DestroyContextBehavior 471 destroy_context_behavior); 472 473 // Unbind the GL context (if any) that is bound to |cocoa_view_|. 474 void ClearBoundContextDrawable(); 475 476 // Called when a GPU SwapBuffers is received. 477 void GotAcceleratedFrame(); 478 479 // Called when a software DIB is received. 480 void GotSoftwareFrame(); 481 482 // Ack pending SwapBuffers requests, if any, to unblock the GPU process. Has 483 // no effect if there are no pending requests. 484 void AckPendingSwapBuffers(); 485 486 // Ack pending SwapBuffers requests, but no more frequently than the vsync 487 // rate if the renderer is not throttling the swap rate. 488 void ThrottledAckPendingSwapBuffers(); 489 490 void OnPluginFocusChanged(bool focused, int plugin_id); 491 void OnStartPluginIme(); 492 CONTENT_EXPORT void OnAcceleratedSurfaceSetIOSurface( 493 gfx::PluginWindowHandle window, 494 int32 width, 495 int32 height, 496 uint64 mach_port); 497 void OnAcceleratedSurfaceSetTransportDIB(gfx::PluginWindowHandle window, 498 int32 width, 499 int32 height, 500 TransportDIB::Handle transport_dib); 501 void OnAcceleratedSurfaceBuffersSwapped(gfx::PluginWindowHandle window, 502 uint64 surface_handle); 503 504 // Convert |rect| from the views coordinate (upper-left origin) into 505 // the OpenGL coordinate (lower-left origin) and scale for HiDPI displays. 506 gfx::Rect GetScaledOpenGLPixelRect(const gfx::Rect& rect); 507 508 // The associated view. This is weak and is inserted into the view hierarchy 509 // to own this RenderWidgetHostViewMac object. Set to nil at the start of the 510 // destructor. 511 RenderWidgetHostViewCocoa* cocoa_view_; 512 513 // Indicates if the page is loading. 514 bool is_loading_; 515 516 // true if the View is not visible. 517 bool is_hidden_; 518 519 // The text to be shown in the tooltip, supplied by the renderer. 520 string16 tooltip_text_; 521 522 // Factory used to safely scope delayed calls to ShutdownHost(). 523 base::WeakPtrFactory<RenderWidgetHostViewMac> weak_factory_; 524 525 // selected text on the renderer. 526 std::string selected_text_; 527 528 // The window used for popup widgets. 529 base::scoped_nsobject<NSWindow> popup_window_; 530 531 // The fullscreen window used for pepper flash. 532 base::scoped_nsobject<NSWindow> pepper_fullscreen_window_; 533 base::scoped_nsobject<FullscreenWindowManager> fullscreen_window_manager_; 534 // Our parent host view, if this is fullscreen. NULL otherwise. 535 RenderWidgetHostViewMac* fullscreen_parent_host_view_; 536 537 // List of pending swaps for deferred acking: 538 // pairs of (route_id, gpu_host_id). 539 std::list<std::pair<int32, int32> > pending_swap_buffers_acks_; 540 541 // Factory used to cancel outstanding throttled AckPendingSwapBuffers calls. 542 base::WeakPtrFactory<RenderWidgetHostViewMac> 543 pending_swap_buffers_acks_weak_factory_; 544 545 // The earliest time at which the next swap ack may be sent. Only relevant 546 // when swaps are not being throttled by the renderer (when threaded 547 // compositing is off). 548 base::Time next_swap_ack_time_; 549 550 // The current composition character range and its bounds. 551 ui::Range composition_range_; 552 std::vector<gfx::Rect> composition_bounds_; 553 554 // The current caret bounds. 555 gfx::Rect caret_rect_; 556 557 // Subscriber that listens to frame presentation events. 558 scoped_ptr<RenderWidgetHostViewFrameSubscriber> frame_subscriber_; 559 560 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewMac); 561}; 562 563} // namespace content 564 565#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_MAC_H_ 566