Reapply setTimeout change.

This CL is identical to 18555. The reason it will  work now is the corresponding
dartium change has been checked in.

TBR-blois

BUG=

Review URL: https://codereview.chromium.org//12254046

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@18562 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
efortuna@google.com 2013-02-15 07:40:51 +00:00
parent 6e15e3eff7
commit d7057b2d8c
18 changed files with 254 additions and 170 deletions

View file

@ -25826,6 +25826,56 @@ class WheelEvent extends MouseEvent native "*WheelEvent" {
@DomName('Window')
class Window extends EventTarget implements WindowBase native "@*DOMWindow" {
/**
* Executes a [callback] after the immediate execution stack has completed.
*
* This differs from using Timer.run(callback)
* because Timer will run in about 4-15 milliseconds, depending on browser,
* depending on load. [setImmediate], in contrast, makes browser-specific
* changes in behavior to attempt to run immediately after the current
* frame unwinds, causing the future to complete after all processing has
* completed for the current event, but before any subsequent events.
*/
void setImmediate(TimeoutHandler callback) {
_addMicrotaskCallback(callback);
}
/**
* Lookup a port by its [name]. Return null if no port is
* registered under [name].
*/
SendPortSync lookupPort(String name) {
var port =
json.parse(document.documentElement.attributes['dart-port:$name']);
return _deserialize(port);
}
/**
* Register a [port] on this window under the given [name]. This
* port may be retrieved by any isolate (or JavaScript script)
* running in this window.
*/
void registerPort(String name, var port) {
var serialized = _serialize(port);
document.documentElement.attributes['dart-port:$name'] =
json.stringify(serialized);
}
/**
* Returns a Future that completes just before the window is about to repaint
* so the user can draw an animation frame
*
* If you need to later cancel this animation, use [requestAnimationFrame]
* instead.
*
* Note: The code that runs when the future completes should call
* [animationFrame] again for the animation to continue.
*/
Future<num> get animationFrame {
var completer = new Completer<int>();
requestAnimationFrame(completer.complete);
return completer.future;
}
Document get document => JS('Document', '#.document', this);
WindowBase _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
@ -25891,15 +25941,21 @@ class Window extends EventTarget implements WindowBase native "@*DOMWindow" {
}
/**
* Executes a [callback] after the immediate execution stack has completed.
* Called to draw an animation frame and then request the window to repaint
* after [callback] has finished (creating the animation).
*
* This will cause the callback to be executed after all processing has
* completed for the current event, but before any subsequent events.
* Use this method only if you need to later call [cancelAnimationFrame]. If
* not, the preferred Dart idiom is to set animation frames by calling
* [animationFrame], which returns a Future.
*
* Returns a non-zero valued integer to represent the request id for this
* request. This value only needs to be saved if you intend to call
* [cancelAnimationFrame] so you can specify the particular animation to
* cancel.
*
* Note: The supplied [callback] needs to call [requestAnimationFrame] again
* for the animation to continue.
*/
void setImmediate(TimeoutHandler callback) {
_addMicrotaskCallback(callback);
}
@DomName('DOMWindow.requestAnimationFrame')
int requestAnimationFrame(RequestAnimationFrameCallback callback) {
_ensureRequestAnimationFrame();
@ -25958,25 +26014,6 @@ class Window extends EventTarget implements WindowBase native "@*DOMWindow" {
'#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
this, this, this);
/**
* Lookup a port by its [name]. Return null if no port is
* registered under [name].
*/
SendPortSync lookupPort(String name) {
var port = json.parse(document.documentElement.attributes['dart-port:$name']);
return _deserialize(port);
}
/**
* Register a [port] on this window under the given [name]. This
* port may be retrieved by any isolate (or JavaScript script)
* running in this window.
*/
void registerPort(String name, var port) {
var serialized = _serialize(port);
document.documentElement.attributes['dart-port:$name'] = json.stringify(serialized);
}
@DomName('Window.console')
Console get console => Console.safeConsole;
@ -26295,13 +26332,15 @@ class Window extends EventTarget implements WindowBase native "@*DOMWindow" {
@DocsEditable
void captureEvents() native;
@JSName('clearInterval')
@DomName('DOMWindow.clearInterval')
@DocsEditable
void clearInterval(int handle) native;
void _clearInterval(int handle) native;
@JSName('clearTimeout')
@DomName('DOMWindow.clearTimeout')
@DocsEditable
void clearTimeout(int handle) native;
void _clearTimeout(int handle) native;
@DomName('DOMWindow.close')
@DocsEditable
@ -26413,13 +26452,15 @@ class Window extends EventTarget implements WindowBase native "@*DOMWindow" {
@DocsEditable
void scrollTo(int x, int y) native;
@JSName('setInterval')
@DomName('DOMWindow.setInterval')
@DocsEditable
int setInterval(TimeoutHandler handler, int timeout) native;
int _setInterval(TimeoutHandler handler, int timeout) native;
@JSName('setTimeout')
@DomName('DOMWindow.setTimeout')
@DocsEditable
int setTimeout(TimeoutHandler handler, int timeout) native;
int _setTimeout(TimeoutHandler handler, int timeout) native;
@DomName('DOMWindow.showModalDialog')
@DocsEditable
@ -31416,11 +31457,11 @@ get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool
var maker;
var canceller;
if (repeating) {
maker = window.setInterval;
canceller = window.clearInterval;
maker = window._setInterval;
canceller = window._clearInterval;
} else {
maker = window.setTimeout;
canceller = window.clearTimeout;
maker = window._setTimeout;
canceller = window._clearTimeout;
}
Timer timer;
final int id = maker(() { callback(timer); }, milliSeconds);

View file

@ -28225,19 +28225,23 @@ class Window extends EventTarget implements WindowBase {
/**
* Executes a [callback] after the immediate execution stack has completed.
*
* This will cause the callback to be executed after all processing has
* This differs from using Timer.run(callback)
* because Timer will run in about 4-15 milliseconds, depending on browser,
* depending on load. [setImmediate], in contrast, makes browser-specific
* changes in behavior to attempt to run immediately after the current
* frame unwinds, causing the future to complete after all processing has
* completed for the current event, but before any subsequent events.
*/
void setImmediate(TimeoutHandler callback) {
void setImmediate(TimeoutHandler callback) {
_addMicrotaskCallback(callback);
}
/**
* Lookup a port by its [name]. Return null if no port is
* registered under [name].
*/
lookupPort(String name) {
var port = json.parse(document.documentElement.attributes['dart-port:$name']);
SendPortSync lookupPort(String name) {
var port =
json.parse(document.documentElement.attributes['dart-port:$name']);
return _deserialize(port);
}
@ -28246,9 +28250,26 @@ class Window extends EventTarget implements WindowBase {
* port may be retrieved by any isolate (or JavaScript script)
* running in this window.
*/
registerPort(String name, var port) {
void registerPort(String name, var port) {
var serialized = _serialize(port);
document.documentElement.attributes['dart-port:$name'] = json.stringify(serialized);
document.documentElement.attributes['dart-port:$name'] =
json.stringify(serialized);
}
/**
* Returns a Future that completes just before the window is about to repaint
* so the user can draw an animation frame
*
* If you need to later cancel this animation, use [requestAnimationFrame]
* instead.
*
* Note: The code that runs when the future completes should call
* [animationFrame] again for the animation to continue.
*/
Future<num> get animationFrame {
var completer = new Completer<int>();
requestAnimationFrame(completer.complete);
return completer.future;
}
/// Checks if _setImmediate is supported.
@ -28589,11 +28610,11 @@ class Window extends EventTarget implements WindowBase {
@DomName('DOMWindow.clearInterval')
@DocsEditable
void clearInterval(int handle) native "DOMWindow_clearInterval_Callback";
void _clearInterval(int handle) native "DOMWindow_clearInterval_Callback";
@DomName('DOMWindow.clearTimeout')
@DocsEditable
void clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";
void _clearTimeout(int handle) native "DOMWindow_clearTimeout_Callback";
@DomName('DOMWindow.close')
@DocsEditable
@ -28688,11 +28709,11 @@ class Window extends EventTarget implements WindowBase {
@DomName('DOMWindow.setInterval')
@DocsEditable
int setInterval(TimeoutHandler handler, int timeout) native "DOMWindow_setInterval_Callback";
int _setInterval(TimeoutHandler handler, int timeout) native "DOMWindow_setInterval_Callback";
@DomName('DOMWindow.setTimeout')
@DocsEditable
int setTimeout(TimeoutHandler handler, int timeout) native "DOMWindow_setTimeout_Callback";
int _setTimeout(TimeoutHandler handler, int timeout) native "DOMWindow_setTimeout_Callback";
@DomName('DOMWindow.showModalDialog')
@DocsEditable
@ -33885,11 +33906,11 @@ get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool
var maker;
var canceller;
if (repeating) {
maker = window.setInterval;
canceller = window.clearInterval;
maker = window._setInterval;
canceller = window._clearInterval;
} else {
maker = window.setTimeout;
canceller = window.clearTimeout;
maker = window._setTimeout;
canceller = window._clearTimeout;
}
Timer timer;
final int id = maker(() { callback(timer); }, milliSeconds);

View file

@ -94,7 +94,7 @@ class BenchmarkBase {
class BenchmarkSuite {
/** The set of benchmarks that have yet to run. */
List<Function> benchmarks;
/**
* The set of scores from the benchmarks that have already run. (Used for
* calculating the Geometric mean).
@ -112,15 +112,15 @@ class BenchmarkSuite {
benchmarks = [() => Smoketest.main()];
totalBenchmarks = benchmarks.length;
}
/** Run all of the benchmarks that we have in our benchmarks list. */
runBenchmarks() {
runBenchmarksHelper(benchmarks);
}
/**
* Run the remaining benchmarks in our list. We chain the calls providing
* little breaks for the main page to gain control, so we don't force the
* little breaks for the main page to gain control, so we don't force the
* entire page to hang the whole time.
*/
runBenchmarksHelper(List<Function> remainingBenchmarks) {
@ -128,10 +128,11 @@ class BenchmarkSuite {
var benchmark = remainingBenchmarks.removeLast();
benchmark();
if (remainingBenchmarks.length > 0) {
/* Provide small breaks between each benchmark, so that the browser
/* Provide small breaks between each benchmark, so that the browser
doesn't get unhappy about long running scripts, and so the user
can regain control of the UI to kill the page as needed. */
window.setTimeout(() => runBenchmarksHelper(remainingBenchmarks), 25);
new Timer(const Duration(milliseconds: 25),
() => runBenchmarksHelper(remainingBenchmarks));
} else if (remainingBenchmarks.length == 0) {
// We've run all of the benchmarks. Update the page with the score.
BENCHMARK_VIEW.setScore(geometricMean(scores));
@ -140,7 +141,7 @@ class BenchmarkSuite {
/** Store the results of a single benchmark run. */
updateIndividualScore(String name, num score) {
scores.add(score);
scores.add(score);
BENCHMARK_VIEW.incrementProgress(name, score, totalBenchmarks);
}
@ -172,9 +173,9 @@ class BenchmarkView {
body.nodes.add(
new Element.html("<p id='testResultScore'>Score: $newScore</p>"));
}
/**
* Update the page HTML to show how much progress we've made through the
* Update the page HTML to show how much progress we've made through the
* benchmarks.
*/
incrementProgress(String name, num score, num totalBenchmarks) {
@ -184,8 +185,8 @@ class BenchmarkView {
// the user we're making progress.
num percentage = 100 * numCompleted ~/ totalBenchmarks;
}
/**
/**
* Rounds the score to have at least three significant digits (hopefully)
* helping readability of the scores.
*/

View file

@ -4,6 +4,7 @@
library benchmark_lib;
import 'dart:async';
import 'dart:html';
import 'dart:math' as Math;

View file

@ -6,6 +6,7 @@ library benchmarksmoketest;
// Tests that benchmark classes used in perf testing are not broken.
import 'benchmark_lib.dart';
import 'dart:async';
import 'dart:html';
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
@ -13,9 +14,9 @@ import '../../pkg/unittest/lib/html_config.dart';
void main() {
useHtmlConfiguration();
test('performanceTesting', () {
window.setTimeout(BENCHMARK_SUITE.runBenchmarks, 0);
window.setTimeout(expectAsync0(testForCompletion), 0);
test('performanceTesting', () {
Timer.run(BENCHMARK_SUITE.runBenchmarks);
Timer.run(expectAsync0(testForCompletion));
});
}

View file

@ -2,29 +2,32 @@ library AsyncWindowTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';
import 'dart:async';
main() {
useHtmlConfiguration();
test('Window.setTimeout', () {
window.setTimeout(expectAsync0((){}), 10);
test('Timer', () {
new Timer(const Duration(milliseconds: 10), expectAsync0((){}));
});
test('Window.setInterval', () {
test('Timer.repeating', () {
int counter = 0;
int id = null;
id = window.setInterval(expectAsyncUntil0(
() {
if (counter == 3) {
counter = 1024;
window.clearInterval(id);
// Wait some more time to be sure callback won't be invoked any more.
window.setTimeout(expectAsync0((){}), 50);
return;
}
// As callback should have been cleared on 4th invocation, counter
// should never be greater than 3.
assert(counter < 3);
counter++;
},
() => counter == 3), 10);
new Timer.repeating(const Duration(milliseconds: 10),
expectAsyncUntil1(
(timer) {
if (counter == 3) {
counter = 1024;
timer.cancel();
// Wait some more time to be sure callback won't be invoked any
// more.
new Timer(const Duration(milliseconds: 50), expectAsync0((){}));
return;
}
// As callback should have been cleared on 4th invocation, counter
// should never be greater than 3.
assert(counter < 3);
counter++;
},
() => counter == 3));
});
}

View file

@ -6,6 +6,7 @@ library CssStyleDeclarationTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';
import 'dart:async';
main() {
useHtmlConfiguration();
@ -84,10 +85,10 @@ main() {
document.body.children.add(element);
// Need to wait one tick after the element has been added to the page.
window.setTimeout(expectAsync0(() {
new Timer(const Duration(milliseconds: 10), expectAsync0(() {
element.style.textDecoration = 'underline';
var style = element.getComputedStyle();
expect(style.textDecoration, equals('underline'));
}), 10);
}));
});
}

View file

@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
library dromaeo;
import 'dart:async';
import 'dart:html';
import 'dart:json' as json;
import '../../../samples/third_party/dromaeo/common/common.dart';

View file

@ -2,6 +2,7 @@ library HistoryTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_individual_config.dart';
import 'dart:html';
import 'dart:async';
main() {
useHtmlIndividualConfiguration();
@ -42,14 +43,14 @@ main() {
expect(window.location.href.endsWith('dummy2'), isTrue);
// Need to wait a frame or two to let the pushState events occur.
window.setTimeout(expectAsync0(() {
new Timer(const Duration(milliseconds: 100), expectAsync0(() {
window.onPopState.first.then(expectAsync1((_){
expect(window.history.length, length);
expect(window.location.href.endsWith('dummy1'), isTrue);
}));
window.history.back();
}), 100);
}));
}, expectation);
});

View file

@ -5,6 +5,7 @@
library JsInterop3Test;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:async';
import 'dart:html';
import 'dart:isolate';
@ -43,7 +44,7 @@ main() {
var done = expectAsync0(() {});
var fun2 = (message) {
expect(message, 42);
window.setTimeout(done, 0);
Timer.run(done);
};
var port2 = new ReceivePortSync();

View file

@ -5,6 +5,7 @@
library JsInterop4Test;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:async';
import 'dart:html';
import 'dart:isolate';
@ -52,7 +53,7 @@ main() {
var done = expectAsync0(() {});
var fun2 = (message) {
expect(message, 3);
window.setTimeout(done, 0);
Timer.run(done);
};
var port2 = new ReceivePortSync();

View file

@ -5,6 +5,7 @@
library microtask_;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:async';
import 'dart:html';
main() {
@ -15,10 +16,10 @@ main() {
var rafCalled = false;
var immediateCalled = false;
window.setTimeout(expectAsync0(() {
Timer.run(expectAsync0(() {
timeoutCalled = true;
expect(immediateCalled, true);
}), 0);
}));
window.requestAnimationFrame((_) {

View file

@ -6,6 +6,7 @@ library transition_event_test;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_individual_config.dart';
import 'dart:html';
import 'dart:async';
main() {
useHtmlIndividualConfiguration();
@ -28,14 +29,14 @@ main() {
element.style.background = 'red';
element.style.transition = 'opacity .1s';
window.setTimeout(expectAsync0(() {
new Timer(const Duration(milliseconds: 100), expectAsync0(() {
element.onTransitionEnd.first.then(expectAsync1((e) {
expect(e is TransitionEvent, isTrue);
expect(e.propertyName, 'opacity');
}));
element.style.opacity = '1';
}), 100);
}));
}
});
});

View file

@ -2,6 +2,7 @@ library WindowOpenTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';
import 'dart:async';
main() {
useHtmlConfiguration();
@ -26,8 +27,8 @@ closeWindow(win) {
win.close();
doneHandler() {
if (!win.closed) {
window.setTimeout(expectAsync0(doneHandler), 1);
new Timer(const Duration(milliseconds: 1), expectAsync0(doneHandler));
}
}
window.setTimeout(expectAsync0(doneHandler), 1);
new Timer(const Duration(milliseconds: 1), expectAsync0(doneHandler));
}

View file

@ -194,6 +194,10 @@ renamed_html_members = monitored.Dict('htmlrenamer.renamed_html_members', {
'Document.defaultView': 'window',
'DOMURL.createObjectURL': 'createObjectUrl',
'DOMURL.revokeObjectURL': 'revokeObjectUrl',
'DOMWindow.clearTimeout': '_clearTimeout',
'DOMWindow.clearInterval': '_clearInterval',
'DOMWindow.setTimeout': '_setTimeout',
'DOMWindow.setInterval': '_setInterval',
'DOMWindow.webkitConvertPointFromNodeToPage': 'convertPointFromNodeToPage',
'DOMWindow.webkitConvertPointFromPageToNode': 'convertPointFromPageToNode',
'DOMWindow.webkitNotifications': 'notifications',

View file

@ -17,11 +17,11 @@ get _timerFactoryClosure => (int milliSeconds, void callback(Timer timer), bool
var maker;
var canceller;
if (repeating) {
maker = window.setInterval;
canceller = window.clearInterval;
maker = window._setInterval;
canceller = window._clearInterval;
} else {
maker = window.setTimeout;
canceller = window.clearTimeout;
maker = window._setTimeout;
canceller = window._clearTimeout;
}
Timer timer;
final int id = maker(() { callback(timer); }, milliSeconds);

View file

@ -1,47 +0,0 @@
// 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 {
/**
* Executes a [callback] after the immediate execution stack has completed.
*
* This will cause the callback to be executed after all processing has
* completed for the current event, but before any subsequent events.
*/
void setImmediate(TimeoutHandler callback) {
_addMicrotaskCallback(callback);
}
/**
* Lookup a port by its [name]. Return null if no port is
* registered under [name].
*/
lookupPort(String name) {
var port = json.parse(document.documentElement.attributes['dart-port:$name']);
return _deserialize(port);
}
/**
* Register a [port] on this window under the given [name]. This
* port may be retrieved by any isolate (or JavaScript script)
* running in this window.
*/
registerPort(String name, var port) {
var serialized = _serialize(port);
document.documentElement.attributes['dart-port:$name'] = json.stringify(serialized);
}
/// Checks if _setImmediate is supported.
static bool get _supportsSetImmediate => false;
/// Dartium stub for IE's setImmediate.
void _setImmediate(void callback()) {
throw new UnsupportedError('setImmediate is not supported');
}
$!MEMBERS
}

View file

@ -4,8 +4,63 @@
part of $LIBRARYNAME;
$if DART2JS
$(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
$else
$(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
$endif
/**
* Executes a [callback] after the immediate execution stack has completed.
*
* This differs from using Timer.run(callback)
* because Timer will run in about 4-15 milliseconds, depending on browser,
* depending on load. [setImmediate], in contrast, makes browser-specific
* changes in behavior to attempt to run immediately after the current
* frame unwinds, causing the future to complete after all processing has
* completed for the current event, but before any subsequent events.
*/
void setImmediate(TimeoutHandler callback) {
_addMicrotaskCallback(callback);
}
/**
* Lookup a port by its [name]. Return null if no port is
* registered under [name].
*/
SendPortSync lookupPort(String name) {
var port =
json.parse(document.documentElement.attributes['dart-port:$name']);
return _deserialize(port);
}
/**
* Register a [port] on this window under the given [name]. This
* port may be retrieved by any isolate (or JavaScript script)
* running in this window.
*/
void registerPort(String name, var port) {
var serialized = _serialize(port);
document.documentElement.attributes['dart-port:$name'] =
json.stringify(serialized);
}
/**
* Returns a Future that completes just before the window is about to repaint
* so the user can draw an animation frame
*
* If you need to later cancel this animation, use [requestAnimationFrame]
* instead.
*
* Note: The code that runs when the future completes should call
* [animationFrame] again for the animation to continue.
*/
Future<num> get animationFrame {
var completer = new Completer<int>();
requestAnimationFrame(completer.complete);
return completer.future;
}
$if DART2JS
Document get document => JS('Document', '#.document', this);
WindowBase _open2(url, name) => JS('Window', '#.open(#,#)', this, url, name);
@ -71,15 +126,21 @@ $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
}
/**
* Executes a [callback] after the immediate execution stack has completed.
* Called to draw an animation frame and then request the window to repaint
* after [callback] has finished (creating the animation).
*
* This will cause the callback to be executed after all processing has
* completed for the current event, but before any subsequent events.
* Use this method only if you need to later call [cancelAnimationFrame]. If
* not, the preferred Dart idiom is to set animation frames by calling
* [animationFrame], which returns a Future.
*
* Returns a non-zero valued integer to represent the request id for this
* request. This value only needs to be saved if you intend to call
* [cancelAnimationFrame] so you can specify the particular animation to
* cancel.
*
* Note: The supplied [callback] needs to call [requestAnimationFrame] again
* for the animation to continue.
*/
void setImmediate(TimeoutHandler callback) {
_addMicrotaskCallback(callback);
}
@DomName('DOMWindow.requestAnimationFrame')
int requestAnimationFrame(RequestAnimationFrameCallback callback) {
_ensureRequestAnimationFrame();
@ -138,25 +199,6 @@ $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
'#.indexedDB || #.webkitIndexedDB || #.mozIndexedDB',
this, this, this);
/**
* Lookup a port by its [name]. Return null if no port is
* registered under [name].
*/
SendPortSync lookupPort(String name) {
var port = json.parse(document.documentElement.attributes['dart-port:$name']);
return _deserialize(port);
}
/**
* Register a [port] on this window under the given [name]. This
* port may be retrieved by any isolate (or JavaScript script)
* running in this window.
*/
void registerPort(String name, var port) {
var serialized = _serialize(port);
document.documentElement.attributes['dart-port:$name'] = json.stringify(serialized);
}
@DomName('Window.console')
Console get console => Console.safeConsole;
@ -168,6 +210,15 @@ $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS native "@*DOMWindow" {
void _setImmediate(void callback()) {
JS('void', '#.setImmediate(#)', this, convertDartClosureToJS(callback, 0));
}
$else
/// Checks if _setImmediate is supported.
static bool get _supportsSetImmediate => false;
/// Dartium stub for IE's setImmediate.
void _setImmediate(void callback()) {
throw new UnsupportedError('setImmediate is not supported');
}
$endif
$!MEMBERS
}