Index: content/browser/renderer_host/input/synthetic_gesture_target_mac.mm |
diff --git a/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm b/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92d3617594e49f5c9b6a392d3dde935c02548159 |
--- /dev/null |
+++ b/content/browser/renderer_host/input/synthetic_gesture_target_mac.mm |
@@ -0,0 +1,122 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/renderer_host/input/synthetic_gesture_target_mac.h" |
+ |
+#include "base/mac/scoped_nsautorelease_pool.h" |
+#include "content/browser/renderer_host/render_widget_host_impl.h" |
+ |
+// Unlike some event APIs, Apple does not provide a way to programmatically |
+// build a zoom event. To work around this, we leverage ObjectiveC's flexible |
+// typing and build up an object with the right interface to provide a zoom |
+// event. |
+@interface SyntheticPinchEvent : NSObject |
+ |
+// Populated based on desired zoom level. |
+@property CGFloat magnification; |
+@property NSPoint locationInWindow; |
+@property NSEventType type; |
+ |
+// Filled with default values. |
+@property(readonly) CGFloat deltaX; |
+@property(readonly) CGFloat deltaY; |
+@property(readonly) NSEventModifierFlags modifierFlags; |
+@property(readonly) NSTimeInterval timestamp; |
+ |
+@end |
+ |
+@implementation SyntheticPinchEvent |
+ |
+@synthesize magnification = magnification_; |
+@synthesize locationInWindow = locationInWindow_; |
+@synthesize type = type_; |
+@synthesize deltaX = deltaX_; |
+@synthesize deltaY = deltaY_; |
+@synthesize modifierFlags = modifierFlags_; |
+@synthesize timestamp = timestamp_; |
+ |
+- (id)initWithMagnification:(float)magnification |
+ locationInWindow:(NSPoint)location { |
+ self = [super init]; |
+ if (self) { |
+ type_ = NSEventTypeMagnify; |
+ magnification_ = magnification; |
+ locationInWindow_ = location; |
+ |
+ deltaX_ = 0; |
+ deltaY_ = 0; |
+ modifierFlags_ = 0; |
+ |
+ // Default timestamp to current time. |
+ timestamp_ = [[NSDate date] timeIntervalSince1970]; |
+ } |
+ |
+ return self; |
+} |
+ |
++ (id)eventWithMagnification:(float)magnification |
+ locationInWindow:(NSPoint)location { |
+ SyntheticPinchEvent* event = |
+ [[SyntheticPinchEvent alloc] initWithMagnification:magnification |
+ locationInWindow:location]; |
+ return [event autorelease]; |
+} |
+ |
+@end |
+ |
+using blink::WebInputEvent; |
+using blink::WebGestureEvent; |
+ |
+namespace content { |
+ |
+SyntheticGestureTargetMac::SyntheticGestureTargetMac( |
+ RenderWidgetHostImpl* host, |
+ RenderWidgetHostViewCocoa* cocoa_view) |
+ : SyntheticGestureTargetBase(host), cocoa_view_(cocoa_view) {} |
+ |
+void SyntheticGestureTargetMac::DispatchInputEventToPlatform( |
+ const WebInputEvent& event) { |
+ if (WebInputEvent::isGestureEventType(event.type)) { |
+ // Create an autorelease pool so that we clean up any synthetic events we |
+ // generate. |
+ base::mac::ScopedNSAutoreleasePool pool; |
+ |
+ const WebGestureEvent* gesture_event = |
+ static_cast<const WebGestureEvent*>(&event); |
+ |
+ switch (event.type) { |
+ case WebInputEvent::GesturePinchBegin: { |
+ id event = [SyntheticPinchEvent |
+ eventWithMagnification:0.0f |
+ locationInWindow:NSMakePoint(gesture_event->x, |
+ gesture_event->y)]; |
+ [cocoa_view_ beginGestureWithEvent:event]; |
+ return; |
+ } |
+ case WebInputEvent::GesturePinchEnd: { |
+ id event = [SyntheticPinchEvent |
+ eventWithMagnification:0.0f |
+ locationInWindow:NSMakePoint(gesture_event->x, |
+ gesture_event->y)]; |
+ [cocoa_view_ endGestureWithEvent:event]; |
+ return; |
+ } |
+ case WebInputEvent::GesturePinchUpdate: { |
+ id event = [SyntheticPinchEvent |
+ eventWithMagnification:gesture_event->data.pinchUpdate.scale - 1.0f |
+ locationInWindow:NSMakePoint(gesture_event->x, |
+ gesture_event->y)]; |
+ [cocoa_view_ magnifyWithEvent:event]; |
+ return; |
+ } |
+ default: |
+ break; |
+ } |
+ } |
+ |
+ // This event wasn't handled yet, forward to the base class. |
+ SyntheticGestureTargetBase::DispatchInputEventToPlatform(event); |
+} |
+ |
+} // namespace content |