| Index: pkg/web_components/lib/interop.dart
|
| diff --git a/pkg/web_components/lib/interop.dart b/pkg/web_components/lib/interop.dart
|
| index 415c7feae439fbe9864c8baf8414deb75ac4bf46..de1ef2fb8885d0b970f4cba783f96b539ae74e07 100644
|
| --- a/pkg/web_components/lib/interop.dart
|
| +++ b/pkg/web_components/lib/interop.dart
|
| @@ -29,7 +29,17 @@ void registerDartType(String tagName, Type dartType, {String extendsTag}) {
|
|
|
| var upgrader = document.createElementUpgrader(
|
| dartType, extendsTag: extendsTag);
|
| - _doc.callMethod('_registerDartTypeUpgrader', [tagName, upgrader.upgrade]);
|
| +
|
| + // Unfortunately the dart:html upgrader will throw on an already-upgraded
|
| + // element, so we need to duplicate the type check to prevent that.
|
| + // An element can be upgraded twice if it extends another element and calls
|
| + // createdCallback on the superclass. Since that's a valid use case we must
|
| + // wrap at both levels, and guard against it here.
|
| + upgradeElement(e) {
|
| + if (e.runtimeType != dartType) upgrader.upgrade(e);
|
| + }
|
| +
|
| + _doc.callMethod('_registerDartTypeUpgrader', [tagName, upgradeElement]);
|
| }
|
|
|
| /// This function is mainly used to save resources. By default, we save a log of
|
|
|