Index: content/browser/devtools/protocol/native_input_event_builder_mac.mm |
diff --git a/content/browser/devtools/protocol/native_input_event_builder_mac.mm b/content/browser/devtools/protocol/native_input_event_builder_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..601ec197b5b0f74b1875c47051bb73b111e1c371 |
--- /dev/null |
+++ b/content/browser/devtools/protocol/native_input_event_builder_mac.mm |
@@ -0,0 +1,49 @@ |
+// Copyright 2017 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 <Cocoa/Cocoa.h> |
+#include "base/strings/sys_string_conversions.h" |
+#include "content/browser/devtools/protocol/native_input_event_builder.h" |
+#include "third_party/WebKit/public/platform/WebInputEvent.h" |
+ |
+namespace content { |
+namespace protocol { |
+ |
+// Mac requires a native event to emulate key events. This method gives |
+// only crude capabilities (see: crbug.com/667387). |
+// The returned object has a retain count of 1. |
+gfx::NativeEvent NativeInputEventBuilder::CreateEvent( |
+ const NativeWebKeyboardEvent& event) { |
+ NSEventType type = NSKeyUp; |
+ if (event.GetType() == blink::WebInputEvent::kRawKeyDown || |
+ event.GetType() == blink::WebInputEvent::kKeyDown) |
+ type = NSKeyDown; |
+ const blink::WebUChar* textStartAddr = &event.text[0]; |
+ const int textLength = |
+ std::find(textStartAddr, |
+ textStartAddr + NativeWebKeyboardEvent::kTextLengthCap, '\0') - |
+ textStartAddr; |
+ NSString* character = |
+ base::SysUTF16ToNSString(base::string16(textStartAddr, textLength)); |
+ int modifiers = event.GetModifiers(); |
+ NSUInteger flags = |
+ (modifiers & blink::WebInputEvent::kShiftKey ? NSShiftKeyMask : 0) | |
+ (modifiers & blink::WebInputEvent::kControlKey ? NSControlKeyMask : 0) | |
+ (modifiers & blink::WebInputEvent::kAltKey ? NSAlternateKeyMask : 0) | |
+ (modifiers & blink::WebInputEvent::kMetaKey ? NSCommandKeyMask : 0); |
+ |
+ return [[NSEvent keyEventWithType:type |
+ location:NSZeroPoint |
+ modifierFlags:flags |
+ timestamp:0 |
+ windowNumber:0 |
+ context:nil |
+ characters:character |
+ charactersIgnoringModifiers:character |
+ isARepeat:NO |
+ keyCode:event.native_key_code] retain]; |
+}; |
+ |
+} // namespace protocol |
+} // namespace content |