| Index: third_party/WebKit/LayoutTests/mojo/codec.html | 
| diff --git a/third_party/WebKit/LayoutTests/mojo/codec.html b/third_party/WebKit/LayoutTests/mojo/codec.html | 
| index a02ea1ef5f84ee98f96aae0271b42181f62f8926..9390069bb40836f885393fb2cc81affac5a5e996 100644 | 
| --- a/third_party/WebKit/LayoutTests/mojo/codec.html | 
| +++ b/third_party/WebKit/LayoutTests/mojo/codec.html | 
| @@ -2,312 +2,303 @@ | 
| <script src="../resources/testharness.js"></script> | 
| <script src="../resources/testharnessreport.js"></script> | 
| <script src="../resources/testharness-helpers.js"></script> | 
| -<script src="../resources/mojo-helpers.js"></script> | 
| +<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script> | 
| +<script src="file:///gen/mojo/public/interfaces/bindings/tests/sample_service.mojom.js"></script> | 
| +<script src="file:///gen/mojo/public/interfaces/bindings/tests/test_structs.mojom.js"></script> | 
| <script> | 
| 'use strict'; | 
|  | 
| -setup({ explicit_done: true }); | 
| - | 
| -define([ | 
| -    'mojo/public/js/codec', | 
| -    'mojo/public/interfaces/bindings/tests/rect.mojom', | 
| -    'mojo/public/interfaces/bindings/tests/sample_service.mojom', | 
| -    'mojo/public/interfaces/bindings/tests/test_structs.mojom', | 
| -], function(codec, rect, sample, structs) { | 
| - | 
| -  test(() => { | 
| -    var bar = new sample.Bar(); | 
| -    bar.alpha = 1; | 
| -    bar.beta = 2; | 
| -    bar.gamma = 3; | 
| -    bar.type = 0x08070605; | 
| -    bar.extraProperty = "banana"; | 
| +test(() => { | 
| +  var bar = new sample.Bar(); | 
| +  bar.alpha = 1; | 
| +  bar.beta = 2; | 
| +  bar.gamma = 3; | 
| +  bar.type = 0x08070605; | 
| +  bar.extraProperty = "banana"; | 
| + | 
| +  var messageName = 42; | 
| +  var payloadSize = sample.Bar.encodedSize; | 
| + | 
| +  var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize); | 
| +  builder.encodeStruct(sample.Bar, bar); | 
| + | 
| +  var message = builder.finish(); | 
| + | 
| +  var expectedMemory = new Uint8Array([ | 
| +    24, 0, 0, 0, | 
| +     0, 0, 0, 0, | 
| +     0, 0, 0, 0, | 
| +    42, 0, 0, 0, | 
| +     0, 0, 0, 0, | 
| +     0, 0, 0, 0, | 
| + | 
| +    16, 0, 0, 0, | 
| +     0, 0, 0, 0, | 
| + | 
| +     1, 2, 3, 0, | 
| +     5, 6, 7, 8, | 
| +  ]); | 
| + | 
| +  var actualMemory = new Uint8Array(message.buffer.arrayBuffer); | 
| +  assert_weak_equals(actualMemory, expectedMemory); | 
| + | 
| +  var reader = new mojo.internal.MessageReader(message); | 
| + | 
| +  assert_equals(reader.payloadSize, payloadSize); | 
| +  assert_equals(reader.messageName, messageName); | 
| + | 
| +  var bar2 = reader.decodeStruct(sample.Bar); | 
| + | 
| +  assert_equals(bar2.alpha, bar.alpha); | 
| +  assert_equals(bar2.beta, bar.beta); | 
| +  assert_equals(bar2.gamma, bar.gamma); | 
| +  assert_false("extraProperty" in bar2); | 
| +}, 'bar'); | 
| + | 
| +test(() => { | 
| +  var foo = new sample.Foo(); | 
| +  foo.x = 0x212B4D5; | 
| +  foo.y = 0x16E93; | 
| +  foo.a = 1; | 
| +  foo.b = 0; | 
| +  foo.c = 3; // This will get truncated to one bit. | 
| +  foo.bar = new sample.Bar(); | 
| +  foo.bar.alpha = 91; | 
| +  foo.bar.beta = 82; | 
| +  foo.bar.gamma = 73; | 
| +  foo.data = [ | 
| +    4, 5, 6, 7, 8, | 
| +  ]; | 
| +  foo.extraBars = [ | 
| +    new sample.Bar(), new sample.Bar(), new sample.Bar(), | 
| +  ]; | 
| +  for (var i = 0; i < foo.extraBars.length; ++i) { | 
| +    foo.extraBars[i].alpha = 1 * i; | 
| +    foo.extraBars[i].beta = 2 * i; | 
| +    foo.extraBars[i].gamma = 3 * i; | 
| +  } | 
| +  foo.name = "I am a banana"; | 
| +  // This is supposed to be a handle, but we fake it with an integer. | 
| +  foo.source = 23423782; | 
| +  foo.arrayOfArrayOfBools = [ | 
| +    [true], [false, true] | 
| +  ]; | 
| +  foo.arrayOfBools = [ | 
| +    true, false, true, false, true, false, true, true | 
| +  ]; | 
| + | 
| + | 
| +  var messageName = 31; | 
| +  var payloadSize = 304; | 
| + | 
| +  var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize); | 
| +  builder.encodeStruct(sample.Foo, foo); | 
| + | 
| +  var message = builder.finish(); | 
| + | 
| +  var expectedMemory = new Uint8Array([ | 
| +    /*  0: */   24,    0,    0,    0,    0,    0,    0,    0, | 
| +    /*  8: */    0,    0,    0,    0,   31,    0,    0,    0, | 
| +    /* 16: */    0,    0,    0,    0,    0,    0,    0,    0, | 
| +    /* 24: */   96,    0,    0,    0,    0,    0,    0,    0, | 
| +    /* 32: */ 0xD5, 0xB4, 0x12, 0x02, 0x93, 0x6E, 0x01,    0, | 
| +    /* 40: */    5,    0,    0,    0,    0,    0,    0,    0, | 
| +    /* 48: */   72,    0,    0,    0,    0,    0,    0,    0, | 
| +  ]); | 
| +  // TODO(abarth): Test more of the message's raw memory. | 
| +  var actualMemory = new Uint8Array(message.buffer.arrayBuffer, | 
| +                                    0, expectedMemory.length); | 
| +  assert_weak_equals(actualMemory, expectedMemory); | 
| + | 
| +  var expectedHandles = [ | 
| +    23423782, | 
| +  ]; | 
| + | 
| +  assert_weak_equals(message.handles, expectedHandles); | 
| + | 
| +  var reader = new mojo.internal.MessageReader(message); | 
| + | 
| +  assert_equals(reader.payloadSize, payloadSize); | 
| +  assert_equals(reader.messageName, messageName); | 
| + | 
| +  var foo2 = reader.decodeStruct(sample.Foo); | 
| + | 
| +  assert_equals(foo2.x, foo.x); | 
| +  assert_equals(foo2.y, foo.y); | 
| + | 
| +  assert_equals(foo2.a, foo.a & 1 ? true : false); | 
| +  assert_equals(foo2.b, foo.b & 1 ? true : false); | 
| +  assert_equals(foo2.c, foo.c & 1 ? true : false); | 
| + | 
| +  assert_weak_equals(foo2.bar, foo.bar); | 
| +  assert_weak_equals(foo2.data, foo.data); | 
| + | 
| +  assert_weak_equals(foo2.extraBars, foo.extraBars); | 
| +  assert_equals(foo2.name, foo.name); | 
| +  assert_equals(foo2.source, foo.source); | 
| + | 
| +  assert_weak_equals(foo2.arrayOfBools, foo.arrayOfBools); | 
| +}, 'foo'); | 
| + | 
| + | 
| +// Verify that the references to the imported Rect type in test_structs.mojom | 
| +// are generated correctly. | 
| +test(() => { | 
| + | 
| +  function createRect(x, y, width, height) { | 
| +    var r = new mojo.test.Rect(); | 
| +    r.x = x; | 
| +    r.y = y; | 
| +    r.width = width; | 
| +    r.height = height; | 
| +    return r; | 
| +  } | 
| + | 
| +  var r = new mojo.test.NamedRegion(); | 
| +  r.name = "rectangle"; | 
| +  r.rects = new Array(createRect(1, 2, 3, 4), createRect(10, 20, 30, 40)); | 
| + | 
| +  var builder = new mojo.internal.MessageV0Builder( | 
| +      1, mojo.test.NamedRegion.encodedSize); | 
| +  builder.encodeStruct(mojo.test.NamedRegion, r); | 
| +  var reader = new mojo.internal.MessageReader(builder.finish()); | 
| +  var result = reader.decodeStruct(mojo.test.NamedRegion); | 
| + | 
| +  assert_equals(result.name, "rectangle"); | 
| +  assert_weak_equals(result.rects[0], createRect(1, 2, 3, 4)); | 
| +  assert_weak_equals(result.rects[1], createRect(10, 20, 30, 40)); | 
| +}, 'named region'); | 
| + | 
| +// Verify that a single boolean field in a struct is correctly decoded to | 
| +// boolean type. | 
| +test(() => { | 
| +  var singleBool = new mojo.test.SingleBoolStruct(); | 
| +  singleBool.value = true; | 
| + | 
| +  var builder = new mojo.internal.MessageV0Builder( | 
| +      1, mojo.test.SingleBoolStruct.encodedSize); | 
| +  builder.encodeStruct(mojo.test.SingleBoolStruct, singleBool); | 
| +  var reader = new mojo.internal.MessageReader(builder.finish()); | 
| +  var result = reader.decodeStruct(mojo.test.SingleBoolStruct); | 
| + | 
| +  assert_true(result.value); | 
| +}, 'single boolean struct'); | 
|  | 
| +test(() => { | 
| +  function encodeDecode(cls, input, expectedResult, encodedSize) { | 
| var messageName = 42; | 
| -    var payloadSize = sample.Bar.encodedSize; | 
| - | 
| -    var builder = new codec.MessageV0Builder(messageName, payloadSize); | 
| -    builder.encodeStruct(sample.Bar, bar); | 
| +    var payloadSize = encodedSize || cls.encodedSize; | 
|  | 
| +    var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize); | 
| +    builder.encodeStruct(cls, input) | 
| var message = builder.finish(); | 
|  | 
| -    var expectedMemory = new Uint8Array([ | 
| -      24, 0, 0, 0, | 
| -       0, 0, 0, 0, | 
| -       0, 0, 0, 0, | 
| -      42, 0, 0, 0, | 
| -       0, 0, 0, 0, | 
| -       0, 0, 0, 0, | 
| - | 
| -      16, 0, 0, 0, | 
| -       0, 0, 0, 0, | 
| - | 
| -       1, 2, 3, 0, | 
| -       5, 6, 7, 8, | 
| -    ]); | 
| - | 
| -    var actualMemory = new Uint8Array(message.buffer.arrayBuffer); | 
| -    assert_weak_equals(actualMemory, expectedMemory); | 
| - | 
| -    var reader = new codec.MessageReader(message); | 
| - | 
| +    var reader = new mojo.internal.MessageReader(message); | 
| assert_equals(reader.payloadSize, payloadSize); | 
| assert_equals(reader.messageName, messageName); | 
| - | 
| -    var bar2 = reader.decodeStruct(sample.Bar); | 
| - | 
| -    assert_equals(bar2.alpha, bar.alpha); | 
| -    assert_equals(bar2.beta, bar.beta); | 
| -    assert_equals(bar2.gamma, bar.gamma); | 
| -    assert_false("extraProperty" in bar2); | 
| -  }, 'bar'); | 
| - | 
| -  test(() => { | 
| -    var foo = new sample.Foo(); | 
| -    foo.x = 0x212B4D5; | 
| -    foo.y = 0x16E93; | 
| -    foo.a = 1; | 
| -    foo.b = 0; | 
| -    foo.c = 3; // This will get truncated to one bit. | 
| -    foo.bar = new sample.Bar(); | 
| -    foo.bar.alpha = 91; | 
| -    foo.bar.beta = 82; | 
| -    foo.bar.gamma = 73; | 
| -    foo.data = [ | 
| -      4, 5, 6, 7, 8, | 
| -    ]; | 
| -    foo.extra_bars = [ | 
| -      new sample.Bar(), new sample.Bar(), new sample.Bar(), | 
| -    ]; | 
| -    for (var i = 0; i < foo.extra_bars.length; ++i) { | 
| -      foo.extra_bars[i].alpha = 1 * i; | 
| -      foo.extra_bars[i].beta = 2 * i; | 
| -      foo.extra_bars[i].gamma = 3 * i; | 
| -    } | 
| -    foo.name = "I am a banana"; | 
| -    // This is supposed to be a handle, but we fake it with an integer. | 
| -    foo.source = 23423782; | 
| -    foo.array_of_array_of_bools = [ | 
| -      [true], [false, true] | 
| -    ]; | 
| -    foo.array_of_bools = [ | 
| -      true, false, true, false, true, false, true, true | 
| -    ]; | 
| - | 
| - | 
| -    var messageName = 31; | 
| -    var payloadSize = 304; | 
| - | 
| -    var builder = new codec.MessageV0Builder(messageName, payloadSize); | 
| -    builder.encodeStruct(sample.Foo, foo); | 
| - | 
| -    var message = builder.finish(); | 
| - | 
| -    var expectedMemory = new Uint8Array([ | 
| -      /*  0: */   24,    0,    0,    0,    0,    0,    0,    0, | 
| -      /*  8: */    0,    0,    0,    0,   31,    0,    0,    0, | 
| -      /* 16: */    0,    0,    0,    0,    0,    0,    0,    0, | 
| -      /* 24: */   96,    0,    0,    0,    0,    0,    0,    0, | 
| -      /* 32: */ 0xD5, 0xB4, 0x12, 0x02, 0x93, 0x6E, 0x01,    0, | 
| -      /* 40: */    5,    0,    0,    0,    0,    0,    0,    0, | 
| -      /* 48: */   72,    0,    0,    0,    0,    0,    0,    0, | 
| -    ]); | 
| -    // TODO(abarth): Test more of the message's raw memory. | 
| -    var actualMemory = new Uint8Array(message.buffer.arrayBuffer, | 
| -                                      0, expectedMemory.length); | 
| -    assert_weak_equals(actualMemory, expectedMemory); | 
| - | 
| -    var expectedHandles = [ | 
| -      23423782, | 
| -    ]; | 
| - | 
| -    assert_weak_equals(message.handles, expectedHandles); | 
| - | 
| -    var reader = new codec.MessageReader(message); | 
| - | 
| -    assert_equals(reader.payloadSize, payloadSize); | 
| -    assert_equals(reader.messageName, messageName); | 
| - | 
| -    var foo2 = reader.decodeStruct(sample.Foo); | 
| - | 
| -    assert_equals(foo2.x, foo.x); | 
| -    assert_equals(foo2.y, foo.y); | 
| - | 
| -    assert_equals(foo2.a, foo.a & 1 ? true : false); | 
| -    assert_equals(foo2.b, foo.b & 1 ? true : false); | 
| -    assert_equals(foo2.c, foo.c & 1 ? true : false); | 
| - | 
| -    assert_weak_equals(foo2.bar, foo.bar); | 
| -    assert_weak_equals(foo2.data, foo.data); | 
| - | 
| -    assert_weak_equals(foo2.extra_bars, foo.extra_bars); | 
| -    assert_equals(foo2.name, foo.name); | 
| -    assert_equals(foo2.source, foo.source); | 
| - | 
| -    assert_weak_equals(foo2.array_of_bools, foo.array_of_bools); | 
| -  }, 'foo'); | 
| - | 
| - | 
| -  // Verify that the references to the imported Rect type in test_structs.mojom | 
| -  // are generated correctly. | 
| -  test(() => { | 
| - | 
| -    function createRect(x, y, width, height) { | 
| -      var r = new rect.Rect(); | 
| -      r.x = x; | 
| -      r.y = y; | 
| -      r.width = width; | 
| -      r.height = height; | 
| -      return r; | 
| -    } | 
| - | 
| -    var r = new structs.NamedRegion(); | 
| -    r.name = "rectangle"; | 
| -    r.rects = new Array(createRect(1, 2, 3, 4), createRect(10, 20, 30, 40)); | 
| - | 
| -    var builder = new codec.MessageV0Builder(1, structs.NamedRegion.encodedSize); | 
| -    builder.encodeStruct(structs.NamedRegion, r); | 
| -    var reader = new codec.MessageReader(builder.finish()); | 
| -    var result = reader.decodeStruct(structs.NamedRegion); | 
| - | 
| -    assert_equals(result.name, "rectangle"); | 
| -    assert_weak_equals(result.rects[0], createRect(1, 2, 3, 4)); | 
| -    assert_weak_equals(result.rects[1], createRect(10, 20, 30, 40)); | 
| -  }, 'named region'); | 
| - | 
| -  // Verify that a single boolean field in a struct is correctly decoded to | 
| -  // boolean type. | 
| -  test(() => { | 
| -    var single_bool = new structs.SingleBoolStruct(); | 
| -    single_bool.value = true; | 
| - | 
| -    var builder = new codec.MessageV0Builder( | 
| -        1, structs.SingleBoolStruct.encodedSize); | 
| -    builder.encodeStruct(structs.SingleBoolStruct, single_bool); | 
| -    var reader = new codec.MessageReader(builder.finish()); | 
| -    var result = reader.decodeStruct(structs.SingleBoolStruct); | 
| - | 
| -    assert_true(result.value); | 
| -  }, 'single boolean struct'); | 
| - | 
| -  test(() => { | 
| -    function encodeDecode(cls, input, expectedResult, encodedSize) { | 
| -      var messageName = 42; | 
| -      var payloadSize = encodedSize || cls.encodedSize; | 
| - | 
| -      var builder = new codec.MessageV0Builder(messageName, payloadSize); | 
| -      builder.encodeStruct(cls, input) | 
| -      var message = builder.finish(); | 
| - | 
| -      var reader = new codec.MessageReader(message); | 
| -      assert_equals(reader.payloadSize, payloadSize); | 
| -      assert_equals(reader.messageName, messageName); | 
| -      var result = reader.decodeStruct(cls); | 
| -      assert_equals(result, expectedResult); | 
| -    } | 
| -    encodeDecode(codec.String, "banana", "banana", 24); | 
| -    encodeDecode(codec.NullableString, null, null, 8); | 
| -    encodeDecode(codec.Int8, -1, -1); | 
| -    encodeDecode(codec.Int8, 0xff, -1); | 
| -    encodeDecode(codec.Int16, -1, -1); | 
| -    encodeDecode(codec.Int16, 0xff, 0xff); | 
| -    encodeDecode(codec.Int16, 0xffff, -1); | 
| -    encodeDecode(codec.Int32, -1, -1); | 
| -    encodeDecode(codec.Int32, 0xffff, 0xffff); | 
| -    encodeDecode(codec.Int32, 0xffffffff, -1); | 
| -    encodeDecode(codec.Float, 1.0, 1.0); | 
| -    encodeDecode(codec.Double, 1.0, 1.0); | 
| -  }, 'types'); | 
| - | 
| -  test(() => { | 
| -    var aligned = [ | 
| -      0, // 0 | 
| -      8, // 1 | 
| -      8, // 2 | 
| -      8, // 3 | 
| -      8, // 4 | 
| -      8, // 5 | 
| -      8, // 6 | 
| -      8, // 7 | 
| -      8, // 8 | 
| -      16, // 9 | 
| -      16, // 10 | 
| -      16, // 11 | 
| -      16, // 12 | 
| -      16, // 13 | 
| -      16, // 14 | 
| -      16, // 15 | 
| -      16, // 16 | 
| -      24, // 17 | 
| -      24, // 18 | 
| -      24, // 19 | 
| -      24, // 20 | 
| -    ]; | 
| -    for (var i = 0; i < aligned.length; ++i) | 
| -      assert_equals(codec.align(i), aligned[i]); | 
| - | 
| -  }, 'align'); | 
| - | 
| -  test(() => { | 
| -    var str = "B\u03ba\u1f79";  // some UCS-2 codepoints | 
| -    var messageName = 42; | 
| -    var payloadSize = 24; | 
| - | 
| -    var builder = new codec.MessageV0Builder(messageName, payloadSize); | 
| -    var encoder = builder.createEncoder(8); | 
| -    encoder.encodeStringPointer(str); | 
| -    var message = builder.finish(); | 
| -    var expectedMemory = new Uint8Array([ | 
| -      /*  0: */   24,    0,    0,    0,    0,    0,    0,    0, | 
| -      /*  8: */    0,    0,    0,    0,   42,    0,    0,    0, | 
| -      /* 16: */    0,    0,    0,    0,    0,    0,    0,    0, | 
| -      /* 24: */    8,    0,    0,    0,    0,    0,    0,    0, | 
| -      /* 32: */   14,    0,    0,    0,    6,    0,    0,    0, | 
| -      /* 40: */ 0x42, 0xCE, 0xBA, 0xE1, 0xBD, 0xB9,    0,    0, | 
| -    ]); | 
| -    var actualMemory = new Uint8Array(message.buffer.arrayBuffer); | 
| -    assert_weak_equals(actualMemory, expectedMemory); | 
| - | 
| -    var reader = new codec.MessageReader(message); | 
| -    assert_equals(reader.payloadSize, payloadSize); | 
| -    assert_equals(reader.messageName, messageName); | 
| -    var str2 = reader.decoder.decodeStringPointer(); | 
| -    assert_equals(str2, str); | 
| -  }, 'utf8'); | 
| - | 
| -  test(() => { | 
| -    var encoder = new codec.MessageV0Builder(42, 24).createEncoder(8); | 
| -    function DummyClass() {}; | 
| -    var testCases = [ | 
| -      // method, args, invalid examples, valid examples | 
| -      [encoder.encodeArrayPointer, [DummyClass], [75], | 
| -          [[], null, undefined, new Uint8Array([])]], | 
| -      [encoder.encodeStringPointer, [], [75, new String("foo")], | 
| -          ["", "bar", null, undefined]], | 
| -      [encoder.encodeMapPointer, [DummyClass, DummyClass], [75], | 
| -          [new Map(), null, undefined]], | 
| -    ]; | 
| - | 
| -    testCases.forEach(function(test) { | 
| -      var method = test[0]; | 
| -      var baseArgs = test[1]; | 
| -      var invalidExamples = test[2]; | 
| -      var validExamples = test[3]; | 
| - | 
| -      var encoder = new codec.MessageV0Builder(42, 24).createEncoder(8); | 
| -      invalidExamples.forEach(function(invalid) { | 
| -        assert_throws(null, function() { | 
| -          method.apply(encoder, baseArgs.concat(invalid)); | 
| -        }); | 
| -      }); | 
| - | 
| -      validExamples.forEach(function(valid) { | 
| -        var encoder = new codec.MessageV0Builder(42, 24).createEncoder(8); | 
| -        method.apply(encoder, baseArgs.concat(valid)); | 
| +    var result = reader.decodeStruct(cls); | 
| +    assert_equals(result, expectedResult); | 
| +  } | 
| +  encodeDecode(mojo.internal.String, "banana", "banana", 24); | 
| +  encodeDecode(mojo.internal.NullableString, null, null, 8); | 
| +  encodeDecode(mojo.internal.Int8, -1, -1); | 
| +  encodeDecode(mojo.internal.Int8, 0xff, -1); | 
| +  encodeDecode(mojo.internal.Int16, -1, -1); | 
| +  encodeDecode(mojo.internal.Int16, 0xff, 0xff); | 
| +  encodeDecode(mojo.internal.Int16, 0xffff, -1); | 
| +  encodeDecode(mojo.internal.Int32, -1, -1); | 
| +  encodeDecode(mojo.internal.Int32, 0xffff, 0xffff); | 
| +  encodeDecode(mojo.internal.Int32, 0xffffffff, -1); | 
| +  encodeDecode(mojo.internal.Float, 1.0, 1.0); | 
| +  encodeDecode(mojo.internal.Double, 1.0, 1.0); | 
| +}, 'types'); | 
| + | 
| +test(() => { | 
| +  var aligned = [ | 
| +    0, // 0 | 
| +    8, // 1 | 
| +    8, // 2 | 
| +    8, // 3 | 
| +    8, // 4 | 
| +    8, // 5 | 
| +    8, // 6 | 
| +    8, // 7 | 
| +    8, // 8 | 
| +    16, // 9 | 
| +    16, // 10 | 
| +    16, // 11 | 
| +    16, // 12 | 
| +    16, // 13 | 
| +    16, // 14 | 
| +    16, // 15 | 
| +    16, // 16 | 
| +    24, // 17 | 
| +    24, // 18 | 
| +    24, // 19 | 
| +    24, // 20 | 
| +  ]; | 
| +  for (var i = 0; i < aligned.length; ++i) | 
| +    assert_equals(mojo.internal.align(i), aligned[i]); | 
| + | 
| +}, 'align'); | 
| + | 
| +test(() => { | 
| +  var str = "B\u03ba\u1f79";  // some UCS-2 codepoints | 
| +  var messageName = 42; | 
| +  var payloadSize = 24; | 
| + | 
| +  var builder = new mojo.internal.MessageV0Builder(messageName, payloadSize); | 
| +  var encoder = builder.createEncoder(8); | 
| +  encoder.encodeStringPointer(str); | 
| +  var message = builder.finish(); | 
| +  var expectedMemory = new Uint8Array([ | 
| +    /*  0: */   24,    0,    0,    0,    0,    0,    0,    0, | 
| +    /*  8: */    0,    0,    0,    0,   42,    0,    0,    0, | 
| +    /* 16: */    0,    0,    0,    0,    0,    0,    0,    0, | 
| +    /* 24: */    8,    0,    0,    0,    0,    0,    0,    0, | 
| +    /* 32: */   14,    0,    0,    0,    6,    0,    0,    0, | 
| +    /* 40: */ 0x42, 0xCE, 0xBA, 0xE1, 0xBD, 0xB9,    0,    0, | 
| +  ]); | 
| +  var actualMemory = new Uint8Array(message.buffer.arrayBuffer); | 
| +  assert_weak_equals(actualMemory, expectedMemory); | 
| + | 
| +  var reader = new mojo.internal.MessageReader(message); | 
| +  assert_equals(reader.payloadSize, payloadSize); | 
| +  assert_equals(reader.messageName, messageName); | 
| +  var str2 = reader.decoder.decodeStringPointer(); | 
| +  assert_equals(str2, str); | 
| +}, 'utf8'); | 
| + | 
| +test(() => { | 
| +  var encoder = new mojo.internal.MessageV0Builder(42, 24).createEncoder(8); | 
| +  function DummyClass() {}; | 
| +  var testCases = [ | 
| +    // method, args, invalid examples, valid examples | 
| +    [encoder.encodeArrayPointer, [DummyClass], [75], | 
| +        [[], null, undefined, new Uint8Array([])]], | 
| +    [encoder.encodeStringPointer, [], [75, new String("foo")], | 
| +        ["", "bar", null, undefined]], | 
| +    [encoder.encodeMapPointer, [DummyClass, DummyClass], [75], | 
| +        [new Map(), null, undefined]], | 
| +  ]; | 
| + | 
| +  testCases.forEach(function(test) { | 
| +    var method = test[0]; | 
| +    var baseArgs = test[1]; | 
| +    var invalidExamples = test[2]; | 
| +    var validExamples = test[3]; | 
| + | 
| +    var encoder = new mojo.internal.MessageV0Builder(42, 24).createEncoder(8); | 
| +    invalidExamples.forEach(function(invalid) { | 
| +      assert_throws(null, function() { | 
| +        method.apply(encoder, baseArgs.concat(invalid)); | 
| }); | 
| }); | 
| -  }, 'typed pointer validation'); | 
|  | 
| -  done(); | 
| -}); | 
| +    validExamples.forEach(function(valid) { | 
| +      var encoder = new mojo.internal.MessageV0Builder(42, 24).createEncoder(8); | 
| +      method.apply(encoder, baseArgs.concat(valid)); | 
| +    }); | 
| +  }); | 
| +}, 'typed pointer validation'); | 
| </script> | 
|  |