<!doctype html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Historical features</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
 </head>
 <body>
  <div id="log"></div>
  <script>
    test(function() {
        assert_false('toNativeLineEndings' in window);
    }, '"toNativeLineEndings" should not be supported');

    test(function() {
        assert_false('FileError' in window);
    }, '"FileError" should not be supported');

    test(function() {
        assert_false('FileException' in window);
    }, '"FileException" should not be supported');

    test(function() {
        var b = new Blob();
        var prefixes = ['op', 'moz', 'webkit', 'ms'];
        for (var i = 0; i < prefixes.length; ++i) {
            assert_false(prefixes[i]+'Slice' in b, "'"+prefixes[i]+"Slice' in b");
            assert_false(prefixes[i]+'Slice' in Blob.prototype, "'"+prefixes[i]+"Slice in Blob.prototype");
        }
    }, 'Blob should not support slice prefixed');

    test(function() {
        var prefixes = ['', 'O', 'Moz', 'WebKit', 'MS'];
        for (var i = 0; i < prefixes.length; ++i) {
            assert_false(prefixes[i]+'BlobBuilder' in window, prefixes[i]+'BlobBuilder');
        }
    }, 'BlobBuilder should not be supported.');

    test(function() {
        var reader = new FileReader();
        assert_false('readAsBinaryString' in reader, 'should not be in reader');
        assert_equals(reader.readAsBinaryString, undefined,
                      'should be undefined on getting')
    }, 'FileReader should not support readAsBinaryString');
  </script>
 </body>
</html>
