From edca6169c1c040702acde237e605be0bfe037326 Mon Sep 17 00:00:00 2001 From: Terry Lucas Date: Tue, 15 Jan 2019 17:21:50 +0000 Subject: [PATCH] Fixed a number of dart:html P1 issues. - Fixed HTML API's with callback typedef to correctly convert Dart function to JS function. - Expose HttpStatus from dart:html - Expose DomName ondblclick and dblclickEvent for Angular analyzer. - Fixed removeAll should be Iterable to match Set's removeAll not Iterable. - Fixed a number of DataTransferItem, Entry, FileEntry and DiretoryEntry returning NativeJavaScriptObject needed type registered in DDC. - Added ability to allow local file access from Chrome browser added -local in ddb. R=vsm@google.com Fixes #30278 Fixes #35484 Fixes #34318 Fixes #35510 Change-Id: Ide8c04716c54045e837781d489562f27b694b109 Reviewed-on: https://dart-review.googlesource.com/c/89340 Commit-Queue: Terry Lucas Reviewed-by: Vijay Menon Reviewed-by: Nate Bosch --- CHANGELOG.md | 15 ++ pkg/dev_compiler/tool/ddb | 4 +- sdk/lib/_http/http.dart | 180 +--------------- sdk/lib/html/dart2js/html_dart2js.dart | 192 ++++++++++++------ .../dart2js/indexed_db_dart2js.dart | 4 +- sdk/lib/internal/internal.dart | 178 ++++++++++++++++ sdk/lib/io/io.dart | 1 + sdk/lib/svg/dart2js/svg_dart2js.dart | 2 + sdk/lib/web_sql/dart2js/web_sql_dart2js.dart | 42 +++- tests/lib_2/html/css_selector_test.dart | 49 +++++ tests/lib_2/html/http_test.dart | 33 +++ tools/dom/dom.json | 5 +- tools/dom/scripts/dartmetadata.py | 7 +- tools/dom/scripts/generator.py | 2 + tools/dom/scripts/htmldartgenerator.py | 20 +- tools/dom/scripts/htmlrenamer.py | 37 +++- tools/dom/scripts/idlnode.py | 2 +- tools/dom/src/dart2js_CssClassSet.dart | 4 +- .../html/dart2js/html_dart2js.darttemplate | 1 + .../dart2js/indexed_db_dart2js.darttemplate | 2 + .../impl/impl_DataTransferItem.darttemplate | 23 +++ .../impl/impl_DirectoryReader.darttemplate | 12 +- .../html/impl/impl_Element.darttemplate | 22 ++ .../impl/impl_HTMLCanvasElement.darttemplate | 11 + 24 files changed, 581 insertions(+), 267 deletions(-) create mode 100644 tests/lib_2/html/css_selector_test.dart create mode 100644 tests/lib_2/html/http_test.dart create mode 100644 tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate diff --git a/CHANGELOG.md b/CHANGELOG.md index 166c567df1b4..6cdf4068f754 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,21 @@ [35576]: https://github.com/dart-lang/sdk/issues/35576 +* Fixed a number of 'dart:html' P1 bugs: + + * Fixed HTML API's with callback typedef to correctly convert Dart function to JS function. + * HttpStatus constants exposed in dart:html + * Expose DomName ondblclick and dblclickEvent for Angular analyzer. + * Fixed removeAll on classes Set should be Iterable to match Set's removeAll not Iterable. + * Fixed a number of DataTransferItem, Entry, FileEntry and DiretoryEntry returning NativeJavaScriptObject needed type registered in DDC. + This fixes handling drag/drop of files/directories. + * Added ability to allow local file access from Chrome browser in ddb. + +[30278]: https://github.com/dart-lang/sdk/issues/30278 +[34318]: https://github.com/dart-lang/sdk/issues/34318 +[35484]: https://github.com/dart-lang/sdk/issues/35484 +[35510]: https://github.com/dart-lang/sdk/issues/35510 + ### Dart VM ### Tool Changes diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb index 98f39aa784f4..3e045cc3f927 100755 --- a/pkg/dev_compiler/tool/ddb +++ b/pkg/dev_compiler/tool/ddb @@ -176,7 +176,9 @@ void main(List args) { var tmp = path.join(Directory.systemTemp.path, 'ddc'); result = Process.runSync(chromeBinary, - ['--auto-open-devtools-for-tabs', '--user-data-dir=$tmp', htmlFile]); + ['--auto-open-devtools-for-tabs', + '--allow-file-access-from-files', + '--user-data-dir=$tmp', htmlFile]); } else if (node) { var nodePath = '$sdkJsPath:$libRoot'; var runjs = ''' diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart index 393045f5eb2b..f1e72be4f990 100644 --- a/sdk/lib/_http/http.dart +++ b/sdk/lib/_http/http.dart @@ -16,7 +16,7 @@ import 'dart:collection' UnmodifiableMapView; import 'dart:convert'; import 'dart:developer' hide log; -import 'dart:_internal' show Since; +import 'dart:_internal' show Since, HttpStatus; import 'dart:math'; import 'dart:io'; import 'dart:typed_data'; @@ -31,184 +31,6 @@ part 'overrides.dart'; part 'websocket.dart'; part 'websocket_impl.dart'; -/** - * HTTP status codes. - */ -abstract class HttpStatus { - static const int continue_ = 100; - static const int switchingProtocols = 101; - @Since("2.1") - static const int processing = 102; - static const int ok = 200; - static const int created = 201; - static const int accepted = 202; - static const int nonAuthoritativeInformation = 203; - static const int noContent = 204; - static const int resetContent = 205; - static const int partialContent = 206; - @Since("2.1") - static const int multiStatus = 207; - @Since("2.1") - static const int alreadyReported = 208; - @Since("2.1") - static const int imUsed = 226; - static const int multipleChoices = 300; - static const int movedPermanently = 301; - static const int found = 302; - static const int movedTemporarily = 302; // Common alias for found. - static const int seeOther = 303; - static const int notModified = 304; - static const int useProxy = 305; - static const int temporaryRedirect = 307; - @Since("2.1") - static const int permanentRedirect = 308; - static const int badRequest = 400; - static const int unauthorized = 401; - static const int paymentRequired = 402; - static const int forbidden = 403; - static const int notFound = 404; - static const int methodNotAllowed = 405; - static const int notAcceptable = 406; - static const int proxyAuthenticationRequired = 407; - static const int requestTimeout = 408; - static const int conflict = 409; - static const int gone = 410; - static const int lengthRequired = 411; - static const int preconditionFailed = 412; - static const int requestEntityTooLarge = 413; - static const int requestUriTooLong = 414; - static const int unsupportedMediaType = 415; - static const int requestedRangeNotSatisfiable = 416; - static const int expectationFailed = 417; - @Since("2.1") - static const int misdirectedRequest = 421; - @Since("2.1") - static const int unprocessableEntity = 422; - @Since("2.1") - static const int locked = 423; - @Since("2.1") - static const int failedDependency = 424; - static const int upgradeRequired = 426; - @Since("2.1") - static const int preconditionRequired = 428; - @Since("2.1") - static const int tooManyRequests = 429; - @Since("2.1") - static const int requestHeaderFieldsTooLarge = 431; - @Since("2.1") - static const int connectionClosedWithoutResponse = 444; - @Since("2.1") - static const int unavailableForLegalReasons = 451; - @Since("2.1") - static const int clientClosedRequest = 499; - static const int internalServerError = 500; - static const int notImplemented = 501; - static const int badGateway = 502; - static const int serviceUnavailable = 503; - static const int gatewayTimeout = 504; - static const int httpVersionNotSupported = 505; - @Since("2.1") - static const int variantAlsoNegotiates = 506; - @Since("2.1") - static const int insufficientStorage = 507; - @Since("2.1") - static const int loopDetected = 508; - @Since("2.1") - static const int notExtended = 510; - @Since("2.1") - static const int networkAuthenticationRequired = 511; - // Client generated status code. - static const int networkConnectTimeoutError = 599; - - @Deprecated("Use continue_ instead") - static const int CONTINUE = continue_; - @Deprecated("Use switchingProtocols instead") - static const int SWITCHING_PROTOCOLS = switchingProtocols; - @Deprecated("Use ok instead") - static const int OK = ok; - @Deprecated("Use created instead") - static const int CREATED = created; - @Deprecated("Use accepted instead") - static const int ACCEPTED = accepted; - @Deprecated("Use nonAuthoritativeInformation instead") - static const int NON_AUTHORITATIVE_INFORMATION = nonAuthoritativeInformation; - @Deprecated("Use noContent instead") - static const int NO_CONTENT = noContent; - @Deprecated("Use resetContent instead") - static const int RESET_CONTENT = resetContent; - @Deprecated("Use partialContent instead") - static const int PARTIAL_CONTENT = partialContent; - @Deprecated("Use multipleChoices instead") - static const int MULTIPLE_CHOICES = multipleChoices; - @Deprecated("Use movedPermanently instead") - static const int MOVED_PERMANENTLY = movedPermanently; - @Deprecated("Use found instead") - static const int FOUND = found; - @Deprecated("Use movedTemporarily instead") - static const int MOVED_TEMPORARILY = movedTemporarily; - @Deprecated("Use seeOther instead") - static const int SEE_OTHER = seeOther; - @Deprecated("Use notModified instead") - static const int NOT_MODIFIED = notModified; - @Deprecated("Use useProxy instead") - static const int USE_PROXY = useProxy; - @Deprecated("Use temporaryRedirect instead") - static const int TEMPORARY_REDIRECT = temporaryRedirect; - @Deprecated("Use badRequest instead") - static const int BAD_REQUEST = badRequest; - @Deprecated("Use unauthorized instead") - static const int UNAUTHORIZED = unauthorized; - @Deprecated("Use paymentRequired instead") - static const int PAYMENT_REQUIRED = paymentRequired; - @Deprecated("Use forbidden instead") - static const int FORBIDDEN = forbidden; - @Deprecated("Use notFound instead") - static const int NOT_FOUND = notFound; - @Deprecated("Use methodNotAllowed instead") - static const int METHOD_NOT_ALLOWED = methodNotAllowed; - @Deprecated("Use notAcceptable instead") - static const int NOT_ACCEPTABLE = notAcceptable; - @Deprecated("Use proxyAuthenticationRequired instead") - static const int PROXY_AUTHENTICATION_REQUIRED = proxyAuthenticationRequired; - @Deprecated("Use requestTimeout instead") - static const int REQUEST_TIMEOUT = requestTimeout; - @Deprecated("Use conflict instead") - static const int CONFLICT = conflict; - @Deprecated("Use gone instead") - static const int GONE = gone; - @Deprecated("Use lengthRequired instead") - static const int LENGTH_REQUIRED = lengthRequired; - @Deprecated("Use preconditionFailed instead") - static const int PRECONDITION_FAILED = preconditionFailed; - @Deprecated("Use requestEntityTooLarge instead") - static const int REQUEST_ENTITY_TOO_LARGE = requestEntityTooLarge; - @Deprecated("Use requestUriTooLong instead") - static const int REQUEST_URI_TOO_LONG = requestUriTooLong; - @Deprecated("Use unsupportedMediaType instead") - static const int UNSUPPORTED_MEDIA_TYPE = unsupportedMediaType; - @Deprecated("Use requestedRangeNotSatisfiable instead") - static const int REQUESTED_RANGE_NOT_SATISFIABLE = - requestedRangeNotSatisfiable; - @Deprecated("Use expectationFailed instead") - static const int EXPECTATION_FAILED = expectationFailed; - @Deprecated("Use upgradeRequired instead") - static const int UPGRADE_REQUIRED = upgradeRequired; - @Deprecated("Use internalServerError instead") - static const int INTERNAL_SERVER_ERROR = internalServerError; - @Deprecated("Use notImplemented instead") - static const int NOT_IMPLEMENTED = notImplemented; - @Deprecated("Use badGateway instead") - static const int BAD_GATEWAY = badGateway; - @Deprecated("Use serviceUnavailable instead") - static const int SERVICE_UNAVAILABLE = serviceUnavailable; - @Deprecated("Use gatewayTimeout instead") - static const int GATEWAY_TIMEOUT = gatewayTimeout; - @Deprecated("Use httpVersionNotSupported instead") - static const int HTTP_VERSION_NOT_SUPPORTED = httpVersionNotSupported; - @Deprecated("Use networkConnectTimeoutError instead") - static const int NETWORK_CONNECT_TIMEOUT_ERROR = networkConnectTimeoutError; -} - /** * A server that delivers content, such as web pages, using the HTTP protocol. * diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart index d5d6287028de..b7b158c89ed1 100644 --- a/sdk/lib/html/dart2js/html_dart2js.dart +++ b/sdk/lib/html/dart2js/html_dart2js.dart @@ -67,6 +67,7 @@ import 'dart:_interceptors' setDispatchProperty; export 'dart:math' show Rectangle, Point; +export 'dart:_internal' show HttpStatus; /** * Top-level container for a web page, which is usually a browser tab or window. @@ -1967,8 +1968,6 @@ class CanvasElement extends HtmlElement implements CanvasImageSource { @Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null') Object _getContext_2(contextId) native; - void toBlob(BlobCallback callback, String type, [Object arguments]) native; - @JSName('toDataURL') String _toDataUrl(String type, [arguments_OR_quality]) native; @@ -2062,6 +2061,17 @@ class CanvasElement extends HtmlElement implements CanvasImageSource { */ String toDataUrl([String type = 'image/png', num quality]) => _toDataUrl(type, quality); + + @JSName('toBlob') + void _toBlob(BlobCallback callback, String type, [Object arguments]) native; + + Future toBlob(String type, [Object arguments]) { + var completer = new Completer(); + _toBlob((value) { + completer.complete(value); + }, type, arguments); + return completer.future; + } } // 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 @@ -8553,12 +8563,25 @@ class DataTransfer extends Interceptor { void setDragImage(Element image, int x, int y) native; } -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file +// Copyright (c) 2019, 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. @Native("DataTransferItem") class DataTransferItem extends Interceptor { + Entry getAsEntry() { + Entry entry = _webkitGetAsEntry(); + + if (entry.isFile) + applyExtension('FileEntry', entry); + else if (entry.isDirectory) + applyExtension('DirectoryEntry', entry); + else + applyExtension('Entry', entry); + + return entry; + } + // To suppress missing implicit constructor warnings. factory DataTransferItem._() { throw new UnsupportedError("Not supported"); @@ -8573,7 +8596,7 @@ class DataTransferItem extends Interceptor { @JSName('webkitGetAsEntry') @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.SAFARI) - Entry getAsEntry() native; + Entry _webkitGetAsEntry() native; } // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a @@ -9155,8 +9178,15 @@ class DirectoryReader extends Interceptor { Future> readEntries() { var completer = new Completer>(); - _readEntries((value) { - completer.complete(new List.from(value)); + _readEntries((values) { + values.forEach((value) { + applyExtension('Entry', value); + Entry entry = value as Entry; + if (entry.isFile) + applyExtension('FileEntry', entry); + else if (entry.isDirectory) applyExtension('DirectoryEntry', entry); + }); + completer.complete(new List.from(values)); }, (error) { completer.completeError(error); }); @@ -9573,6 +9603,7 @@ class Document extends Node { Stream get onCut => Element.cutEvent.forTarget(this); /// Stream of `doubleclick` events handled by this [Document]. + @DomName('Document.ondblclick') Stream get onDoubleClick => Element.doubleClickEvent.forTarget(this); /// Stream of `drag` events handled by this [Document]. @@ -11357,6 +11388,7 @@ abstract class ElementList extends ListBase { ElementStream get onCut; /// Stream of `doubleclick` events handled by this [Element]. + @DomName('Element.ondblclick') ElementStream get onDoubleClick; /** @@ -11721,6 +11753,7 @@ class _FrozenElementList extends ListBase Element.cutEvent._forElementList(this); /// Stream of `doubleclick` events handled by this [Element]. + @DomName('Element.ondblclick') ElementStream get onDoubleClick => Element.doubleClickEvent._forElementList(this); @@ -12310,6 +12343,30 @@ class Element extends Node ElementList querySelectorAll(String selectors) => new _FrozenElementList._wrap(_querySelectorAll(selectors)); + @JSName('setApplyScroll') + void _setApplyScroll(ScrollStateCallback scrollStateCallback, + String nativeScrollBehavior) native; + + Future setApplyScroll(String nativeScrollBehavior) { + var completer = new Completer(); + _setApplyScroll((value) { + completer.complete(value); + }, nativeScrollBehavior); + return completer.future; + } + + @JSName('setDistributeScroll') + void _setDistributeScroll(ScrollStateCallback scrollStateCallback, + String nativeScrollBehavior) native; + + Future setDistributeScroll(String nativeScrollBehavior) { + var completer = new Completer(); + _setDistributeScroll((value) { + completer.complete(value); + }, nativeScrollBehavior); + return completer.future; + } + /** * The set of CSS classes applied to this element. * @@ -13275,6 +13332,7 @@ class Element extends Node * * See [EventStreamProvider] for usage information. */ + @DomName('Element.dblclickEvent') static const EventStreamProvider doubleClickEvent = const EventStreamProvider('dblclick'); @@ -14025,16 +14083,10 @@ class Element extends Node @JSName('scrollTo') void _scrollTo_3(num x, y) native; - void setApplyScroll(ScrollStateCallback scrollStateCallback, - String nativeScrollBehavior) native; - void setAttribute(String name, String value) native; void setAttributeNS(String namespaceURI, String name, String value) native; - void setDistributeScroll(ScrollStateCallback scrollStateCallback, - String nativeScrollBehavior) native; - void setPointerCapture(int pointerId) native; @JSName('webkitRequestFullscreen') @@ -14140,6 +14192,7 @@ class Element extends Node ElementStream get onCut => cutEvent.forElement(this); /// Stream of `doubleclick` events handled by this [Element]. + @DomName('Element.ondblclick') ElementStream get onDoubleClick => doubleClickEvent.forElement(this); /** @@ -14549,6 +14602,7 @@ class Entry extends Interceptor { Future getParent() { var completer = new Completer(); _getParent((value) { + applyExtension('Entry', value); completer.complete(value); }, (error) { completer.completeError(error); @@ -16090,47 +16144,53 @@ class Geolocation extends Interceptor { void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) { if (options != null) { - var options_1 = convertDartToNative_Dictionary(options); - _getCurrentPosition_1(successCallback, errorCallback, options_1); + var successCallback_1 = convertDartClosureToJS(successCallback, 1); + var options_2 = convertDartToNative_Dictionary(options); + _getCurrentPosition_1(successCallback_1, errorCallback, options_2); return; } if (errorCallback != null) { - _getCurrentPosition_2(successCallback, errorCallback); + var successCallback_1 = convertDartClosureToJS(successCallback, 1); + _getCurrentPosition_2(successCallback_1, errorCallback); return; } - _getCurrentPosition_3(successCallback); + var successCallback_1 = convertDartClosureToJS(successCallback, 1); + _getCurrentPosition_3(successCallback_1); return; } @JSName('getCurrentPosition') - void _getCurrentPosition_1(_PositionCallback successCallback, - _PositionErrorCallback errorCallback, options) native; + void _getCurrentPosition_1( + successCallback, _PositionErrorCallback errorCallback, options) native; @JSName('getCurrentPosition') - void _getCurrentPosition_2(_PositionCallback successCallback, - _PositionErrorCallback errorCallback) native; + void _getCurrentPosition_2( + successCallback, _PositionErrorCallback errorCallback) native; @JSName('getCurrentPosition') - void _getCurrentPosition_3(_PositionCallback successCallback) native; + void _getCurrentPosition_3(successCallback) native; int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) { if (options != null) { - var options_1 = convertDartToNative_Dictionary(options); - return _watchPosition_1(successCallback, errorCallback, options_1); + var successCallback_1 = convertDartClosureToJS(successCallback, 1); + var options_2 = convertDartToNative_Dictionary(options); + return _watchPosition_1(successCallback_1, errorCallback, options_2); } if (errorCallback != null) { - return _watchPosition_2(successCallback, errorCallback); + var successCallback_1 = convertDartClosureToJS(successCallback, 1); + return _watchPosition_2(successCallback_1, errorCallback); } - return _watchPosition_3(successCallback); + var successCallback_1 = convertDartClosureToJS(successCallback, 1); + return _watchPosition_3(successCallback_1); } @JSName('watchPosition') - int _watchPosition_1(_PositionCallback successCallback, - _PositionErrorCallback errorCallback, options) native; + int _watchPosition_1( + successCallback, _PositionErrorCallback errorCallback, options) native; @JSName('watchPosition') - int _watchPosition_2(_PositionCallback successCallback, - _PositionErrorCallback errorCallback) native; + int _watchPosition_2(successCallback, _PositionErrorCallback errorCallback) + native; @JSName('watchPosition') - int _watchPosition_3(_PositionCallback successCallback) native; + int _watchPosition_3(successCallback) native; } /** @@ -16201,6 +16261,7 @@ abstract class GlobalEventHandlers implements EventTarget { static const EventStreamProvider contextMenuEvent = const EventStreamProvider('contextmenu'); + @DomName('GlobalEventHandlers.dblclickEvent') static const EventStreamProvider doubleClickEvent = const EventStreamProvider('dblclick'); @@ -16365,6 +16426,7 @@ abstract class GlobalEventHandlers implements EventTarget { Stream get onContextMenu => contextMenuEvent.forTarget(this); + @DomName('GlobalEventHandlers.ondblclick') Stream get onDoubleClick => doubleClickEvent.forTarget(this); Stream get onDrag => dragEvent.forTarget(this); @@ -18781,10 +18843,12 @@ class IntersectionObserver extends Interceptor { factory IntersectionObserver(IntersectionObserverCallback callback, [Map options]) { if (options != null) { - var options_1 = convertDartToNative_Dictionary(options); - return IntersectionObserver._create_1(callback, options_1); + var callback_1 = convertDartClosureToJS(callback, 2); + var options_2 = convertDartToNative_Dictionary(options); + return IntersectionObserver._create_1(callback_1, options_2); } - return IntersectionObserver._create_2(callback); + var callback_1 = convertDartClosureToJS(callback, 2); + return IntersectionObserver._create_2(callback_1); } static IntersectionObserver _create_1(callback, options) => JS( 'IntersectionObserver', @@ -23883,7 +23947,8 @@ class PerformanceObserver extends Interceptor { } factory PerformanceObserver(PerformanceObserverCallback callback) { - return PerformanceObserver._create_1(callback); + var callback_1 = convertDartClosureToJS(callback, 2); + return PerformanceObserver._create_1(callback_1); } static PerformanceObserver _create_1(callback) => JS('PerformanceObserver', 'new PerformanceObserver(#)', callback); @@ -25024,7 +25089,8 @@ class ReportingObserver extends Interceptor { } factory ReportingObserver(ReportingObserverCallback callback) { - return ReportingObserver._create_1(callback); + var callback_1 = convertDartClosureToJS(callback, 2); + return ReportingObserver._create_1(callback_1); } static ReportingObserver _create_1(callback) => JS('ReportingObserver', 'new ReportingObserver(#)', callback); @@ -25060,7 +25126,8 @@ class ResizeObserver extends Interceptor { } factory ResizeObserver(ResizeObserverCallback callback) { - return ResizeObserver._create_1(callback); + var callback_1 = convertDartClosureToJS(callback, 2); + return ResizeObserver._create_1(callback_1); } static ResizeObserver _create_1(callback) => JS('ResizeObserver', 'new ResizeObserver(#)', callback); @@ -31257,16 +31324,18 @@ class Window extends EventTarget int requestIdleCallback(IdleRequestCallback callback, [Map options]) { if (options != null) { - var options_1 = convertDartToNative_Dictionary(options); - return _requestIdleCallback_1(callback, options_1); + var callback_1 = convertDartClosureToJS(callback, 1); + var options_2 = convertDartToNative_Dictionary(options); + return _requestIdleCallback_1(callback_1, options_2); } - return _requestIdleCallback_2(callback); + var callback_1 = convertDartClosureToJS(callback, 1); + return _requestIdleCallback_2(callback_1); } @JSName('requestIdleCallback') - int _requestIdleCallback_1(IdleRequestCallback callback, options) native; + int _requestIdleCallback_1(callback, options) native; @JSName('requestIdleCallback') - int _requestIdleCallback_2(IdleRequestCallback callback) native; + int _requestIdleCallback_2(callback) native; /** * Resizes this window by an offset. @@ -31295,7 +31364,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) + * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) * from MDN. */ void scroll([options_OR_x, y, Map scrollOptions]) { @@ -31332,7 +31401,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) + * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) * from MDN. */ void _scroll_1() native; @@ -31344,7 +31413,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) + * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) * from MDN. */ void _scroll_2(options) native; @@ -31356,7 +31425,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) + * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) * from MDN. */ void _scroll_3(num x, num y) native; @@ -31368,7 +31437,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) + * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) * from MDN. */ void _scroll_4(int x, int y) native; @@ -31380,7 +31449,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) + * * [Window.scroll](https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll) * from MDN. */ void _scroll_5(int x, int y, scrollOptions) native; @@ -31390,7 +31459,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) + * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) * from MDN. */ void scrollBy([options_OR_x, y, Map scrollOptions]) { @@ -31425,7 +31494,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) + * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) * from MDN. */ void _scrollBy_1() native; @@ -31435,7 +31504,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) + * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) * from MDN. */ void _scrollBy_2(options) native; @@ -31445,7 +31514,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) + * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) * from MDN. */ void _scrollBy_3(num x, num y) native; @@ -31455,7 +31524,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) + * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) * from MDN. */ void _scrollBy_4(int x, int y) native; @@ -31465,7 +31534,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) + * * [Window.scrollBy](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy) * from MDN. */ void _scrollBy_5(int x, int y, scrollOptions) native; @@ -31477,7 +31546,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) + * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) * from MDN. */ void scrollTo([options_OR_x, y, Map scrollOptions]) { @@ -31514,7 +31583,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) + * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) * from MDN. */ void _scrollTo_1() native; @@ -31526,7 +31595,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) + * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) * from MDN. */ void _scrollTo_2(options) native; @@ -31538,7 +31607,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) + * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) * from MDN. */ void _scrollTo_3(num x, num y) native; @@ -31550,7 +31619,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) + * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) * from MDN. */ void _scrollTo_4(int x, int y) native; @@ -31562,7 +31631,7 @@ class Window extends EventTarget * * ## Other resources * - * * [Window scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) + * * [Window.scrollTo](https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo) * from MDN. */ void _scrollTo_5(int x, int y, scrollOptions) native; @@ -31686,6 +31755,7 @@ class Window extends EventTarget Element.contextMenuEvent.forTarget(this); /// Stream of `doubleclick` events handled by this [Window]. + @DomName('Window.ondblclick') Stream get onDoubleClick => Element.doubleClickEvent.forTarget(this); /// Stream of `devicemotion` events handled by this [Window]. @@ -35076,9 +35146,9 @@ class _ElementCssClassSet extends CssClassSetImpl { } } - static void _removeAll(Element _element, Iterable iterable) { + static void _removeAll(Element _element, Iterable iterable) { DomTokenList list = _classListOf(_element); - for (var value in iterable) { + for (String value in iterable) { _classListRemove(list, value); } } diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart index 7dd739d4c697..50962df3bf4c 100644 --- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart +++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart @@ -82,6 +82,7 @@ import 'dart:typed_data'; import 'dart:_js_helper' show Creates, Returns, JSName, Native; import 'dart:_foreign_helper' show JS; import 'dart:_interceptors' show Interceptor, JSExtendableArray; +import 'dart:_js_helper' show convertDartClosureToJS; // 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. @@ -1039,7 +1040,8 @@ class Observer extends Interceptor { } factory Observer(ObserverCallback callback) { - return Observer._create_1(callback); + var callback_1 = convertDartClosureToJS(callback, 1); + return Observer._create_1(callback_1); } static Observer _create_1(callback) => JS('Observer', 'new IDBObserver(#)', callback); diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart index f5ae6a16208e..11ee99602172 100644 --- a/sdk/lib/internal/internal.dart +++ b/sdk/lib/internal/internal.dart @@ -202,3 +202,181 @@ class Since { final String version; const Since(this.version); } + +/** + * HTTP status codes. Exported in dart:io and dart:html. + */ +abstract class HttpStatus { + static const int continue_ = 100; + static const int switchingProtocols = 101; + @Since("2.1") + static const int processing = 102; + static const int ok = 200; + static const int created = 201; + static const int accepted = 202; + static const int nonAuthoritativeInformation = 203; + static const int noContent = 204; + static const int resetContent = 205; + static const int partialContent = 206; + @Since("2.1") + static const int multiStatus = 207; + @Since("2.1") + static const int alreadyReported = 208; + @Since("2.1") + static const int imUsed = 226; + static const int multipleChoices = 300; + static const int movedPermanently = 301; + static const int found = 302; + static const int movedTemporarily = 302; // Common alias for found. + static const int seeOther = 303; + static const int notModified = 304; + static const int useProxy = 305; + static const int temporaryRedirect = 307; + @Since("2.1") + static const int permanentRedirect = 308; + static const int badRequest = 400; + static const int unauthorized = 401; + static const int paymentRequired = 402; + static const int forbidden = 403; + static const int notFound = 404; + static const int methodNotAllowed = 405; + static const int notAcceptable = 406; + static const int proxyAuthenticationRequired = 407; + static const int requestTimeout = 408; + static const int conflict = 409; + static const int gone = 410; + static const int lengthRequired = 411; + static const int preconditionFailed = 412; + static const int requestEntityTooLarge = 413; + static const int requestUriTooLong = 414; + static const int unsupportedMediaType = 415; + static const int requestedRangeNotSatisfiable = 416; + static const int expectationFailed = 417; + @Since("2.1") + static const int misdirectedRequest = 421; + @Since("2.1") + static const int unprocessableEntity = 422; + @Since("2.1") + static const int locked = 423; + @Since("2.1") + static const int failedDependency = 424; + static const int upgradeRequired = 426; + @Since("2.1") + static const int preconditionRequired = 428; + @Since("2.1") + static const int tooManyRequests = 429; + @Since("2.1") + static const int requestHeaderFieldsTooLarge = 431; + @Since("2.1") + static const int connectionClosedWithoutResponse = 444; + @Since("2.1") + static const int unavailableForLegalReasons = 451; + @Since("2.1") + static const int clientClosedRequest = 499; + static const int internalServerError = 500; + static const int notImplemented = 501; + static const int badGateway = 502; + static const int serviceUnavailable = 503; + static const int gatewayTimeout = 504; + static const int httpVersionNotSupported = 505; + @Since("2.1") + static const int variantAlsoNegotiates = 506; + @Since("2.1") + static const int insufficientStorage = 507; + @Since("2.1") + static const int loopDetected = 508; + @Since("2.1") + static const int notExtended = 510; + @Since("2.1") + static const int networkAuthenticationRequired = 511; + // Client generated status code. + static const int networkConnectTimeoutError = 599; + + @Deprecated("Use continue_ instead") + static const int CONTINUE = continue_; + @Deprecated("Use switchingProtocols instead") + static const int SWITCHING_PROTOCOLS = switchingProtocols; + @Deprecated("Use ok instead") + static const int OK = ok; + @Deprecated("Use created instead") + static const int CREATED = created; + @Deprecated("Use accepted instead") + static const int ACCEPTED = accepted; + @Deprecated("Use nonAuthoritativeInformation instead") + static const int NON_AUTHORITATIVE_INFORMATION = nonAuthoritativeInformation; + @Deprecated("Use noContent instead") + static const int NO_CONTENT = noContent; + @Deprecated("Use resetContent instead") + static const int RESET_CONTENT = resetContent; + @Deprecated("Use partialContent instead") + static const int PARTIAL_CONTENT = partialContent; + @Deprecated("Use multipleChoices instead") + static const int MULTIPLE_CHOICES = multipleChoices; + @Deprecated("Use movedPermanently instead") + static const int MOVED_PERMANENTLY = movedPermanently; + @Deprecated("Use found instead") + static const int FOUND = found; + @Deprecated("Use movedTemporarily instead") + static const int MOVED_TEMPORARILY = movedTemporarily; + @Deprecated("Use seeOther instead") + static const int SEE_OTHER = seeOther; + @Deprecated("Use notModified instead") + static const int NOT_MODIFIED = notModified; + @Deprecated("Use useProxy instead") + static const int USE_PROXY = useProxy; + @Deprecated("Use temporaryRedirect instead") + static const int TEMPORARY_REDIRECT = temporaryRedirect; + @Deprecated("Use badRequest instead") + static const int BAD_REQUEST = badRequest; + @Deprecated("Use unauthorized instead") + static const int UNAUTHORIZED = unauthorized; + @Deprecated("Use paymentRequired instead") + static const int PAYMENT_REQUIRED = paymentRequired; + @Deprecated("Use forbidden instead") + static const int FORBIDDEN = forbidden; + @Deprecated("Use notFound instead") + static const int NOT_FOUND = notFound; + @Deprecated("Use methodNotAllowed instead") + static const int METHOD_NOT_ALLOWED = methodNotAllowed; + @Deprecated("Use notAcceptable instead") + static const int NOT_ACCEPTABLE = notAcceptable; + @Deprecated("Use proxyAuthenticationRequired instead") + static const int PROXY_AUTHENTICATION_REQUIRED = proxyAuthenticationRequired; + @Deprecated("Use requestTimeout instead") + static const int REQUEST_TIMEOUT = requestTimeout; + @Deprecated("Use conflict instead") + static const int CONFLICT = conflict; + @Deprecated("Use gone instead") + static const int GONE = gone; + @Deprecated("Use lengthRequired instead") + static const int LENGTH_REQUIRED = lengthRequired; + @Deprecated("Use preconditionFailed instead") + static const int PRECONDITION_FAILED = preconditionFailed; + @Deprecated("Use requestEntityTooLarge instead") + static const int REQUEST_ENTITY_TOO_LARGE = requestEntityTooLarge; + @Deprecated("Use requestUriTooLong instead") + static const int REQUEST_URI_TOO_LONG = requestUriTooLong; + @Deprecated("Use unsupportedMediaType instead") + static const int UNSUPPORTED_MEDIA_TYPE = unsupportedMediaType; + @Deprecated("Use requestedRangeNotSatisfiable instead") + static const int REQUESTED_RANGE_NOT_SATISFIABLE = + requestedRangeNotSatisfiable; + @Deprecated("Use expectationFailed instead") + static const int EXPECTATION_FAILED = expectationFailed; + @Deprecated("Use upgradeRequired instead") + static const int UPGRADE_REQUIRED = upgradeRequired; + @Deprecated("Use internalServerError instead") + static const int INTERNAL_SERVER_ERROR = internalServerError; + @Deprecated("Use notImplemented instead") + static const int NOT_IMPLEMENTED = notImplemented; + @Deprecated("Use badGateway instead") + static const int BAD_GATEWAY = badGateway; + @Deprecated("Use serviceUnavailable instead") + static const int SERVICE_UNAVAILABLE = serviceUnavailable; + @Deprecated("Use gatewayTimeout instead") + static const int GATEWAY_TIMEOUT = gatewayTimeout; + @Deprecated("Use httpVersionNotSupported instead") + static const int HTTP_VERSION_NOT_SUPPORTED = httpVersionNotSupported; + @Deprecated("Use networkConnectTimeoutError instead") + static const int NETWORK_CONNECT_TIMEOUT_ERROR = networkConnectTimeoutError; +} diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart index 6131c0e3565d..c640c5bc7c81 100644 --- a/sdk/lib/io/io.dart +++ b/sdk/lib/io/io.dart @@ -196,6 +196,7 @@ import 'dart:math'; import 'dart:typed_data'; export 'dart:_http'; +export 'dart:_internal' show HttpStatus; part 'bytes_builder.dart'; part 'common.dart'; diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart index fdd5a682e64a..7966fd79f102 100644 --- a/sdk/lib/svg/dart2js/svg_dart2js.dart +++ b/sdk/lib/svg/dart2js/svg_dart2js.dart @@ -3021,6 +3021,7 @@ class SvgElement extends Element implements GlobalEventHandlers, NoncedElement { static const EventStreamProvider contextMenuEvent = const EventStreamProvider('contextmenu'); + @DomName('SVGElement.dblclickEvent') static const EventStreamProvider doubleClickEvent = const EventStreamProvider('dblclick'); @@ -3215,6 +3216,7 @@ class SvgElement extends Element implements GlobalEventHandlers, NoncedElement { ElementStream get onContextMenu => contextMenuEvent.forElement(this); + @DomName('SVGElement.ondblclick') ElementStream get onDoubleClick => doubleClickEvent.forElement(this); ElementStream get onDrag => dragEvent.forElement(this); diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart index cce7a93985f8..0f703f9c8348 100644 --- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart +++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart @@ -80,6 +80,7 @@ class SqlDatabase extends Interceptor { final String version; + @JSName('changeVersion') /** * Atomically update the database version to [newVersion], asynchronously * running [callback] on the [SqlTransaction] representing this @@ -94,15 +95,52 @@ class SqlDatabase extends Interceptor { * * * [Database.changeVersion](http://www.w3.org/TR/webdatabase/#dom-database-changeversion) from W3C. */ - void changeVersion(String oldVersion, String newVersion, + void _changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native; - void readTransaction(SqlTransactionCallback callback, + @JSName('changeVersion') + /** + * Atomically update the database version to [newVersion], asynchronously + * running [callback] on the [SqlTransaction] representing this + * [changeVersion] transaction. + * + * If [callback] runs successfully, then [successCallback] is called. + * Otherwise, [errorCallback] is called. + * + * [oldVersion] should match the database's current [version] exactly. + * + * See also: + * + * * [Database.changeVersion](http://www.w3.org/TR/webdatabase/#dom-database-changeversion) from W3C. + */ + Future changeVersion(String oldVersion, String newVersion) { + var completer = new Completer(); + _changeVersion(oldVersion, newVersion, (value) { + completer.complete(value); + }, (error) { + completer.completeError(error); + }); + return completer.future; + } + + @JSName('readTransaction') + void _readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native; + @JSName('readTransaction') + Future readTransaction() { + var completer = new Completer(); + _readTransaction((value) { + completer.complete(value); + }, (error) { + completer.completeError(error); + }); + return completer.future; + } + void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) native; diff --git a/tests/lib_2/html/css_selector_test.dart b/tests/lib_2/html/css_selector_test.dart new file mode 100644 index 000000000000..5fcbd9ee68c6 --- /dev/null +++ b/tests/lib_2/html/css_selector_test.dart @@ -0,0 +1,49 @@ +// Copyright (c) 2019, 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. + +import 'dart:html'; + +import 'package:unittest/unittest.dart'; +import 'package:unittest/html_individual_config.dart'; +import 'utils.dart'; + +main() { + useHtmlIndividualConfiguration(); + + final String htmlPayload = "
" + "
" + "

