Make all ScriptWrappable IsoHeap-ed
[WebKit-https.git] / Source / WebCore / dom / KeyboardEvent.cpp
index ae6edfb..0f294fc 100644 (file)
@@ -1,8 +1,8 @@
-/**
+/*
  * Copyright (C) 2001 Peter Kelly (pmk@post.com)
  * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de)
  * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
- * Copyright (C) 2003, 2005, 2006, 2007, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2003-2018 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 #include "config.h"
 #include "KeyboardEvent.h"
 
+#include "DOMWindow.h"
 #include "Document.h"
 #include "Editor.h"
-#include "EventDispatcher.h"
 #include "EventHandler.h"
 #include "EventNames.h"
 #include "Frame.h"
 #include "PlatformKeyboardEvent.h"
 #include "WindowsKeyboardCodes.h"
+#include <wtf/IsoMallocInlines.h>
 
 namespace WebCore {
 
-static inline const AtomicString& eventTypeForKeyboardEventType(PlatformEvent::Type type)
+WTF_MAKE_ISO_ALLOCATED_IMPL(KeyboardEvent);
+
+static inline const AtomString& eventTypeForKeyboardEventType(PlatformEvent::Type type)
 {
     switch (type) {
         case PlatformEvent::KeyUp:
@@ -91,13 +94,12 @@ static inline KeyboardEvent::KeyLocationCode keyLocationCode(const PlatformKeybo
     }
 }
 
-KeyboardEvent::KeyboardEvent() = default;
+inline KeyboardEvent::KeyboardEvent() = default;
 
-KeyboardEvent::KeyboardEvent(const PlatformKeyboardEvent& key, DOMWindow* view)
-    : UIEventWithKeyState(eventTypeForKeyboardEventType(key.type())
-        , true, true, key.timestamp().approximateMonotonicTime(), view, 0, key.ctrlKey(), key.altKey(), key.shiftKey()
-        , key.metaKey(), false, key.modifiers().contains(PlatformEvent::Modifier::CapsLockKey))
-    , m_keyEvent(std::make_unique<PlatformKeyboardEvent>(key))
+inline KeyboardEvent::KeyboardEvent(const PlatformKeyboardEvent& key, RefPtr<WindowProxy>&& view)
+    : UIEventWithKeyState(eventTypeForKeyboardEventType(key.type()), CanBubble::Yes, IsCancelable::Yes, IsComposed::Yes,
+        key.timestamp().approximateMonotonicTime(), view.copyRef(), 0, key.modifiers(), IsTrusted::Yes)
+    , m_underlyingPlatformEvent(makeUnique<PlatformKeyboardEvent>(key))
 #if ENABLE(KEYBOARD_KEY_ATTRIBUTE)
     , m_key(key.key())
 #endif
@@ -107,26 +109,18 @@ KeyboardEvent::KeyboardEvent(const PlatformKeyboardEvent& key, DOMWindow* view)
     , m_keyIdentifier(key.keyIdentifier())
     , m_location(keyLocationCode(key))
     , m_repeat(key.isAutoRepeat())
-    , m_isComposing(view && view->frame() && view->frame()->editor().hasComposition())
-#if PLATFORM(COCOA)
-#if USE(APPKIT)
+    , m_isComposing(view && is<DOMWindow>(view->window()) && downcast<DOMWindow>(*view->window()).frame() && downcast<DOMWindow>(*view->window()).frame()->editor().hasComposition())
+#if USE(APPKIT) || USE(UIKIT_KEYBOARD_ADDITIONS)
     , m_handledByInputMethod(key.handledByInputMethod())
-    , m_keypressCommands(key.commands())
-#else
-    , m_handledByInputMethod(false)
 #endif
+#if USE(APPKIT)
+    , m_keypressCommands(key.commands())
 #endif
 {
 }
 
-// FIXME: This method should be get ride of in the future.
-// DO NOT USE IT!
-KeyboardEvent::KeyboardEvent(WTF::HashTableDeletedValueType)
-{
-}
-
-KeyboardEvent::KeyboardEvent(const AtomicString& eventType, const Init& initializer, IsTrusted isTrusted)
-    : UIEventWithKeyState(eventType, initializer, isTrusted)
+inline KeyboardEvent::KeyboardEvent(const AtomString& eventType, const Init& initializer)
+    : UIEventWithKeyState(eventType, initializer)
 #if ENABLE(KEYBOARD_KEY_ATTRIBUTE)
     , m_key(initializer.key)
 #endif
@@ -140,48 +134,58 @@ KeyboardEvent::KeyboardEvent(const AtomicString& eventType, const Init& initiali
     , m_charCode(initializer.charCode)
     , m_keyCode(initializer.keyCode)
     , m_which(initializer.which)
-#if PLATFORM(COCOA)
-    , m_handledByInputMethod(false)
-#endif
 {
 }
 
 KeyboardEvent::~KeyboardEvent() = default;
 
-void KeyboardEvent::initKeyboardEvent(const AtomicString& type, bool canBubble, bool cancelable, DOMWindow* view,
-                                      const String &keyIdentifier, unsigned location,
-                                      bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey)
+Ref<KeyboardEvent> KeyboardEvent::create(const PlatformKeyboardEvent& platformEvent, RefPtr<WindowProxy>&& view)
+{
+    return adoptRef(*new KeyboardEvent(platformEvent, WTFMove(view)));
+}
+
+Ref<KeyboardEvent> KeyboardEvent::createForBindings()
 {
-    if (dispatched())
+    return adoptRef(*new KeyboardEvent);
+}
+
+Ref<KeyboardEvent> KeyboardEvent::create(const AtomString& type, const Init& initializer)
+{
+    return adoptRef(*new KeyboardEvent(type, initializer));
+}
+
+void KeyboardEvent::initKeyboardEvent(const AtomString& type, bool canBubble, bool cancelable, RefPtr<WindowProxy>&& view,
+    const String& keyIdentifier, unsigned location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey)
+{
+    if (isBeingDispatched())
         return;
 
-    initUIEvent(type, canBubble, cancelable, view, 0);
+    initUIEvent(type, canBubble, cancelable, WTFMove(view), 0);
 
     m_keyIdentifier = keyIdentifier;
     m_location = location;
-    m_ctrlKey = ctrlKey;
-    m_shiftKey = shiftKey;
-    m_altKey = altKey;
-    m_metaKey = metaKey;
-    m_altGraphKey = altGraphKey;
-}
 
-bool KeyboardEvent::getModifierState(const String& keyIdentifier) const
-{
-    if (keyIdentifier == "Control")
-        return ctrlKey();
-    if (keyIdentifier == "Shift")
-        return shiftKey();
-    if (keyIdentifier == "Alt")
-        return altKey();
-    if (keyIdentifier == "Meta")
-        return metaKey();
-    if (keyIdentifier == "AltGraph")
-        return altGraphKey();
-    if (keyIdentifier == "CapsLock")
-        return capsLockKey();
-    // FIXME: The specification also has Fn, FnLock, Hyper, NumLock, Super, ScrollLock, Symbol, SymbolLock.
-    return false;
+    setModifierKeys(ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+
+    m_charCode = WTF::nullopt;
+    m_isComposing = false;
+    m_keyCode = WTF::nullopt;
+    m_repeat = false;
+    m_underlyingPlatformEvent = nullptr;
+    m_which = WTF::nullopt;
+
+#if ENABLE(KEYBOARD_CODE_ATTRIBUTE)
+    m_code = { };
+#endif
+
+#if ENABLE(KEYBOARD_KEY_ATTRIBUTE)
+    m_key = { };
+#endif
+
+#if PLATFORM(COCOA)
+    m_handledByInputMethod = false;
+    m_keypressCommands = { };
+#endif
 }
 
 int KeyboardEvent::keyCode() const
@@ -192,10 +196,10 @@ int KeyboardEvent::keyCode() const
     // IE: virtual key code for keyup/keydown, character code for keypress
     // Firefox: virtual key code for keyup/keydown, zero for keypress
     // We match IE.
-    if (!m_keyEvent)
+    if (!m_underlyingPlatformEvent)
         return 0;
     if (type() == eventNames().keydownEvent || type() == eventNames().keyupEvent)
-        return windowsVirtualKeyCodeWithoutLocation(m_keyEvent->windowsVirtualKeyCode());
+        return windowsVirtualKeyCodeWithoutLocation(m_underlyingPlatformEvent->windowsVirtualKeyCode());
 
     return charCode();
 }
@@ -209,13 +213,13 @@ int KeyboardEvent::charCode() const
     // Firefox: 0 for keydown/keyup events, character code for keypress
     // We match Firefox, unless in backward compatibility mode, where we always return the character code.
     bool backwardCompatibilityMode = false;
-    if (view() && view()->frame())
-        backwardCompatibilityMode = view()->frame()->eventHandler().needsKeyboardEventDisambiguationQuirks();
+    auto* window = view() ? view()->window() : nullptr;
+    if (is<DOMWindow>(window) && downcast<DOMWindow>(*window).frame())
+        backwardCompatibilityMode = downcast<DOMWindow>(*window).frame()->eventHandler().needsKeyboardEventDisambiguationQuirks();
 
-    if (!m_keyEvent || (type() != eventNames().keypressEvent && !backwardCompatibilityMode))
+    if (!m_underlyingPlatformEvent || (type() != eventNames().keypressEvent && !backwardCompatibilityMode))
         return 0;
-    String text = m_keyEvent->text();
-    return static_cast<int>(text.characterStartingAt(0));
+    return m_underlyingPlatformEvent->text().characterStartingAt(0);
 }
 
 EventInterface KeyboardEvent::eventInterface() const
@@ -237,12 +241,4 @@ int KeyboardEvent::which() const
     return keyCode();
 }
 
-KeyboardEvent* findKeyboardEvent(Event* event)
-{
-    for (Event* e = event; e; e = e->underlyingEvent())
-        if (is<KeyboardEvent>(*e))
-            return downcast<KeyboardEvent>(e);
-    return nullptr;
-}
-
 } // namespace WebCore