Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(888)

Unified Diff: mojo/public/js/bindings/codec.js

Issue 411553003: Validate incoming JS Message Headers: test message parser (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed WebUIMojoTest.EndToEndPing Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/public/js/bindings/buffer.js ('k') | mojo/public/js/bindings/codec_unittests.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/js/bindings/codec.js
diff --git a/mojo/public/js/bindings/codec.js b/mojo/public/js/bindings/codec.js
index 9756f4a5d6b59ca478cc6187808c7a256556c308..dca6009071d01a724845d27d8f2dfa9b3f969bc5 100644
--- a/mojo/public/js/bindings/codec.js
+++ b/mojo/public/js/bindings/codec.js
@@ -3,112 +3,20 @@
// found in the LICENSE file.
define("mojo/public/js/bindings/codec", [
- "mojo/public/js/bindings/unicode"
-], function(unicode) {
+ "mojo/public/js/bindings/unicode",
+ "mojo/public/js/bindings/buffer"
+ ], function(unicode, buffer) {
var kErrorUnsigned = "Passing negative value to unsigned";
// Memory -------------------------------------------------------------------
var kAlignment = 8;
- var kHighWordMultiplier = 0x100000000;
- var kHostIsLittleEndian = (function () {
- var endianArrayBuffer = new ArrayBuffer(2);
- var endianUint8Array = new Uint8Array(endianArrayBuffer);
- var endianUint16Array = new Uint16Array(endianArrayBuffer);
- endianUint16Array[0] = 1;
- return endianUint8Array[0] == 1;
- })();
function align(size) {
return size + (kAlignment - (size % kAlignment)) % kAlignment;
}
- function getInt64(dataView, byteOffset, value) {
- var lo, hi;
- if (kHostIsLittleEndian) {
- lo = dataView.getUint32(byteOffset, kHostIsLittleEndian);
- hi = dataView.getInt32(byteOffset + 4, kHostIsLittleEndian);
- } else {
- hi = dataView.getInt32(byteOffset, kHostIsLittleEndian);
- lo = dataView.getUint32(byteOffset + 4, kHostIsLittleEndian);
- }
- return lo + hi * kHighWordMultiplier;
- }
-
- function getUint64(dataView, byteOffset, value) {
- var lo, hi;
- if (kHostIsLittleEndian) {
- lo = dataView.getUint32(byteOffset, kHostIsLittleEndian);
- hi = dataView.getUint32(byteOffset + 4, kHostIsLittleEndian);
- } else {
- hi = dataView.getUint32(byteOffset, kHostIsLittleEndian);
- lo = dataView.getUint32(byteOffset + 4, kHostIsLittleEndian);
- }
- return lo + hi * kHighWordMultiplier;
- }
-
- function setInt64(dataView, byteOffset, value) {
- var hi = Math.floor(value / kHighWordMultiplier);
- if (kHostIsLittleEndian) {
- dataView.setInt32(byteOffset, value, kHostIsLittleEndian);
- dataView.setInt32(byteOffset + 4, hi, kHostIsLittleEndian);
- } else {
- dataView.setInt32(byteOffset, hi, kHostIsLittleEndian);
- dataView.setInt32(byteOffset + 4, value, kHostIsLittleEndian);
- }
- }
-
- function setUint64(dataView, byteOffset, value) {
- var hi = (value / kHighWordMultiplier) | 0;
- if (kHostIsLittleEndian) {
- dataView.setInt32(byteOffset, value, kHostIsLittleEndian);
- dataView.setInt32(byteOffset + 4, hi, kHostIsLittleEndian);
- } else {
- dataView.setInt32(byteOffset, hi, kHostIsLittleEndian);
- dataView.setInt32(byteOffset + 4, value, kHostIsLittleEndian);
- }
- }
-
- function copyArrayBuffer(dstArrayBuffer, srcArrayBuffer) {
- (new Uint8Array(dstArrayBuffer)).set(new Uint8Array(srcArrayBuffer));
- }
-
- // Buffer -------------------------------------------------------------------
-
- function Buffer(sizeOrArrayBuffer) {
- if (sizeOrArrayBuffer instanceof ArrayBuffer) {
- this.arrayBuffer = sizeOrArrayBuffer;
- } else {
- this.arrayBuffer = new ArrayBuffer(sizeOrArrayBuffer);
- };
-
- this.dataView = new DataView(this.arrayBuffer);
- this.next = 0;
- }
-
- Buffer.prototype.alloc = function(size) {
- var pointer = this.next;
- this.next += size;
- if (this.next > this.arrayBuffer.byteLength) {
- var newSize = (1.5 * (this.arrayBuffer.byteLength + size)) | 0;
- this.grow(newSize);
- }
- return pointer;
- };
-
- Buffer.prototype.grow = function(size) {
- var newArrayBuffer = new ArrayBuffer(size);
- copyArrayBuffer(newArrayBuffer, this.arrayBuffer);
- this.arrayBuffer = newArrayBuffer;
- this.dataView = new DataView(this.arrayBuffer);
- };
-
- Buffer.prototype.trim = function() {
- this.arrayBuffer = this.arrayBuffer.slice(0, this.next);
- this.dataView = new DataView(this.arrayBuffer);
- };
-
// Constants ----------------------------------------------------------------
var kArrayHeaderSize = 8;
@@ -130,64 +38,61 @@ define("mojo/public/js/bindings/codec", [
};
Decoder.prototype.readInt8 = function() {
- var result = this.buffer.dataView.getInt8(this.next, kHostIsLittleEndian);
+ var result = this.buffer.getInt8(this.next);
this.next += 1;
return result;
};
Decoder.prototype.readUint8 = function() {
- var result = this.buffer.dataView.getUint8(this.next, kHostIsLittleEndian);
+ var result = this.buffer.getUint8(this.next);
this.next += 1;
return result;
};
Decoder.prototype.readInt16 = function() {
- var result = this.buffer.dataView.getInt16(this.next, kHostIsLittleEndian);
+ var result = this.buffer.getInt16(this.next);
this.next += 2;
return result;
};
Decoder.prototype.readUint16 = function() {
- var result = this.buffer.dataView.getUint16(this.next, kHostIsLittleEndian);
+ var result = this.buffer.getUint16(this.next);
this.next += 2;
return result;
};
Decoder.prototype.readInt32 = function() {
- var result = this.buffer.dataView.getInt32(this.next, kHostIsLittleEndian);
+ var result = this.buffer.getInt32(this.next);
this.next += 4;
return result;
};
Decoder.prototype.readUint32 = function() {
- var result = this.buffer.dataView.getUint32(this.next, kHostIsLittleEndian);
+ var result = this.buffer.getUint32(this.next);
this.next += 4;
return result;
};
Decoder.prototype.readInt64 = function() {
- var result = getInt64(this.buffer.dataView, this.next, kHostIsLittleEndian);
+ var result = this.buffer.getInt64(this.next);
this.next += 8;
return result;
};
Decoder.prototype.readUint64 = function() {
- var result = getUint64(
- this.buffer.dataView, this.next, kHostIsLittleEndian);
+ var result = this.buffer.getUint64(this.next);
this.next += 8;
return result;
};
Decoder.prototype.readFloat = function() {
- var result = this.buffer.dataView.getFloat32(
- this.next, kHostIsLittleEndian);
+ var result = this.buffer.getFloat32(this.next);
this.next += 4;
return result;
};
Decoder.prototype.readDouble = function() {
- var result = this.buffer.dataView.getFloat64(
- this.next, kHostIsLittleEndian);
+ var result = this.buffer.getFloat64(this.next);
this.next += 8;
return result;
};
@@ -293,8 +198,7 @@ define("mojo/public/js/bindings/codec", [
};
Encoder.prototype.writeInt8 = function(val) {
- // NOTE: Endianness doesn't come into play for single bytes.
- this.buffer.dataView.setInt8(this.next, val);
+ this.buffer.setInt8(this.next, val);
this.next += 1;
};
@@ -302,13 +206,12 @@ define("mojo/public/js/bindings/codec", [
if (val < 0) {
throw new Error(kErrorUnsigned);
}
- // NOTE: Endianness doesn't come into play for single bytes.
- this.buffer.dataView.setUint8(this.next, val);
+ this.buffer.setUint8(this.next, val);
this.next += 1;
};
Encoder.prototype.writeInt16 = function(val) {
- this.buffer.dataView.setInt16(this.next, val, kHostIsLittleEndian);
+ this.buffer.setInt16(this.next, val);
this.next += 2;
};
@@ -316,12 +219,12 @@ define("mojo/public/js/bindings/codec", [
if (val < 0) {
throw new Error(kErrorUnsigned);
}
- this.buffer.dataView.setUint16(this.next, val, kHostIsLittleEndian);
+ this.buffer.setUint16(this.next, val);
this.next += 2;
};
Encoder.prototype.writeInt32 = function(val) {
- this.buffer.dataView.setInt32(this.next, val, kHostIsLittleEndian);
+ this.buffer.setInt32(this.next, val);
this.next += 4;
};
@@ -329,12 +232,12 @@ define("mojo/public/js/bindings/codec", [
if (val < 0) {
throw new Error(kErrorUnsigned);
}
- this.buffer.dataView.setUint32(this.next, val, kHostIsLittleEndian);
+ this.buffer.setUint32(this.next, val);
this.next += 4;
};
Encoder.prototype.writeInt64 = function(val) {
- setInt64(this.buffer.dataView, this.next, val);
+ this.buffer.setInt64(this.next, val);
this.next += 8;
};
@@ -342,17 +245,17 @@ define("mojo/public/js/bindings/codec", [
if (val < 0) {
throw new Error(kErrorUnsigned);
}
- setUint64(this.buffer.dataView, this.next, val);
+ this.buffer.setUint64(this.next, val);
this.next += 8;
};
Encoder.prototype.writeFloat = function(val) {
- this.buffer.dataView.setFloat32(this.next, val, kHostIsLittleEndian);
+ this.buffer.setFloat32(this.next, val);
this.next += 4;
};
Encoder.prototype.writeDouble = function(val) {
- this.buffer.dataView.setFloat64(this.next, val, kHostIsLittleEndian);
+ this.buffer.setFloat64(this.next, val);
this.next += 8;
};
@@ -465,11 +368,11 @@ define("mojo/public/js/bindings/codec", [
Message.prototype.setRequestID = function(requestID) {
// TODO(darin): Verify that space was reserved for this field!
- setUint64(this.buffer.dataView, kRequestIDOffset, requestID);
+ this.buffer.setUint64(kRequestIDOffset, requestID);
};
Message.prototype.getFlags = function() {
- return this.buffer.dataView.getUint32(kFlagsOffset, kHostIsLittleEndian);
+ return this.buffer.getUint32(kFlagsOffset);
};
// MessageBuilder -----------------------------------------------------------
@@ -478,7 +381,7 @@ define("mojo/public/js/bindings/codec", [
// Currently, we don't compute the payload size correctly ahead of time.
// Instead, we resize the buffer at the end.
var numberOfBytes = kMessageHeaderSize + payloadSize;
- this.buffer = new Buffer(numberOfBytes);
+ this.buffer = new buffer.Buffer(numberOfBytes);
this.handles = [];
var encoder = this.createEncoder(kMessageHeaderSize);
encoder.writeUint32(kMessageHeaderSize);
@@ -514,7 +417,7 @@ define("mojo/public/js/bindings/codec", [
// Currently, we don't compute the payload size correctly ahead of time.
// Instead, we resize the buffer at the end.
var numberOfBytes = kMessageWithRequestIDHeaderSize + payloadSize;
- this.buffer = new Buffer(numberOfBytes);
+ this.buffer = new buffer.Buffer(numberOfBytes);
this.handles = [];
var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
encoder.writeUint32(kMessageWithRequestIDHeaderSize);
@@ -535,8 +438,7 @@ define("mojo/public/js/bindings/codec", [
function MessageReader(message) {
this.decoder = new Decoder(message.buffer, message.handles, 0);
var messageHeaderSize = this.decoder.readUint32();
- this.payloadSize =
- message.buffer.arrayBuffer.byteLength - messageHeaderSize;
+ this.payloadSize = message.buffer.byteLength - messageHeaderSize;
var numFields = this.decoder.readUint32();
this.messageName = this.decoder.readUint32();
this.flags = this.decoder.readUint32();
@@ -764,7 +666,6 @@ define("mojo/public/js/bindings/codec", [
var exports = {};
exports.align = align;
- exports.Buffer = Buffer;
exports.Message = Message;
exports.MessageBuilder = MessageBuilder;
exports.MessageWithRequestIDBuilder = MessageWithRequestIDBuilder;
« no previous file with comments | « mojo/public/js/bindings/buffer.js ('k') | mojo/public/js/bindings/codec_unittests.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698