" + "Test #1" + "

" + "
" + "
" + "

" + "Test #2" + "

" + "
" + "
"; + + final elements = + new Element.html(htmlPayload, treeSanitizer: new NullTreeSanitizer()); + document.body.nodes.add(elements); + + var para = document.body.querySelector('p') as ParagraphElement; + para.classes.removeAll(['a', 'b']); + + para = document.body.querySelector('p') as ParagraphElement; + expect(para.outerHtml, '

Test #1

'); + + para = document.body.querySelector('p') as ParagraphElement; + para.classes.addAll(['c']); + + para = document.body.querySelector('p') as ParagraphElement; + expect(para.outerHtml, '

Test #1

'); + + var allPara = document.body.querySelectorAll('p'); + allPara.classes.removeAll(['b', 'c']); + + var checkAllPara = document.body.querySelectorAll('p'); + expect(checkAllPara[0].outerHtml, '

Test #1

'); + expect(checkAllPara[1].outerHtml, '

Test #2

'); +} diff --git a/tests/lib_2/html/http_test.dart b/tests/lib_2/html/http_test.dart new file mode 100644 index 000000000000..905f4d580c9a --- /dev/null +++ b/tests/lib_2/html/http_test.dart @@ -0,0 +1,33 @@ +// Copyright (c) 2019, 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. + +import 'dart:html'; + +import 'package:expect/minitest.dart'; + +bool testSwitch(int currentValue) { + switch (currentValue) { + case HttpStatus.continue_: + return true; + case HttpStatus.ok: + return true; + case HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR: + return true; + } + + return false; +} + +main() { + expect(testSwitch(HttpStatus.continue_), isTrue); + expect(testSwitch(HttpStatus.CONTINUE), isTrue); + + expect(testSwitch(HttpStatus.ok), isTrue); + expect(testSwitch(HttpStatus.OK), isTrue); + + expect(testSwitch(HttpStatus.networkConnectTimeoutError), isTrue); + expect(testSwitch(HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR), isTrue); + + expect(testSwitch(-20100), isFalse); +} diff --git a/tools/dom/dom.json b/tools/dom/dom.json index a63e560d30e0..7dbf7aa754a2 100644 --- a/tools/dom/dom.json +++ b/tools/dom/dom.json @@ -8033,6 +8033,9 @@ }, "createWriter": {}, "file": {}, + "fileBlob": { + "support_level": "untriaged" + }, "filesystem": { "support_level": "untriaged" }, @@ -31541,4 +31544,4 @@ }, "support_level": "nonstandard" } -} +} \ No newline at end of file diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py index 39736b193f95..cb81c493b7b1 100644 --- a/tools/dom/scripts/dartmetadata.py +++ b/tools/dom/scripts/dartmetadata.py @@ -741,14 +741,15 @@ def IsSuppressed(self, interface, member_name): def _GetCommonAnnotations(self, interface, member_name=None, source_member_name=None): + annotations = [] if member_name: key = '%s.%s' % (interface.id, member_name) dom_name = '%s.%s' % (interface.javascript_binding_name, member_name) + # DomName annotation is needed for dblclick ACX plugin analyzer. + if member_name == 'dblclickEvent' or member_name == 'ondblclick': + annotations.append("@DomName('" + dom_name + "')") else: key = interface.id - dom_name = interface.javascript_binding_name - - annotations = [] if key in _annotations: annotations.extend(_annotations[key]) diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py index 952c6293306c..81ce64077fc3 100644 --- a/tools/dom/scripts/generator.py +++ b/tools/dom/scripts/generator.py @@ -873,6 +873,8 @@ def __init__(self, name, input_type, output_type): 'dynamic', 'dynamic') dart2js_conversions = monitored.Dict('generator.dart2js_conversions', { + # Used to convert Dart function to a JS callback typedef (old style). + 'Callback set': Conversion('convertDartClosureToJS', 'dynamic', 'dynamic'), 'Date get': Conversion('convertNativeToDart_DateTime', 'dynamic', 'DateTime'), 'Date set': diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py index 64e9f9321c12..7f7574c68636 100644 --- a/tools/dom/scripts/htmldartgenerator.py +++ b/tools/dom/scripts/htmldartgenerator.py @@ -323,7 +323,6 @@ def AddOperation(self, info, declare_only=False, dart_js_interop=False): info.operations[0], info.name, 'call:') - if not method_name: if info.name == 'item': # FIXME: item should be renamed to operator[], not removed. @@ -905,24 +904,37 @@ def _DartType(self, type_name): def _TypeInfo(self, type_name): return self._type_registry.TypeInfo(type_name) + def _CallbackConvert(self, argType, info): + if self._database.HasInterface(argType): + interface = self._database.GetInterface(argType) + if "Callback" in interface.ext_attrs: + return interface.ext_attrs['Callback'] + return None + def _ConvertArgumentTypes(self, stmts_emitter, arguments, argument_count, info): temp_version = [0] converted_arguments = [] target_parameters = [] calling_parameters = [] for position, arg in enumerate(arguments[:argument_count]): - conversion = self._InputConversion(arg.type.id, info.declared_name) + callBackInfo = self._CallbackConvert(arg.type.id, info) # Returns callback arity (# of parameters) + if callBackInfo is None: + conversion = self._InputConversion(arg.type.id, info.declared_name) + else: + conversion = self._InputConversion('Callback', info.declared_name) + param_name = arguments[position].id if conversion: temp_version[0] += 1 temp_name = '%s_%s' % (param_name, temp_version[0]) temp_type = conversion.output_type stmts_emitter.Emit( - '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n', + '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n' if callBackInfo is None else '$(INDENT)$TYPE $NAME = $CONVERT($ARG, $ARITY);\n', TYPE=TypeOrVar(temp_type), NAME=temp_name, CONVERT=conversion.function_name, - ARG=info.param_infos[position].name) + ARG=info.param_infos[position].name, + ARITY=callBackInfo) converted_arguments.append(temp_name) param_type = temp_type verified_type = temp_type # verified by assignment in checked mode. diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py index 06bd04b9650a..eade5b6ca436 100644 --- a/tools/dom/scripts/htmlrenamer.py +++ b/tools/dom/scripts/htmlrenamer.py @@ -188,6 +188,8 @@ def generateCallbackInterface(id): convert_to_future_members = monitored.Set( 'htmlrenamer.converted_to_future_members', [ + 'Database.changeVersion', + 'Database.readTransaction', 'DataTransferItem.getAsString', 'DirectoryEntry.getDirectory', 'DirectoryEntry.getFile', @@ -222,6 +224,9 @@ def generateCallbackInterface(id): 'Entry': { 'getMetadata': [ 'applyExtension(\'Metadata\', value);', + ], + 'getParent': [ + 'applyExtension(\'Entry\', value);', ] }, 'FileEntry': { @@ -296,6 +301,7 @@ def GetDDC_Extension(interface, operationName): 'CompositionEvent.initCompositionEvent', 'CustomEvent.detail', 'CustomEvent.initCustomEvent', + 'DataTransferItem.webkitGetAsEntry', 'DeviceOrientationEvent.initDeviceOrientationEvent', 'DirectoryEntry.createReader', 'DirectoryReader.readEntries', @@ -495,19 +501,27 @@ def GetDDC_Extension(interface, operationName): # Members from the standard dom that exist in the dart:html library with # identical functionality but with cleaner names. renamed_html_members = monitored.Dict('htmlrenamer.renamed_html_members', { - 'ConsoleBase.assert': 'assertCondition', 'CSSKeyframesRule.insertRule': - 'appendRule', 'DirectoryEntry.getDirectory': '_getDirectory', - 'DirectoryEntry.getFile': '_getFile', 'Document.createCDATASection': - 'createCDataSection', 'Document.defaultView': 'window', 'Window.CSS': 'css', + 'ConsoleBase.assert': 'assertCondition', + 'CSSKeyframesRule.insertRule': 'appendRule', + 'DirectoryEntry.getDirectory': '_getDirectory', + 'DirectoryEntry.getFile': '_getFile', + 'Document.createCDATASection': 'createCDataSection', + 'Document.defaultView': 'window', + 'Window.CSS': 'css', 'Window.webkitNotifications': 'notifications', 'Window.webkitRequestFileSystem': '_requestFileSystem', 'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl', - 'Navigator.webkitGetUserMedia': '_getUserMedia', 'Node.appendChild': - 'append', 'Node.cloneNode': 'clone', 'Node.nextSibling': 'nextNode', - 'Node.parentElement': 'parent', 'Node.previousSibling': 'previousNode', - 'Node.textContent': 'text', 'SVGElement.className': '_svgClassName', - 'SVGStopElement.offset': 'gradientOffset', 'URL.createObjectURL': - 'createObjectUrl', 'URL.revokeObjectURL': 'revokeObjectUrl', + 'Navigator.webkitGetUserMedia': '_getUserMedia', + 'Node.appendChild': 'append', + 'Node.cloneNode': 'clone', + 'Node.nextSibling': 'nextNode', + 'Node.parentElement': 'parent', + 'Node.previousSibling': 'previousNode', + 'Node.textContent': 'text', + 'SVGElement.className': '_svgClassName', + 'SVGStopElement.offset': 'gradientOffset', + 'URL.createObjectURL': 'createObjectUrl', + 'URL.revokeObjectURL': 'revokeObjectUrl', #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem', #'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync', @@ -600,6 +614,7 @@ def convertedFutureMembers(member): 'AudioContext.decodeAudioData', 'AudioBufferSourceNode.looping', # TODO(vsm): Use deprecated IDL annotation 'CSSStyleDeclaration.getPropertyCSSValue', + 'HTMLCanvasElement.toBlob', 'CanvasRenderingContext2D.clearShadow', 'CanvasRenderingContext2D.drawImageFromRect', 'CanvasRenderingContext2D.setAlpha', @@ -727,8 +742,10 @@ def convertedFutureMembers(member): 'Element.prepend', 'Element.removeAttributeNode', 'Element.set:outerHTML', + 'Element.setApplyScroll', 'Element.setAttributeNode', 'Element.setAttributeNodeNS', + 'Element.setDistributeScroll', 'Element.webkitCreateShadowRoot', 'Element.webkitMatchesSelector', 'Element.webkitPseudo', diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py index b2e06d2c1815..614947441fe4 100644 --- a/tools/dom/scripts/idlnode.py +++ b/tools/dom/scripts/idlnode.py @@ -404,7 +404,7 @@ def __init__(self, ast, filename=None): for annotation in callback_function.annotations: callback = callback_function.annotations[annotation] cb_interface = IDLInterface(None, callback.name) - cb_interface.ext_attrs['Callback'] = None + cb_interface.ext_attrs['Callback'] = len(callback.arguments) op = IDLOperation(None, cb_interface.id, "handleEvent") op.type = IDLType(callback.idl_type) op.type = resolveTypedef(op.type) diff --git a/tools/dom/src/dart2js_CssClassSet.dart b/tools/dom/src/dart2js_CssClassSet.dart index c3394aa134a9..098d28f1b73b 100644 --- a/tools/dom/src/dart2js_CssClassSet.dart +++ b/tools/dom/src/dart2js_CssClassSet.dart @@ -193,9 +193,9 @@ class _ElementCssClassSet extends CssClassSetImpl { } } - static void _removeAll(Element _element, Iterable iterable) { + static void _removeAll(Element _element, Iterable iterable) { DomTokenList list = _classListOf(_element); - for (var value in iterable) { + for (String value in iterable) { _classListRemove(list, value); } } diff --git a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate index 436df0a5e9fa..2a30e632a7fb 100644 --- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate +++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate @@ -53,6 +53,7 @@ import 'dart:_interceptors' show import 'dart:_foreign_helper' show JS, JS_INTERCEPTOR_CONSTANT; export 'dart:math' show Rectangle, Point; +export 'dart:_internal' show HttpStatus; $!GENERATED_DART_FILES diff --git a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate index 706bc06c4907..29bc8c5cb207 100644 --- a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate +++ b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate @@ -91,6 +91,8 @@ import 'dart:_js_helper' show Creates, Returns, JSName, Native; import 'dart:_foreign_helper' show JS; import 'dart:_interceptors' show Interceptor, JSExtendableArray; +import 'dart:_js_helper' show convertDartClosureToJS; + $!GENERATED_DART_FILES class _KeyRangeFactoryProvider { diff --git a/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate b/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate new file mode 100644 index 000000000000..8294cc1a7e1b --- /dev/null +++ b/tools/dom/templates/html/impl/impl_DataTransferItem.darttemplate @@ -0,0 +1,23 @@ +// Copyright (c) 2019, 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 { + + Entry getAsEntry() { + Entry entry = _webkitGetAsEntry(); + + if (entry.isFile) + applyExtension('FileEntry', entry); + else if (entry.isDirectory) + applyExtension('DirectoryEntry', entry); + else + applyExtension('Entry', entry); + + return entry; + } + +$!MEMBERS +} diff --git a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate index 53bc0efa8874..06eba12de610 100644 --- a/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate +++ b/tools/dom/templates/html/impl/impl_DirectoryReader.darttemplate @@ -9,8 +9,16 @@ $!MEMBERS Future> readEntries() { var completer = new Completer>(); - _readEntries((value) { - completer.complete(new List.from(value)); + _readEntries((values) { + values.forEach((value) { + applyExtension('Entry', value); + Entry entry = value as Entry; + if (entry.isFile) + applyExtension('FileEntry', entry); + else if (entry.isDirectory) + applyExtension('DirectoryEntry', entry); + }); + completer.complete(new List.from(values)); }, (error) { completer.completeError(error); }); diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate index 35bd16f4d732..0ff97f6f1a4d 100644 --- a/tools/dom/templates/html/impl/impl_Element.darttemplate +++ b/tools/dom/templates/html/impl/impl_Element.darttemplate @@ -599,6 +599,28 @@ $(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS { ElementList querySelectorAll(String selectors) => new _FrozenElementList._wrap(_querySelectorAll(selectors)); + @JSName('setApplyScroll') + void _setApplyScroll(ScrollStateCallback scrollStateCallback, String nativeScrollBehavior) native; + + Future setApplyScroll(String nativeScrollBehavior) { + var completer = new Completer(); + _setApplyScroll((value) { + completer.complete(value); + }, nativeScrollBehavior); + return completer.future; + } + + @JSName('setDistributeScroll') + void _setDistributeScroll(ScrollStateCallback scrollStateCallback, String nativeScrollBehavior) native; + + Future setDistributeScroll(String nativeScrollBehavior) { + var completer = new Completer(); + _setDistributeScroll((value) { + completer.complete(value); + }, nativeScrollBehavior); + return completer.future; + } + /** * The set of CSS classes applied to this element. * diff --git a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate index bfde34a1198e..c935546166f6 100644 --- a/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate +++ b/tools/dom/templates/html/impl/impl_HTMLCanvasElement.darttemplate @@ -82,4 +82,15 @@ $!MEMBERS */ String toDataUrl([String type = 'image/png', num quality]) => _toDataUrl(type, quality); + + @JSName('toBlob') + void _toBlob(BlobCallback callback, String type, [Object arguments]) native; + + Future toBlob(String type, [Object arguments]) { + var completer = new Completer(); + _toBlob((value) { + completer.complete(value); + }, type, arguments); + return completer.future; + } }