OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #import <Cocoa/Cocoa.h> | 5 #import <Cocoa/Cocoa.h> |
6 #import <QuartzCore/QuartzCore.h> | 6 #import <QuartzCore/QuartzCore.h> |
7 | 7 |
8 #include "webkit/glue/plugins/webplugin_delegate_impl.h" | 8 #include "webkit/glue/plugins/webplugin_delegate_impl.h" |
9 | 9 |
10 #include <string> | 10 #include <string> |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 return false; | 490 return false; |
491 #ifndef NP_NO_CARBON | 491 #ifndef NP_NO_CARBON |
492 if (instance()->event_model() == NPEventModelCarbon && | 492 if (instance()->event_model() == NPEventModelCarbon && |
493 !np_cg_context_.context) { | 493 !np_cg_context_.context) { |
494 return false; | 494 return false; |
495 } | 495 } |
496 #endif | 496 #endif |
497 | 497 |
498 if (WebInputEvent::isMouseEventType(event.type) || | 498 if (WebInputEvent::isMouseEventType(event.type) || |
499 event.type == WebInputEvent::MouseWheel) { | 499 event.type == WebInputEvent::MouseWheel) { |
500 // Ideally we would compute the content origin from the web event using the | |
501 // code below as a safety net for missed content area location changes. | |
502 // Because of <http://crbug.com/9996>, however, only globalX/Y are right if | |
503 // the page has been zoomed, so for now the coordinates we get aren't | |
504 // trustworthy enough to use for corrections. | |
505 #if PLUGIN_SCALING_FIXED | |
506 // Check our plugin location before we send the event to the plugin, just | 500 // Check our plugin location before we send the event to the plugin, just |
507 // in case we somehow missed a plugin frame change. | 501 // in case we somehow missed a plugin frame change. |
508 const WebMouseEvent* mouse_event = | 502 const WebMouseEvent* mouse_event = |
509 static_cast<const WebMouseEvent*>(&event); | 503 static_cast<const WebMouseEvent*>(&event); |
510 gfx::Point content_origin( | 504 gfx::Point content_origin( |
511 mouse_event->globalX - mouse_event->x - window_rect_.x(), | 505 mouse_event->globalX - mouse_event->x - window_rect_.x(), |
512 mouse_event->globalY - mouse_event->y - window_rect_.y()); | 506 mouse_event->globalY - mouse_event->y - window_rect_.y()); |
513 if (content_origin.x() != content_area_origin_.x() || | 507 if (content_origin.x() != content_area_origin_.x() || |
514 content_origin.y() != content_area_origin_.y()) { | 508 content_origin.y() != content_area_origin_.y()) { |
515 DLOG(WARNING) << "Stale plugin content area location: " | 509 DLOG(WARNING) << "Stale plugin content area location: " |
516 << content_area_origin_ << " instead of " | 510 << content_area_origin_ << " instead of " |
517 << content_origin; | 511 << content_origin; |
518 SetContentAreaOrigin(content_origin); | 512 SetContentAreaOrigin(content_origin); |
519 } | 513 } |
520 #endif | |
521 | 514 |
522 current_windowless_cursor_.GetCursorInfo(cursor_info); | 515 current_windowless_cursor_.GetCursorInfo(cursor_info); |
523 } | 516 } |
524 | 517 |
525 #ifndef NP_NO_CARBON | 518 #ifndef NP_NO_CARBON |
526 if (instance()->event_model() == NPEventModelCarbon) { | 519 if (instance()->event_model() == NPEventModelCarbon) { |
527 #ifndef NP_NO_QUICKDRAW | 520 #ifndef NP_NO_QUICKDRAW |
528 if (instance()->drawing_model() == NPDrawingModelQuickDraw) { | 521 if (instance()->drawing_model() == NPDrawingModelQuickDraw) { |
529 if (quirks_ & PLUGIN_QUIRK_ALLOW_FASTER_QUICKDRAW_PATH) { | 522 if (quirks_ & PLUGIN_QUIRK_ALLOW_FASTER_QUICKDRAW_PATH) { |
530 // Mouse event handling doesn't work correctly in the fast path mode, | 523 // Mouse event handling doesn't work correctly in the fast path mode, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 // When an external drag ends, we need to synthesize a MouseEntered. | 579 // When an external drag ends, we need to synthesize a MouseEntered. |
587 NPCocoaEvent enter_event = *(static_cast<NPCocoaEvent*>(plugin_event)); | 580 NPCocoaEvent enter_event = *(static_cast<NPCocoaEvent*>(plugin_event)); |
588 enter_event.type = NPCocoaEventMouseEntered; | 581 enter_event.type = NPCocoaEventMouseEntered; |
589 NPAPI::ScopedCurrentPluginEvent event_scope(instance(), &enter_event); | 582 NPAPI::ScopedCurrentPluginEvent event_scope(instance(), &enter_event); |
590 instance()->NPP_HandleEvent(&enter_event); | 583 instance()->NPP_HandleEvent(&enter_event); |
591 } | 584 } |
592 return false; | 585 return false; |
593 } | 586 } |
594 } | 587 } |
595 | 588 |
596 #ifndef PLUGIN_SCALING_FIXED | |
597 // Because of <http://crbug.com/9996>, the non-global coordinates we get for | |
598 // zoomed pages are wrong. As a temporary hack around that bug, override the | |
599 // coordinates we are given with ones computed based on our knowledge of where | |
600 // the plugin is on screen. We only need to do this for Cocoa, since Carbon | |
601 // only uses the global coordinates. | |
602 if (instance()->event_model() == NPEventModelCocoa && | |
603 (WebInputEvent::isMouseEventType(event.type) || | |
604 event.type == WebInputEvent::MouseWheel)) { | |
605 const WebMouseEvent* mouse_event = | |
606 static_cast<const WebMouseEvent*>(&event); | |
607 NPCocoaEvent* cocoa_event = static_cast<NPCocoaEvent*>(plugin_event); | |
608 cocoa_event->data.mouse.pluginX = | |
609 mouse_event->globalX - content_area_origin_.x() - window_rect_.x(); | |
610 cocoa_event->data.mouse.pluginY = | |
611 mouse_event->globalY - content_area_origin_.y() - window_rect_.y(); | |
612 } | |
613 #endif | |
614 | |
615 // Send the plugin the event. | 589 // Send the plugin the event. |
616 scoped_ptr<NPAPI::ScopedCurrentPluginEvent> event_scope(NULL); | 590 scoped_ptr<NPAPI::ScopedCurrentPluginEvent> event_scope(NULL); |
617 if (instance()->event_model() == NPEventModelCocoa) { | 591 if (instance()->event_model() == NPEventModelCocoa) { |
618 event_scope.reset(new NPAPI::ScopedCurrentPluginEvent( | 592 event_scope.reset(new NPAPI::ScopedCurrentPluginEvent( |
619 instance(), static_cast<NPCocoaEvent*>(plugin_event))); | 593 instance(), static_cast<NPCocoaEvent*>(plugin_event))); |
620 } | 594 } |
621 bool handled = instance()->NPP_HandleEvent(plugin_event) != 0; | 595 bool handled = instance()->NPP_HandleEvent(plugin_event) != 0; |
622 | 596 |
623 // Plugins don't give accurate information about whether or not they handled | 597 // Plugins don't give accurate information about whether or not they handled |
624 // events, so browsers on the Mac ignore the return value. | 598 // events, so browsers on the Mac ignore the return value. |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1151 return; | 1125 return; |
1152 } | 1126 } |
1153 | 1127 |
1154 qd_manager_->SetFastPathEnabled(enabled); | 1128 qd_manager_->SetFastPathEnabled(enabled); |
1155 qd_port_.port = qd_manager_->port(); | 1129 qd_port_.port = qd_manager_->port(); |
1156 WindowlessSetWindow(); | 1130 WindowlessSetWindow(); |
1157 // Send a paint event so that the new buffer gets updated immediately. | 1131 // Send a paint event so that the new buffer gets updated immediately. |
1158 WindowlessPaint(buffer_context_, clip_rect_); | 1132 WindowlessPaint(buffer_context_, clip_rect_); |
1159 } | 1133 } |
1160 #endif // !NP_NO_QUICKDRAW | 1134 #endif // !NP_NO_QUICKDRAW |
OLD | NEW |