Skip to content

Commit

Permalink
catch element from html creation exception
Browse files Browse the repository at this point in the history
  • Loading branch information
alextekartik committed Feb 20, 2025
1 parent 3871aad commit 827e5ad
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 21 deletions.
32 changes: 21 additions & 11 deletions lib/src/web/html_web.dart
Original file line number Diff line number Diff line change
Expand Up @@ -270,14 +270,6 @@ mixin _NodeWebMixin implements Node {
});
}

T _wrapExceptionSyncAsStateError<T>(T Function() action) {
try {
return action();
} catch (e) {
throw StateError(e.toString());
}
}

@override
Node replaceChild(Node newChild, Node oldChild) {
_wrapExceptionSyncAsStateError(() {
Expand Down Expand Up @@ -395,9 +387,11 @@ class _HtmlProviderWeb implements HtmlProviderWeb {

@override
Element createElementHtml(String html, {bool? noValidate}) {
var div = createElementTag('div');
div.innerHtml = html.trim();
return div.children.first;
return _wrapExceptionSyncAsArgError(() {
var div = createElementTag('div');
div.innerHtml = html.trim();
return div.children.first;
});
}

@override
Expand Down Expand Up @@ -477,3 +471,19 @@ class _TextWeb extends _NodeBase with _NodeWebMixin implements _Text {
@override
String toString() => 'Text($text)';
}

T _wrapExceptionSyncAsStateError<T>(T Function() action) {
try {
return action();
} catch (e) {
throw StateError(e.toString());
}
}

T _wrapExceptionSyncAsArgError<T>(T Function() action) {
try {
return action();
} catch (e) {
throw ArgumentError(e.toString());
}
}
42 changes: 32 additions & 10 deletions test/element_test.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
library;

import 'package:tekartik_html/html_html5lib.dart';
import 'package:tekartik_html/html_universal.dart';
import 'package:tekartik_html/tag.dart';
import 'package:test/test.dart';

Expand Down Expand Up @@ -137,23 +137,45 @@ void testMain(HtmlProvider html) {
// expect(element.children.length, 2);
//});

test('createElementHtml', () {
test('createElementHtml(html)', () {
expect(() => html.createElementHtml('<html></html>'),
throwsA(isA<Object>()));
});
test('createElementHtml(head)', () {
if (html is HtmlProviderWeb) {
expect(() => html.createElementHtml('<head></head>'),
throwsA(isA<Object>()));
} else {
var element = html.createElementHtml('<head></head>');
expect(element.tagName, 'head');
}
});
test('createElementHtml(body)', () {
if (html is HtmlProviderWeb) {
expect(() => html.createElementHtml('<body></body>'),
throwsA(isA<Object>()));
} else {
var element = html.createElementHtml('<body></body>');
expect(element.tagName, 'body');
}
});
test('createElementHtml(div)', () {
final element = html.createElementHtml('<Div id="test">inner</div>');
expect(element.tagName, tagDiv);
expect(element.id, 'test');
expect(element.innerHtml, 'inner');
expect(element.outerHtml, '<div id="test">inner</div>');
});

/*
test('createElementHtmlHtml', () {
Element element = html.createElementHtml('<html></html>');
expect(element.tagName, HTML);
expect(element.id, 'test');
expect(element.innerHtml, '');
expect(element.outerHtml, '<html></html>');
test('bad arg createElementHtml', () {
try {
html.createElementHtml('&lt;a&gt;&lt;/a&gt;');
fail('should fail');
} on ArgumentError catch (_) {
//print(_);
//print(_.runtimeType);
}
});
*/

test('custom tag attributes bis', () {
if (!isBrowser) {
Expand Down

0 comments on commit 827e5ad

Please sign in to comment.