// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. part of $LIBRARYNAME; $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS { $!MEMBERS /** * Checks to see if the mutation observer API is supported on the current * platform. */ static bool get supported { return JS('bool', '!!(window.MutationObserver || window.WebKitMutationObserver)'); } /** * Observes the target for the specified changes. * * Some requirements for the optional parameters: * * * Either childList, attributes or characterData must be true. * * If attributeOldValue is true then attributes must also be true. * * If attributeFilter is specified then attributes must be true. * * If characterDataOldValue is true then characterData must be true. */ void observe(Node target, {bool childList, bool attributes, bool characterData, bool subtree, bool attributeOldValue, bool characterDataOldValue, List attributeFilter}) { // Parse options into map of known type. var parsedOptions = _createDict(); // Override options passed in the map with named optional arguments. override(key, value) { if (value != null) _add(parsedOptions, key, value); } override('childList', childList); override('attributes', attributes); override('characterData', characterData); override('subtree', subtree); override('attributeOldValue', attributeOldValue); override('characterDataOldValue', characterDataOldValue); if (attributeFilter != null) { override('attributeFilter', _fixupList(attributeFilter)); } _call(target, parsedOptions); } // TODO: Change to a set when const Sets are available. static final _boolKeys = const {'childList': true, 'attributes': true, 'characterData': true, 'subtree': true, 'attributeOldValue': true, 'characterDataOldValue': true }; static _createDict() => JS('var', '{}'); static _add(m, String key, value) { JS('void', '#[#] = #', m, key, value); } static _fixupList(list) => list; // TODO: Ensure is a JavaScript Array. // Call native function with no conversions. @JSName('observe') void _call(target, options) native; factory MutationObserver(MutationCallback callback) { // Dummy statement to mark types as instantiated. JS('MutationObserver|MutationRecord', '0'); return JS('MutationObserver', 'new(window.MutationObserver||window.WebKitMutationObserver||' 'window.MozMutationObserver)(#)', convertDartClosureToJS(_wrapBinaryZone(callback), 2)); } }