mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Fill in KeyboardEvent.
This commit is contained in:
parent
bb7074698a
commit
e999843183
3 changed files with 192 additions and 18 deletions
|
@ -4,19 +4,34 @@
|
||||||
|
|
||||||
use dom::bindings::codegen::Bindings::KeyboardEventBinding;
|
use dom::bindings::codegen::Bindings::KeyboardEventBinding;
|
||||||
use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods;
|
use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods;
|
||||||
use dom::bindings::codegen::InheritTypes::KeyboardEventDerived;
|
use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods;
|
||||||
|
use dom::bindings::codegen::InheritTypes::{UIEventCast, KeyboardEventDerived};
|
||||||
use dom::bindings::error::Fallible;
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::global::GlobalRef;
|
use dom::bindings::global::GlobalRef;
|
||||||
use dom::bindings::js::{JSRef, Temporary};
|
use dom::bindings::global;
|
||||||
use dom::bindings::utils::{Reflectable, Reflector/*, reflect_dom_object*/};
|
use dom::bindings::js::{JSRef, Temporary, RootedReference};
|
||||||
|
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::event::{Event, KeyboardEventTypeId};
|
use dom::event::{Event, KeyboardEventTypeId};
|
||||||
use dom::uievent::UIEvent;
|
use dom::uievent::UIEvent;
|
||||||
|
use dom::window::Window;
|
||||||
use servo_util::str::DOMString;
|
use servo_util::str::DOMString;
|
||||||
|
use std::cell::{RefCell, Cell};
|
||||||
|
|
||||||
#[jstraceable]
|
#[jstraceable]
|
||||||
#[must_root]
|
#[must_root]
|
||||||
pub struct KeyboardEvent {
|
pub struct KeyboardEvent {
|
||||||
uievent: UIEvent,
|
uievent: UIEvent,
|
||||||
|
key: RefCell<DOMString>,
|
||||||
|
code: RefCell<DOMString>,
|
||||||
|
location: Cell<u32>,
|
||||||
|
ctrl: Cell<bool>,
|
||||||
|
alt: Cell<bool>,
|
||||||
|
shift: Cell<bool>,
|
||||||
|
meta: Cell<bool>,
|
||||||
|
repeat: Cell<bool>,
|
||||||
|
is_composing: Cell<bool>,
|
||||||
|
char_code: Cell<Option<u32>>,
|
||||||
|
key_code: Cell<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl KeyboardEventDerived for Event {
|
impl KeyboardEventDerived for Event {
|
||||||
|
@ -26,14 +41,152 @@ impl KeyboardEventDerived for Event {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl KeyboardEvent {
|
impl KeyboardEvent {
|
||||||
pub fn Constructor(_global: &GlobalRef,
|
fn new_inherited() -> KeyboardEvent {
|
||||||
_type_: DOMString,
|
KeyboardEvent {
|
||||||
_init: &KeyboardEventBinding::KeyboardEventInit) -> Fallible<Temporary<KeyboardEvent>> {
|
uievent: UIEvent::new_inherited(KeyboardEventTypeId),
|
||||||
fail!()
|
key: RefCell::new("".to_string()),
|
||||||
|
code: RefCell::new("".to_string()),
|
||||||
|
location: Cell::new(0),
|
||||||
|
ctrl: Cell::new(false),
|
||||||
|
alt: Cell::new(false),
|
||||||
|
shift: Cell::new(false),
|
||||||
|
meta: Cell::new(false),
|
||||||
|
repeat: Cell::new(false),
|
||||||
|
is_composing: Cell::new(false),
|
||||||
|
char_code: Cell::new(None),
|
||||||
|
key_code: Cell::new(0),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_uninitialized(window: JSRef<Window>) -> Temporary<KeyboardEvent> {
|
||||||
|
reflect_dom_object(box KeyboardEvent::new_inherited(),
|
||||||
|
&global::Window(window),
|
||||||
|
KeyboardEventBinding::Wrap)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new(window: JSRef<Window>,
|
||||||
|
type_: DOMString,
|
||||||
|
canBubble: bool,
|
||||||
|
cancelable: bool,
|
||||||
|
view: Option<JSRef<Window>>,
|
||||||
|
_detail: i32,
|
||||||
|
key: DOMString,
|
||||||
|
code: DOMString,
|
||||||
|
location: u32,
|
||||||
|
repeat: bool,
|
||||||
|
isComposing: bool,
|
||||||
|
ctrlKey: bool,
|
||||||
|
altKey: bool,
|
||||||
|
shiftKey: bool,
|
||||||
|
metaKey: bool,
|
||||||
|
char_code: Option<u32>,
|
||||||
|
key_code: u32) -> Temporary<KeyboardEvent> {
|
||||||
|
let ev = KeyboardEvent::new_uninitialized(window).root();
|
||||||
|
ev.deref().InitKeyboardEvent(type_, canBubble, cancelable, view, key, location,
|
||||||
|
"".to_string(), repeat, "".to_string());
|
||||||
|
*ev.code.borrow_mut() = code;
|
||||||
|
ev.ctrl.set(ctrlKey);
|
||||||
|
ev.alt.set(altKey);
|
||||||
|
ev.shift.set(shiftKey);
|
||||||
|
ev.meta.set(metaKey);
|
||||||
|
ev.char_code.set(char_code);
|
||||||
|
ev.key_code.set(key_code);
|
||||||
|
ev.is_composing.set(isComposing);
|
||||||
|
Temporary::from_rooted(*ev)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn Constructor(global: &GlobalRef,
|
||||||
|
type_: DOMString,
|
||||||
|
init: &KeyboardEventBinding::KeyboardEventInit) -> Fallible<Temporary<KeyboardEvent>> {
|
||||||
|
let event = KeyboardEvent::new(global.as_window(), type_,
|
||||||
|
init.parent.parent.parent.bubbles,
|
||||||
|
init.parent.parent.parent.cancelable,
|
||||||
|
init.parent.parent.view.root_ref(),
|
||||||
|
init.parent.parent.detail,
|
||||||
|
init.key.clone(), init.code.clone(), init.location,
|
||||||
|
init.repeat, init.isComposing, init.parent.ctrlKey,
|
||||||
|
init.parent.altKey, init.parent.shiftKey, init.parent.metaKey,
|
||||||
|
None, 0);
|
||||||
|
Ok(event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> KeyboardEventMethods for JSRef<'a, KeyboardEvent> {
|
impl<'a> KeyboardEventMethods for JSRef<'a, KeyboardEvent> {
|
||||||
|
fn InitKeyboardEvent(self,
|
||||||
|
typeArg: DOMString,
|
||||||
|
canBubbleArg: bool,
|
||||||
|
cancelableArg: bool,
|
||||||
|
viewArg: Option<JSRef<Window>>,
|
||||||
|
keyArg: DOMString,
|
||||||
|
locationArg: u32,
|
||||||
|
_modifiersListArg: DOMString,
|
||||||
|
repeat: bool,
|
||||||
|
_locale: DOMString) {
|
||||||
|
let uievent: JSRef<UIEvent> = UIEventCast::from_ref(self);
|
||||||
|
uievent.InitUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, 0);
|
||||||
|
*self.key.borrow_mut() = keyArg;
|
||||||
|
self.location.set(locationArg);
|
||||||
|
self.repeat.set(repeat);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Key(self) -> DOMString {
|
||||||
|
self.key.borrow().clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Code(self) -> DOMString {
|
||||||
|
self.code.borrow().clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Location(self) -> u32 {
|
||||||
|
self.location.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn CtrlKey(self) -> bool {
|
||||||
|
self.ctrl.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn ShiftKey(self) -> bool {
|
||||||
|
self.shift.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn AltKey(self) -> bool {
|
||||||
|
self.alt.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn MetaKey(self) -> bool {
|
||||||
|
self.meta.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Repeat(self) -> bool {
|
||||||
|
self.repeat.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn IsComposing(self) -> bool {
|
||||||
|
self.is_composing.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn GetModifierState(self, keyArg: DOMString) -> bool {
|
||||||
|
match keyArg.as_slice() {
|
||||||
|
"Ctrl" => self.CtrlKey(),
|
||||||
|
"Alt" => self.AltKey(),
|
||||||
|
"Shift" => self.ShiftKey(),
|
||||||
|
"Meta" => self.MetaKey(),
|
||||||
|
"AltGraph" | "CapsLock" | "NumLock" | "ScrollLock" => false, //FIXME
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn CharCode(self) -> u32 {
|
||||||
|
self.char_code.get().unwrap_or(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn KeyCode(self) -> u32 {
|
||||||
|
self.key_code.get()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Which(self) -> u32 {
|
||||||
|
self.char_code.get().unwrap_or(self.KeyCode())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Reflectable for KeyboardEvent {
|
impl Reflectable for KeyboardEvent {
|
||||||
|
|
|
@ -175,7 +175,6 @@ impl<'a> MouseEventMethods for JSRef<'a, MouseEvent> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
impl Reflectable for MouseEvent {
|
impl Reflectable for MouseEvent {
|
||||||
fn reflector<'a>(&'a self) -> &'a Reflector {
|
fn reflector<'a>(&'a self) -> &'a Reflector {
|
||||||
self.uievent.reflector()
|
self.uievent.reflector()
|
||||||
|
|
|
@ -15,18 +15,33 @@ interface KeyboardEvent : UIEvent {
|
||||||
const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
|
const unsigned long DOM_KEY_LOCATION_LEFT = 0x01;
|
||||||
const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
|
const unsigned long DOM_KEY_LOCATION_RIGHT = 0x02;
|
||||||
const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;
|
const unsigned long DOM_KEY_LOCATION_NUMPAD = 0x03;
|
||||||
//readonly attribute DOMString key;
|
readonly attribute DOMString key;
|
||||||
//readonly attribute DOMString code;
|
readonly attribute DOMString code;
|
||||||
//readonly attribute unsigned long location;
|
readonly attribute unsigned long location;
|
||||||
//readonly attribute boolean ctrlKey;
|
readonly attribute boolean ctrlKey;
|
||||||
//readonly attribute boolean shiftKey;
|
readonly attribute boolean shiftKey;
|
||||||
//readonly attribute boolean altKey;
|
readonly attribute boolean altKey;
|
||||||
//readonly attribute boolean metaKey;
|
readonly attribute boolean metaKey;
|
||||||
//readonly attribute boolean repeat;
|
readonly attribute boolean repeat;
|
||||||
//readonly attribute boolean isComposing;
|
readonly attribute boolean isComposing;
|
||||||
//boolean getModifierState (DOMString keyArg);
|
boolean getModifierState (DOMString keyArg);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#idl-interface-KeyboardEvent-initializers
|
||||||
|
partial interface KeyboardEvent {
|
||||||
|
// Originally introduced (and deprecated) in DOM Level 3
|
||||||
|
void initKeyboardEvent (DOMString typeArg, boolean bubblesArg, boolean cancelableArg, Window? viewArg, DOMString keyArg, unsigned long locationArg, DOMString modifiersListArg, boolean repeat, DOMString locale);
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#KeyboardEvent-supplemental-interface
|
||||||
|
partial interface KeyboardEvent {
|
||||||
|
// The following support legacy user agents
|
||||||
|
readonly attribute unsigned long charCode;
|
||||||
|
readonly attribute unsigned long keyCode;
|
||||||
|
readonly attribute unsigned long which;
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#interface-KeyboardEvent
|
||||||
dictionary KeyboardEventInit : SharedKeyboardAndMouseEventInit {
|
dictionary KeyboardEventInit : SharedKeyboardAndMouseEventInit {
|
||||||
DOMString key = "";
|
DOMString key = "";
|
||||||
DOMString code = "";
|
DOMString code = "";
|
||||||
|
@ -34,3 +49,10 @@ dictionary KeyboardEventInit : SharedKeyboardAndMouseEventInit {
|
||||||
boolean repeat = false;
|
boolean repeat = false;
|
||||||
boolean isComposing = false;
|
boolean isComposing = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3-Events.html#events-KeyboardEventInit-supplemental
|
||||||
|
/*partial dictionary KeyboardEventInit {
|
||||||
|
unsigned long charCode = 0;
|
||||||
|
unsigned long keyCode = 0;
|
||||||
|
unsigned long which = 0;
|
||||||
|
};*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue