blob: 92d3617594e49f5c9b6a392d3dde935c02548159 [file] [log] [blame]
// 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