summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/bindings/core/v8/serialization/serialization_tag.h
blob: a0eaa09214dede35030b745f3c00fb2f4feaed35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_SERIALIZATION_SERIALIZATION_TAG_H_
#define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_SERIALIZATION_SERIALIZATION_TAG_H_

namespace blink {

// Serialization format is a sequence of tags followed by zero or more data
// arguments.  Tags always take exactly one byte. A serialized stream first
// begins with a complete VersionTag. If the stream does not begin with a
// VersionTag, we assume that the stream is in format 0.

// Tags which are not interpreted by Blink (but instead by V8) are omitted here.

// This format is private to the implementation of SerializedScriptValue. Do not
// rely on it externally. It is safe to persist a SerializedScriptValue as a
// binary blob, but this code should always be used to interpret it.

// WebCoreStrings are read as (length:uint32_t, string:UTF8[length]).
// RawStrings are read as (length:uint32_t, string:UTF8[length]).
// RawUCharStrings are read as
//     (length:uint32_t, string:UChar[length/sizeof(UChar)]).
// RawFiles are read as
//     (path:WebCoreString, url:WebCoreStrng, type:WebCoreString).
// There is a reference table that maps object references (uint32_t) to
// v8::Values.
// Tokens marked with (ref) are inserted into the reference table and given the
// next object reference ID after decoding.
// All tags except InvalidTag, PaddingTag, ReferenceCountTag, VersionTag,
// GenerateFreshObjectTag and GenerateFreshArrayTag push their results to the
// deserialization stack.
// There is also an 'open' stack that is used to resolve circular references.
// Objects or arrays may contain self-references. Before we begin to deserialize
// the contents of these values, they are first given object reference IDs (by
// GenerateFreshObjectTag/GenerateFreshArrayTag); these reference IDs are then
// used with ObjectReferenceTag to tie the recursive knot.
enum SerializationTag {
  kMessagePortTag = 'M',  // index:int -> MessagePort. Fills the result with
                          // transferred MessagePort.
  kMojoHandleTag = 'h',   // index:int -> MojoHandle. Fills the result with
                          // transferred MojoHandle.
  kBlobTag = 'b',  // uuid:WebCoreString, type:WebCoreString, size:uint64_t ->
                   // Blob (ref)
  kBlobIndexTag = 'i',      // index:int32_t -> Blob (ref)
  kFileTag = 'f',           // file:RawFile -> File (ref)
  kFileIndexTag = 'e',      // index:int32_t -> File (ref)
  kDOMFileSystemTag = 'd',  // type:int32_t, name:WebCoreString,
                            // uuid:WebCoreString -> FileSystem (ref)
  kNativeFileSystemFileHandleTag = 'n',  // name:WebCoreString, index:uint32_t
                                         // -> NativeFileSystemFileHandle (ref)
  kNativeFileSystemDirectoryHandleTag =
      'N',  // name:WebCoreString, index:uint32_t ->
            // NativeFileSystemDirectoryHandle (ref)
  kFileListTag =
      'l',  // length:uint32_t, files:RawFile[length] -> FileList (ref)
  kFileListIndexTag =
      'L',  // length:uint32_t, files:int32_t[length] -> FileList (ref)
  kImageDataTag = '#',    // tags terminated by ImageSerializationTag::kEnd (see
                          // SerializedColorParams.h), width:uint32_t,
                          // height:uint32_t, pixelDataLength:uint64_t,
                          // data:byte[pixelDataLength]
                          // -> ImageData (ref)
  kImageBitmapTag = 'g',  // tags terminated by ImageSerializationTag::kEnd (see
                          // SerializedColorParams.h), width:uint32_t,
                          // height:uint32_t, pixelDataLength:uint32_t,
                          // data:byte[pixelDataLength]
                          // -> ImageBitmap (ref)
  kImageBitmapTransferTag =
      'G',  // index:uint32_t -> ImageBitmap. For ImageBitmap transfer
  kOffscreenCanvasTransferTag = 'H',  // index, width, height, id,
                                      // filter_quality::uint32_t ->
                                      // OffscreenCanvas. For OffscreenCanvas
                                      // transfer
  kReadableStreamTransferTag = 'r',   // index:uint32_t
  kTransformStreamTransferTag = 'm',  // index:uint32_t
  kWritableStreamTransferTag = 'w',   // index:uint32_t
  kDOMPointTag = 'Q',                 // x:Double, y:Double, z:Double, w:Double
  kDOMPointReadOnlyTag = 'W',         // x:Double, y:Double, z:Double, w:Double
  kDOMRectTag = 'E',          // x:Double, y:Double, width:Double, height:Double
  kDOMRectReadOnlyTag = 'R',  // x:Double, y:Double, width:Double, height:Double
  kDOMQuadTag = 'T',          // p1:Double, p2:Double, p3:Double, p4:Double
  kDOMMatrixTag = 'Y',        // m11..m44: 16 Double
  kDOMMatrixReadOnlyTag = 'U',    // m11..m44: 16 Double
  kDOMMatrix2DTag = 'I',          // a..f: 6 Double
  kDOMMatrix2DReadOnlyTag = 'O',  // a..f: 6 Double
  kCryptoKeyTag = 'K',            // subtag:byte, props, usages:uint32_t,
                        // keyDataLength:uint32_t, keyData:byte[keyDataLength]
  //                 If subtag=AesKeyTag:
  //                     props = keyLengthBytes:uint32_t, algorithmId:uint32_t
  //                 If subtag=HmacKeyTag:
  //                     props = keyLengthBytes:uint32_t, hashId:uint32_t
  //                 If subtag=RsaHashedKeyTag:
  //                     props = algorithmId:uint32_t, type:uint32_t,
  //                     modulusLengthBits:uint32_t,
  //                     publicExponentLength:uint32_t,
  //                     publicExponent:byte[publicExponentLength],
  //                     hashId:uint32_t
  //                 If subtag=EcKeyTag:
  //                     props = algorithmId:uint32_t, type:uint32_t,
  //                     namedCurve:uint32_t
  kRTCCertificateTag = 'k',  // length:uint32_t, pemPrivateKey:WebCoreString,
                             // pemCertificate:WebCoreString
  kRTCEncodedAudioFrameTag = 'A',  // uint32_t -> transferred audio frame ID
  kRTCEncodedVideoFrameTag = 'V',  // uint32_t -> transferred video frame ID

  // The following tags were used by the Shape Detection API implementation
  // between M71 and M81. During these milestones, the API was always behind
  // a flag. Usage was removed in https://crrev.com/c/2040378.
  kDeprecatedDetectedBarcodeTag = 'B',
  kDeprecatedDetectedFaceTag = 'F',
  kDeprecatedDetectedTextTag = 't',

  kDOMExceptionTag = 'x',  // name:String,message:String,stack:String
  kVersionTag = 0xFF       // version:uint32_t -> Uses this as the file version.
};

}  // namespace blink

#endif