// 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.

// WARNING: Do not edit - generated code.

part of $LIBRARYNAME;

$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
$!MEMBERS
$if DART2JS
  static bool get supported =>
      JS('bool', '!!(Element.prototype.webkitCreateShadowRoot)');
$else
  static final bool supported = true;
$endif

$if DART_USE_BLINK
  static bool _resetStyleInheritanceDeprecationReported = false;
  static void _resetStyleInheritanceDeprecationReport() {
    if (!_resetStyleInheritanceDeprecationReported) {
      window.console.warn('''
ShadowRoot.resetStyleInheritance is now deprecated in dart:html.
Please remove from your code.
''');
      _resetStyleInheritanceDeprecationReported = true;
    }
  }

  @deprecated
  bool get resetStyleInheritance {
    _resetStyleInheritanceDeprecationReport();
    // Default value from when it was specified.
    return false;
  }

  @deprecated
  void set resetStyleInheritance(bool value) {
    _resetStyleInheritanceDeprecationReport();
  }
$else
  @deprecated
  bool get resetStyleInheritance => this._resetStyleInheritance;

  @deprecated
  void set resetStyleInheritance(bool value) {
    this._resetStyleInheritance = value;
  }
$endif
}
