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" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 using content::BackingStoreMac; | 69 using content::BackingStoreMac; |
70 using content::BrowserAccessibility; | 70 using content::BrowserAccessibility; |
71 using content::BrowserAccessibilityManager; | 71 using content::BrowserAccessibilityManager; |
72 using content::EditCommand; | 72 using content::EditCommand; |
73 using content::NativeWebKeyboardEvent; | 73 using content::NativeWebKeyboardEvent; |
74 using content::RenderViewHostImpl; | 74 using content::RenderViewHostImpl; |
75 using content::RenderWidgetHostImpl; | 75 using content::RenderWidgetHostImpl; |
76 using content::RenderWidgetHostViewMac; | 76 using content::RenderWidgetHostViewMac; |
77 using content::RenderWidgetHostViewMacEditCommandHelper; | 77 using content::RenderWidgetHostViewMacEditCommandHelper; |
78 using content::TextInputClientMac; | 78 using content::TextInputClientMac; |
79 using WebKit::WebInputEvent; | 79 using blink::WebInputEvent; |
80 using WebKit::WebInputEventFactory; | 80 using blink::WebInputEventFactory; |
81 using WebKit::WebMouseEvent; | 81 using blink::WebMouseEvent; |
82 using WebKit::WebMouseWheelEvent; | 82 using blink::WebMouseWheelEvent; |
83 | 83 |
84 enum CoreAnimationStatus { | 84 enum CoreAnimationStatus { |
85 CORE_ANIMATION_DISABLED, | 85 CORE_ANIMATION_DISABLED, |
86 CORE_ANIMATION_ENABLED_LAZY, | 86 CORE_ANIMATION_ENABLED_LAZY, |
87 CORE_ANIMATION_ENABLED_ALWAYS, | 87 CORE_ANIMATION_ENABLED_ALWAYS, |
88 }; | 88 }; |
89 | 89 |
90 static CoreAnimationStatus GetCoreAnimationStatus() { | 90 static CoreAnimationStatus GetCoreAnimationStatus() { |
91 // TODO(sail) Remove this. | 91 // TODO(sail) Remove this. |
92 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 92 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 } | 280 } |
281 | 281 |
282 @end | 282 @end |
283 | 283 |
284 namespace { | 284 namespace { |
285 | 285 |
286 // Maximum number of characters we allow in a tooltip. | 286 // Maximum number of characters we allow in a tooltip. |
287 const size_t kMaxTooltipLength = 1024; | 287 const size_t kMaxTooltipLength = 1024; |
288 | 288 |
289 // TODO(suzhe): Upstream this function. | 289 // TODO(suzhe): Upstream this function. |
290 WebKit::WebColor WebColorFromNSColor(NSColor *color) { | 290 blink::WebColor WebColorFromNSColor(NSColor *color) { |
291 CGFloat r, g, b, a; | 291 CGFloat r, g, b, a; |
292 [color getRed:&r green:&g blue:&b alpha:&a]; | 292 [color getRed:&r green:&g blue:&b alpha:&a]; |
293 | 293 |
294 return | 294 return |
295 std::max(0, std::min(static_cast<int>(lroundf(255.0f * a)), 255)) << 24 | | 295 std::max(0, std::min(static_cast<int>(lroundf(255.0f * a)), 255)) << 24 | |
296 std::max(0, std::min(static_cast<int>(lroundf(255.0f * r)), 255)) << 16 | | 296 std::max(0, std::min(static_cast<int>(lroundf(255.0f * r)), 255)) << 16 | |
297 std::max(0, std::min(static_cast<int>(lroundf(255.0f * g)), 255)) << 8 | | 297 std::max(0, std::min(static_cast<int>(lroundf(255.0f * g)), 255)) << 8 | |
298 std::max(0, std::min(static_cast<int>(lroundf(255.0f * b)), 255)); | 298 std::max(0, std::min(static_cast<int>(lroundf(255.0f * b)), 255)); |
299 } | 299 } |
300 | 300 |
301 // Extract underline information from an attributed string. Mostly copied from | 301 // Extract underline information from an attributed string. Mostly copied from |
302 // third_party/WebKit/Source/WebKit/mac/WebView/WebHTMLView.mm | 302 // third_party/WebKit/Source/WebKit/mac/WebView/WebHTMLView.mm |
303 void ExtractUnderlines( | 303 void ExtractUnderlines( |
304 NSAttributedString* string, | 304 NSAttributedString* string, |
305 std::vector<WebKit::WebCompositionUnderline>* underlines) { | 305 std::vector<blink::WebCompositionUnderline>* underlines) { |
306 int length = [[string string] length]; | 306 int length = [[string string] length]; |
307 int i = 0; | 307 int i = 0; |
308 while (i < length) { | 308 while (i < length) { |
309 NSRange range; | 309 NSRange range; |
310 NSDictionary* attrs = [string attributesAtIndex:i | 310 NSDictionary* attrs = [string attributesAtIndex:i |
311 longestEffectiveRange:&range | 311 longestEffectiveRange:&range |
312 inRange:NSMakeRange(i, length - i)]; | 312 inRange:NSMakeRange(i, length - i)]; |
313 if (NSNumber *style = [attrs objectForKey:NSUnderlineStyleAttributeName]) { | 313 if (NSNumber *style = [attrs objectForKey:NSUnderlineStyleAttributeName]) { |
314 WebKit::WebColor color = SK_ColorBLACK; | 314 blink::WebColor color = SK_ColorBLACK; |
315 if (NSColor *colorAttr = | 315 if (NSColor *colorAttr = |
316 [attrs objectForKey:NSUnderlineColorAttributeName]) { | 316 [attrs objectForKey:NSUnderlineColorAttributeName]) { |
317 color = WebColorFromNSColor( | 317 color = WebColorFromNSColor( |
318 [colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]); | 318 [colorAttr colorUsingColorSpaceName:NSDeviceRGBColorSpace]); |
319 } | 319 } |
320 underlines->push_back(WebKit::WebCompositionUnderline( | 320 underlines->push_back(blink::WebCompositionUnderline( |
321 range.location, NSMaxRange(range), color, [style intValue] > 1)); | 321 range.location, NSMaxRange(range), color, [style intValue] > 1)); |
322 } | 322 } |
323 i = range.location + range.length; | 323 i = range.location + range.length; |
324 } | 324 } |
325 } | 325 } |
326 | 326 |
327 // EnablePasswordInput() and DisablePasswordInput() are copied from | 327 // EnablePasswordInput() and DisablePasswordInput() are copied from |
328 // enableSecureTextInput() and disableSecureTextInput() functions in | 328 // enableSecureTextInput() and disableSecureTextInput() functions in |
329 // third_party/WebKit/WebCore/platform/SecureTextInput.cpp | 329 // third_party/WebKit/WebCore/platform/SecureTextInput.cpp |
330 // But we don't call EnableSecureEventInput() and DisableSecureEventInput() | 330 // But we don't call EnableSecureEventInput() and DisableSecureEventInput() |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 // case from extension popup windows. | 367 // case from extension popup windows. |
368 NSWindow* ancestor_window = [enclosing_window parentWindow]; | 368 NSWindow* ancestor_window = [enclosing_window parentWindow]; |
369 if (ancestor_window && (NSWidth([enclosing_window frame]) == | 369 if (ancestor_window && (NSWidth([enclosing_window frame]) == |
370 NSWidth([ancestor_window frame]))) { | 370 NSWidth([ancestor_window frame]))) { |
371 enclosing_window = ancestor_window; | 371 enclosing_window = ancestor_window; |
372 } | 372 } |
373 | 373 |
374 return enclosing_window; | 374 return enclosing_window; |
375 } | 375 } |
376 | 376 |
377 WebKit::WebScreenInfo GetWebScreenInfo(NSView* view) { | 377 blink::WebScreenInfo GetWebScreenInfo(NSView* view) { |
378 gfx::Display display = | 378 gfx::Display display = |
379 gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow(view); | 379 gfx::Screen::GetNativeScreen()->GetDisplayNearestWindow(view); |
380 | 380 |
381 NSScreen* screen = [NSScreen deepestScreen]; | 381 NSScreen* screen = [NSScreen deepestScreen]; |
382 | 382 |
383 WebKit::WebScreenInfo results; | 383 blink::WebScreenInfo results; |
384 | 384 |
385 results.deviceScaleFactor = static_cast<int>(display.device_scale_factor()); | 385 results.deviceScaleFactor = static_cast<int>(display.device_scale_factor()); |
386 results.depth = NSBitsPerPixelFromDepth([screen depth]); | 386 results.depth = NSBitsPerPixelFromDepth([screen depth]); |
387 results.depthPerComponent = NSBitsPerSampleFromDepth([screen depth]); | 387 results.depthPerComponent = NSBitsPerSampleFromDepth([screen depth]); |
388 results.isMonochrome = | 388 results.isMonochrome = |
389 [[screen colorSpace] colorSpaceModel] == NSGrayColorSpaceModel; | 389 [[screen colorSpace] colorSpaceModel] == NSGrayColorSpaceModel; |
390 results.rect = display.bounds(); | 390 results.rect = display.bounds(); |
391 results.availableRect = display.work_area(); | 391 results.availableRect = display.work_area(); |
392 return results; | 392 return results; |
393 } | 393 } |
394 | 394 |
395 } // namespace | 395 } // namespace |
396 | 396 |
397 namespace content { | 397 namespace content { |
398 | 398 |
399 /////////////////////////////////////////////////////////////////////////////// | 399 /////////////////////////////////////////////////////////////////////////////// |
400 // RenderWidgetHostView, public: | 400 // RenderWidgetHostView, public: |
401 | 401 |
402 // static | 402 // static |
403 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( | 403 RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget( |
404 RenderWidgetHost* widget) { | 404 RenderWidgetHost* widget) { |
405 return new RenderWidgetHostViewMac(widget); | 405 return new RenderWidgetHostViewMac(widget); |
406 } | 406 } |
407 | 407 |
408 // static | 408 // static |
409 void RenderWidgetHostViewPort::GetDefaultScreenInfo( | 409 void RenderWidgetHostViewPort::GetDefaultScreenInfo( |
410 WebKit::WebScreenInfo* results) { | 410 blink::WebScreenInfo* results) { |
411 *results = GetWebScreenInfo(NULL); | 411 *results = GetWebScreenInfo(NULL); |
412 } | 412 } |
413 | 413 |
414 /////////////////////////////////////////////////////////////////////////////// | 414 /////////////////////////////////////////////////////////////////////////////// |
415 // RenderWidgetHostViewMac, public: | 415 // RenderWidgetHostViewMac, public: |
416 | 416 |
417 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) | 417 RenderWidgetHostViewMac::RenderWidgetHostViewMac(RenderWidgetHost* widget) |
418 : render_widget_host_(RenderWidgetHostImpl::From(widget)), | 418 : render_widget_host_(RenderWidgetHostImpl::From(widget)), |
419 about_to_validate_and_paint_(false), | 419 about_to_validate_and_paint_(false), |
420 call_set_needs_display_in_rect_pending_(false), | 420 call_set_needs_display_in_rect_pending_(false), |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 return handled; | 619 return handled; |
620 } | 620 } |
621 | 621 |
622 void RenderWidgetHostViewMac::InitAsChild( | 622 void RenderWidgetHostViewMac::InitAsChild( |
623 gfx::NativeView parent_view) { | 623 gfx::NativeView parent_view) { |
624 } | 624 } |
625 | 625 |
626 void RenderWidgetHostViewMac::InitAsPopup( | 626 void RenderWidgetHostViewMac::InitAsPopup( |
627 RenderWidgetHostView* parent_host_view, | 627 RenderWidgetHostView* parent_host_view, |
628 const gfx::Rect& pos) { | 628 const gfx::Rect& pos) { |
629 bool activatable = popup_type_ == WebKit::WebPopupTypeNone; | 629 bool activatable = popup_type_ == blink::WebPopupTypeNone; |
630 [cocoa_view_ setCloseOnDeactivate:YES]; | 630 [cocoa_view_ setCloseOnDeactivate:YES]; |
631 [cocoa_view_ setCanBeKeyView:activatable ? YES : NO]; | 631 [cocoa_view_ setCanBeKeyView:activatable ? YES : NO]; |
632 | 632 |
633 NSPoint origin_global = NSPointFromCGPoint(pos.origin().ToCGPoint()); | 633 NSPoint origin_global = NSPointFromCGPoint(pos.origin().ToCGPoint()); |
634 if ([[NSScreen screens] count] > 0) { | 634 if ([[NSScreen screens] count] > 0) { |
635 origin_global.y = [[[NSScreen screens] objectAtIndex:0] frame].size.height - | 635 origin_global.y = [[[NSScreen screens] objectAtIndex:0] frame].size.height - |
636 pos.height() - origin_global.y; | 636 pos.height() - origin_global.y; |
637 } | 637 } |
638 | 638 |
639 popup_window_.reset([[RenderWidgetPopupWindow alloc] | 639 popup_window_.reset([[RenderWidgetPopupWindow alloc] |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 clickCount:0 | 1132 clickCount:0 |
1133 pressure:0]; | 1133 pressure:0]; |
1134 WebMouseEvent web_event = | 1134 WebMouseEvent web_event = |
1135 WebInputEventFactory::mouseEvent(event, cocoa_view_); | 1135 WebInputEventFactory::mouseEvent(event, cocoa_view_); |
1136 if (showing) | 1136 if (showing) |
1137 web_event.type = WebInputEvent::MouseLeave; | 1137 web_event.type = WebInputEvent::MouseLeave; |
1138 ForwardMouseEvent(web_event); | 1138 ForwardMouseEvent(web_event); |
1139 } | 1139 } |
1140 | 1140 |
1141 bool RenderWidgetHostViewMac::IsPopup() const { | 1141 bool RenderWidgetHostViewMac::IsPopup() const { |
1142 return popup_type_ != WebKit::WebPopupTypeNone; | 1142 return popup_type_ != blink::WebPopupTypeNone; |
1143 } | 1143 } |
1144 | 1144 |
1145 BackingStore* RenderWidgetHostViewMac::AllocBackingStore( | 1145 BackingStore* RenderWidgetHostViewMac::AllocBackingStore( |
1146 const gfx::Size& size) { | 1146 const gfx::Size& size) { |
1147 float scale = ScaleFactor(cocoa_view_); | 1147 float scale = ScaleFactor(cocoa_view_); |
1148 return new BackingStoreMac(render_widget_host_, size, scale); | 1148 return new BackingStoreMac(render_widget_host_, size, scale); |
1149 } | 1149 } |
1150 | 1150 |
1151 void RenderWidgetHostViewMac::CopyFromCompositingSurface( | 1151 void RenderWidgetHostViewMac::CopyFromCompositingSurface( |
1152 const gfx::Rect& src_subrect, | 1152 const gfx::Rect& src_subrect, |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1696 } | 1696 } |
1697 software_frame_manager_->SwapToNewFrameComplete( | 1697 software_frame_manager_->SwapToNewFrameComplete( |
1698 !render_widget_host_->is_hidden()); | 1698 !render_widget_host_->is_hidden()); |
1699 | 1699 |
1700 [cocoa_view_ setNeedsDisplay:YES]; | 1700 [cocoa_view_ setNeedsDisplay:YES]; |
1701 } | 1701 } |
1702 | 1702 |
1703 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { | 1703 void RenderWidgetHostViewMac::OnAcceleratedCompositingStateChange() { |
1704 } | 1704 } |
1705 | 1705 |
1706 void RenderWidgetHostViewMac::GetScreenInfo(WebKit::WebScreenInfo* results) { | 1706 void RenderWidgetHostViewMac::GetScreenInfo(blink::WebScreenInfo* results) { |
1707 *results = GetWebScreenInfo(GetNativeView()); | 1707 *results = GetWebScreenInfo(GetNativeView()); |
1708 } | 1708 } |
1709 | 1709 |
1710 gfx::Rect RenderWidgetHostViewMac::GetBoundsInRootWindow() { | 1710 gfx::Rect RenderWidgetHostViewMac::GetBoundsInRootWindow() { |
1711 // TODO(shess): In case of !window, the view has been removed from | 1711 // TODO(shess): In case of !window, the view has been removed from |
1712 // the view hierarchy because the tab isn't main. Could retrieve | 1712 // the view hierarchy because the tab isn't main. Could retrieve |
1713 // the information from the main tab for our window. | 1713 // the information from the main tab for our window. |
1714 NSWindow* enclosing_window = ApparentWindowForView(cocoa_view_); | 1714 NSWindow* enclosing_window = ApparentWindowForView(cocoa_view_); |
1715 if (!enclosing_window) | 1715 if (!enclosing_window) |
1716 return gfx::Rect(); | 1716 return gfx::Rect(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1759 | 1759 |
1760 // Unlock position of mouse cursor and unhide it. | 1760 // Unlock position of mouse cursor and unhide it. |
1761 CGAssociateMouseAndMouseCursorPosition(YES); | 1761 CGAssociateMouseAndMouseCursorPosition(YES); |
1762 [NSCursor unhide]; | 1762 [NSCursor unhide]; |
1763 | 1763 |
1764 if (render_widget_host_) | 1764 if (render_widget_host_) |
1765 render_widget_host_->LostMouseLock(); | 1765 render_widget_host_->LostMouseLock(); |
1766 } | 1766 } |
1767 | 1767 |
1768 void RenderWidgetHostViewMac::UnhandledWheelEvent( | 1768 void RenderWidgetHostViewMac::UnhandledWheelEvent( |
1769 const WebKit::WebMouseWheelEvent& event) { | 1769 const blink::WebMouseWheelEvent& event) { |
1770 // Only record a wheel event as unhandled if JavaScript handlers got a chance | 1770 // Only record a wheel event as unhandled if JavaScript handlers got a chance |
1771 // to see it (no-op wheel events are ignored by the event dispatcher) | 1771 // to see it (no-op wheel events are ignored by the event dispatcher) |
1772 if (event.deltaX || event.deltaY) | 1772 if (event.deltaX || event.deltaY) |
1773 [cocoa_view_ gotUnhandledWheelEvent]; | 1773 [cocoa_view_ gotUnhandledWheelEvent]; |
1774 } | 1774 } |
1775 | 1775 |
1776 bool RenderWidgetHostViewMac::Send(IPC::Message* message) { | 1776 bool RenderWidgetHostViewMac::Send(IPC::Message* message) { |
1777 if (render_widget_host_) | 1777 if (render_widget_host_) |
1778 return render_widget_host_->Send(message); | 1778 return render_widget_host_->Send(message); |
1779 delete message; | 1779 delete message; |
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2406 // edit commands, then we need to send the real key event and corresponding | 2406 // edit commands, then we need to send the real key event and corresponding |
2407 // edit commands here. This usually occurs when the input method wants to | 2407 // edit commands here. This usually occurs when the input method wants to |
2408 // finish current composition session but still wants the application to | 2408 // finish current composition session but still wants the application to |
2409 // handle the key event. See http://crbug.com/48161 for reference. | 2409 // handle the key event. See http://crbug.com/48161 for reference. |
2410 if (delayEventUntilAfterImeCompostion) { | 2410 if (delayEventUntilAfterImeCompostion) { |
2411 // If |delayEventUntilAfterImeCompostion| is YES, then a fake key down event | 2411 // If |delayEventUntilAfterImeCompostion| is YES, then a fake key down event |
2412 // with windowsKeyCode == 0xE5 has already been sent to webkit. | 2412 // with windowsKeyCode == 0xE5 has already been sent to webkit. |
2413 // So before sending the real key down event, we need to send a fake key up | 2413 // So before sending the real key down event, we need to send a fake key up |
2414 // event to balance it. | 2414 // event to balance it. |
2415 NativeWebKeyboardEvent fakeEvent = event; | 2415 NativeWebKeyboardEvent fakeEvent = event; |
2416 fakeEvent.type = WebKit::WebInputEvent::KeyUp; | 2416 fakeEvent.type = blink::WebInputEvent::KeyUp; |
2417 fakeEvent.skip_in_browser = true; | 2417 fakeEvent.skip_in_browser = true; |
2418 widgetHost->ForwardKeyboardEvent(fakeEvent); | 2418 widgetHost->ForwardKeyboardEvent(fakeEvent); |
2419 // Not checking |renderWidgetHostView_->render_widget_host_| here because | 2419 // Not checking |renderWidgetHostView_->render_widget_host_| here because |
2420 // a key event with |skip_in_browser| == true won't be handled by browser, | 2420 // a key event with |skip_in_browser| == true won't be handled by browser, |
2421 // thus it won't destroy the widget. | 2421 // thus it won't destroy the widget. |
2422 | 2422 |
2423 if (!editCommands_.empty()) { | 2423 if (!editCommands_.empty()) { |
2424 widgetHost->Send(new InputMsg_SetEditCommandsForNextKeyEvent( | 2424 widgetHost->Send(new InputMsg_SetEditCommandsForNextKeyEvent( |
2425 widgetHost->GetRoutingID(), editCommands_)); | 2425 widgetHost->GetRoutingID(), editCommands_)); |
2426 } | 2426 } |
2427 widgetHost->ForwardKeyboardEvent(event); | 2427 widgetHost->ForwardKeyboardEvent(event); |
2428 | 2428 |
2429 // Calling ForwardKeyboardEvent() could have destroyed the widget. When the | 2429 // Calling ForwardKeyboardEvent() could have destroyed the widget. When the |
2430 // widget was destroyed, |renderWidgetHostView_->render_widget_host_| will | 2430 // widget was destroyed, |renderWidgetHostView_->render_widget_host_| will |
2431 // be set to NULL. So we check it here and return immediately if it's NULL. | 2431 // be set to NULL. So we check it here and return immediately if it's NULL. |
2432 if (!renderWidgetHostView_->render_widget_host_) | 2432 if (!renderWidgetHostView_->render_widget_host_) |
2433 return; | 2433 return; |
2434 } | 2434 } |
2435 | 2435 |
2436 const NSUInteger kCtrlCmdKeyMask = NSControlKeyMask | NSCommandKeyMask; | 2436 const NSUInteger kCtrlCmdKeyMask = NSControlKeyMask | NSCommandKeyMask; |
2437 // Only send a corresponding key press event if there is no marked text. | 2437 // Only send a corresponding key press event if there is no marked text. |
2438 if (!hasMarkedText_) { | 2438 if (!hasMarkedText_) { |
2439 if (!textInserted && textToBeInserted_.length() == 1) { | 2439 if (!textInserted && textToBeInserted_.length() == 1) { |
2440 // If a single character was inserted, then we just send it as a keypress | 2440 // If a single character was inserted, then we just send it as a keypress |
2441 // event. | 2441 // event. |
2442 event.type = WebKit::WebInputEvent::Char; | 2442 event.type = blink::WebInputEvent::Char; |
2443 event.text[0] = textToBeInserted_[0]; | 2443 event.text[0] = textToBeInserted_[0]; |
2444 event.text[1] = 0; | 2444 event.text[1] = 0; |
2445 event.skip_in_browser = true; | 2445 event.skip_in_browser = true; |
2446 widgetHost->ForwardKeyboardEvent(event); | 2446 widgetHost->ForwardKeyboardEvent(event); |
2447 } else if ((!textInserted || delayEventUntilAfterImeCompostion) && | 2447 } else if ((!textInserted || delayEventUntilAfterImeCompostion) && |
2448 [[theEvent characters] length] > 0 && | 2448 [[theEvent characters] length] > 0 && |
2449 (([theEvent modifierFlags] & kCtrlCmdKeyMask) || | 2449 (([theEvent modifierFlags] & kCtrlCmdKeyMask) || |
2450 (hasEditCommands_ && editCommands_.empty()))) { | 2450 (hasEditCommands_ && editCommands_.empty()))) { |
2451 // We don't get insertText: calls if ctrl or cmd is down, or the key event | 2451 // We don't get insertText: calls if ctrl or cmd is down, or the key event |
2452 // generates an insert command. So synthesize a keypress event for these | 2452 // generates an insert command. So synthesize a keypress event for these |
2453 // cases, unless the key event generated any other command. | 2453 // cases, unless the key event generated any other command. |
2454 event.type = WebKit::WebInputEvent::Char; | 2454 event.type = blink::WebInputEvent::Char; |
2455 event.skip_in_browser = true; | 2455 event.skip_in_browser = true; |
2456 widgetHost->ForwardKeyboardEvent(event); | 2456 widgetHost->ForwardKeyboardEvent(event); |
2457 } | 2457 } |
2458 } | 2458 } |
2459 | 2459 |
2460 // Possibly autohide the cursor. | 2460 // Possibly autohide the cursor. |
2461 if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) | 2461 if ([RenderWidgetHostViewCocoa shouldAutohideCursorForEvent:theEvent]) |
2462 [NSCursor setHiddenUntilMouseMoves:YES]; | 2462 [NSCursor setHiddenUntilMouseMoves:YES]; |
2463 } | 2463 } |
2464 | 2464 |
(...skipping 1066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3531 selectedRange_ = newSelRange; | 3531 selectedRange_ = newSelRange; |
3532 markedText_ = base::SysNSStringToUTF16(im_text); | 3532 markedText_ = base::SysNSStringToUTF16(im_text); |
3533 hasMarkedText_ = (length > 0); | 3533 hasMarkedText_ = (length > 0); |
3534 | 3534 |
3535 underlines_.clear(); | 3535 underlines_.clear(); |
3536 if (isAttributedString) { | 3536 if (isAttributedString) { |
3537 ExtractUnderlines(string, &underlines_); | 3537 ExtractUnderlines(string, &underlines_); |
3538 } else { | 3538 } else { |
3539 // Use a thin black underline by default. | 3539 // Use a thin black underline by default. |
3540 underlines_.push_back( | 3540 underlines_.push_back( |
3541 WebKit::WebCompositionUnderline(0, length, SK_ColorBLACK, false)); | 3541 blink::WebCompositionUnderline(0, length, SK_ColorBLACK, false)); |
3542 } | 3542 } |
3543 | 3543 |
3544 // If we are handling a key down event, then SetComposition() will be | 3544 // If we are handling a key down event, then SetComposition() will be |
3545 // called in keyEvent: method. | 3545 // called in keyEvent: method. |
3546 // Input methods of Mac use setMarkedText calls with an empty text to cancel | 3546 // Input methods of Mac use setMarkedText calls with an empty text to cancel |
3547 // an ongoing composition. So, we should check whether or not the given text | 3547 // an ongoing composition. So, we should check whether or not the given text |
3548 // is empty to update the input method state. (Our input method backend can | 3548 // is empty to update the input method state. (Our input method backend can |
3549 // automatically cancels an ongoing composition when we send an empty text. | 3549 // automatically cancels an ongoing composition when we send an empty text. |
3550 // So, it is OK to send an empty text to the renderer.) | 3550 // So, it is OK to send an empty text to the renderer.) |
3551 if (!handlingKeyDown_) { | 3551 if (!handlingKeyDown_) { |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3929 return YES; | 3929 return YES; |
3930 } | 3930 } |
3931 | 3931 |
3932 - (BOOL)isOpaque { | 3932 - (BOOL)isOpaque { |
3933 if (renderWidgetHostView_->use_core_animation_) | 3933 if (renderWidgetHostView_->use_core_animation_) |
3934 return YES; | 3934 return YES; |
3935 return [super isOpaque]; | 3935 return [super isOpaque]; |
3936 } | 3936 } |
3937 | 3937 |
3938 @end | 3938 @end |
OLD | NEW |