// 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
// BSD-style license that can be found in the LICENSE file.

/// dart2js "primitives", that is, features that cannot be implemented without
/// access to JavaScript features.
library dart2js._js_primitives;

import 'dart:_foreign_helper' show
    JS;

/**
 * This is the low-level method that is used to implement [print].  It is
 * possible to override this function from JavaScript by defining a function in
 * JavaScript called "dartPrint".
 *
 * Notice that it is also possible to intercept calls to [print] from within a
 * Dart program using zones. This means that there is no guarantee that a call
 * to print ends in this method.
 */
void printString(String string) {
  if (JS('bool', r'typeof dartPrint == "function"')) {
    // Support overriding print from JavaScript.
    JS('void', r'dartPrint(#)', string);
    return;
  }

  // Inside browser or nodejs.
  if (JS('bool', r'typeof console == "object"') &&
      JS('bool', r'typeof console.log != "undefined"')) {
    JS('void', r'console.log(#)', string);
    return;
  }

  // Don't throw inside IE, the console is only defined if dev tools is open.
  if (JS('bool', r'typeof window == "object"')) {
    return;
  }

  // Running in d8, the V8 developer shell, or in Firefox' js-shell.
  if (JS('bool', r'typeof print == "function"')) {
    JS('void', r'print(#)', string);
    return;
  }

  // This is somewhat nasty, but we don't want to drag in a bunch of
  // dependencies to handle a situation that cannot happen. So we
  // avoid using Dart [:throw:] and Dart [toString].
  JS('void', 'throw "Unable to print message: " + String(#)', string);
}
