de9fbf0e90
This should be invisible to end users, but basically brings dart:html in-line with the core libraries. BUG= Review URL: https://codereview.chromium.org//12061008 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@17929 260f80e4-7a28-3924-810f-c04153c831b5
105 lines
3.1 KiB
Plaintext
105 lines
3.1 KiB
Plaintext
// 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)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
|
|
$!MEMBERS
|
|
/**
|
|
* Checks to see if the mutation observer API is supported on the current
|
|
* platform.
|
|
*/
|
|
static bool get supported {
|
|
$if DARTIUM
|
|
return true;
|
|
$else
|
|
return JS('bool',
|
|
'!!(window.MutationObserver || window.WebKitMutationObserver)');
|
|
$endif
|
|
}
|
|
|
|
void observe(Node target,
|
|
{Map options,
|
|
bool childList,
|
|
bool attributes,
|
|
bool characterData,
|
|
bool subtree,
|
|
bool attributeOldValue,
|
|
bool characterDataOldValue,
|
|
List<String> attributeFilter}) {
|
|
|
|
// Parse options into map of known type.
|
|
var parsedOptions = _createDict();
|
|
|
|
if (options != null) {
|
|
options.forEach((k, v) {
|
|
if (_boolKeys.containsKey(k)) {
|
|
_add(parsedOptions, k, true == v);
|
|
} else if (k == 'attributeFilter') {
|
|
_add(parsedOptions, k, _fixupList(v));
|
|
} else {
|
|
throw new ArgumentError(
|
|
"Illegal MutationObserver.observe option '$k'");
|
|
}
|
|
});
|
|
}
|
|
|
|
// 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 };
|
|
|
|
$if DARTIUM
|
|
static _createDict() => {};
|
|
static _add(m, String key, value) { m[key] = value; }
|
|
static _fixupList(list) => list;
|
|
|
|
void _call(Node target, options) {
|
|
_observe(target, options);
|
|
}
|
|
$endif
|
|
|
|
$if DART2JS
|
|
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(callback, 2));
|
|
}
|
|
$endif
|
|
}
|