// Copyright (c) 2015, 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.

library dart._runtime;

import 'dart:async';
import 'dart:collection';

import 'dart:_foreign_helper' show JS, JSExportName, rest, spread;
import 'dart:_interceptors' show JSArray;
import 'dart:_js_helper'
    show
        AssertionErrorWithMessage,
        BooleanConversionAssertionError,
        CastErrorImplementation,
        getTraceFromException,
        Primitives,
        TypeErrorImplementation,
        StrongModeCastError,
        StrongModeErrorImplementation,
        StrongModeTypeError,
        SyncIterable;
import 'dart:_internal' as _internal;

part 'classes.dart';
part 'rtti.dart';
part 'types.dart';
part 'errors.dart';
part 'generators.dart';
part 'operations.dart';
part 'utils.dart';

// TODO(vsm): Move polyfill code to dart:html.
// Note, native extensions are registered onto types in dart.global.
// This polyfill needs to run before the corresponding dart:html code is run.
@JSExportName('global')
final global_ = JS(
    '',
    '''
  function () {
    if (typeof NodeList !== "undefined") {
      // TODO(vsm): Do we still need these?
      NodeList.prototype.get = function(i) { return this[i]; };
      NamedNodeMap.prototype.get = function(i) { return this[i]; };
      DOMTokenList.prototype.get = function(i) { return this[i]; };
      HTMLCollection.prototype.get = function(i) { return this[i]; };

      // Expose constructors for DOM types dart:html needs to assume are
      // available on window.
      if (typeof PannerNode == "undefined") {
        let audioContext;
        if (typeof AudioContext == "undefined" &&
            (typeof webkitAudioContext != "undefined")) {
          audioContext = new webkitAudioContext();
        } else {
          audioContext = new AudioContext();
          window.StereoPannerNode =
              audioContext.createStereoPanner().constructor;
        }
        window.PannerNode = audioContext.createPanner().constructor;
      }
      if (typeof AudioSourceNode == "undefined") {
        window.AudioSourceNode = MediaElementAudioSourceNode.__proto__;
      }
      if (typeof FontFaceSet == "undefined") {
        window.FontFaceSet = document.fonts.__proto__.constructor;
      }
      if (typeof MemoryInfo == "undefined") {
        if (typeof window.performance.memory != "undefined") {
          window.MemoryInfo = window.performance.memory.constructor;
        }
      }
      if (typeof Geolocation == "undefined") {
        navigator.geolocation.constructor;
      }
      if (typeof Animation == "undefined") {
        let d = document.createElement('div');
        if (typeof d.animate != "undefined") {
          window.Animation = d.animate(d).constructor;
        }
      }
      if (typeof SourceBufferList == "undefined") {
        window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
      }
    }
    var globalState = (typeof window != "undefined") ? window
      : (typeof global != "undefined") ? global
      : (typeof self != "undefined") ? self : {};
    return globalState;
  }()
''');

final JsSymbol = JS('', 'Symbol');
