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

// @dart = 2.5

/// 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);
}
