import {StringMap, Set} from 'angular2/src/core/facade/collection'; import {isPresent} from 'angular2/src/core/facade/lang'; const MOUSE_EVENT_PROPERTIES = [ "altKey", "button", "clientX", "clientY", "metaKey", "movementX", "movementY", "offsetX", "offsetY", "region", "screenX", "screenY", "shiftKey" ]; const KEYBOARD_EVENT_PROPERTIES = [ 'altkey', 'charCode', 'code', 'ctrlKey', 'isComposing', 'key', 'keyCode', 'location', 'metaKey', 'repeat', 'shiftKey', 'which' ]; const EVENT_PROPERTIES = ['type', 'bubbles', 'cancelable']; const NODES_WITH_VALUE = new Set(["input", "select", "option", "button", "li", "meter", "progress", "param"]); export function serializeGenericEvent(e: Event): StringMap { return serializeEvent(e, EVENT_PROPERTIES); } // TODO(jteplitz602): Allow users to specify the properties they need rather than always // adding value and files #3374 export function serializeEventWithTarget(e: Event): StringMap { var serializedEvent = serializeEvent(e, EVENT_PROPERTIES); return addTarget(e, serializedEvent); } export function serializeMouseEvent(e: MouseEvent): StringMap { return serializeEvent(e, MOUSE_EVENT_PROPERTIES); } export function serializeKeyboardEvent(e: KeyboardEvent): StringMap { var serializedEvent = serializeEvent(e, KEYBOARD_EVENT_PROPERTIES); return addTarget(e, serializedEvent); } // TODO(jteplitz602): #3374. See above. function addTarget(e: Event, serializedEvent: StringMap): StringMap { if (NODES_WITH_VALUE.has((e.target).tagName.toLowerCase())) { var target = e.target; serializedEvent['target'] = {'value': target.value}; if (isPresent(target.files)) { serializedEvent['target']['files'] = target.files; } } return serializedEvent; } function serializeEvent(e: any, properties: string[]): StringMap { var serialized = {}; for (var i = 0; i < properties.length; i++) { var prop = properties[i]; serialized[prop] = e[prop]; } return serialized; }