summaryrefslogtreecommitdiffstats
path: root/dom/ipc/DOMTypes.ipdlh
blob: e02760ada7b68b3301ea2753bb4aeb6e9c622be9 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */
/* vim: set sw=4 ts=8 et tw=80 ft=cpp : */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

include protocol PBlob;
include protocol PSendStream;
include IPCStream;
include ProtocolTypes;

using struct mozilla::void_t
  from "ipc/IPCMessageUtils.h";

using struct mozilla::SerializedStructuredCloneBuffer
  from "ipc/IPCMessageUtils.h";

namespace mozilla {
namespace dom {

union OptionalID
{
  nsID;
  void_t;
};

struct MessagePortIdentifier
{
  nsID uuid;
  nsID destinationUuid;
  uint32_t sequenceId;
  bool neutered;
};

struct ClonedMessageData
{
  SerializedStructuredCloneBuffer data;
  PBlob[] blobs;
  MessagePortIdentifier[] identfiers;
};

struct BlobDataStream
{
  IPCStream stream;
  uint64_t length;
};

union BlobData
{
  // For remote blobs.
  nsID;

  // For memory-backed blobs.
  BlobDataStream;

  // For multiplex blobs.
  BlobData[];
};

union OptionalBlobData
{
  BlobData;
  void_t;
};

struct NormalBlobConstructorParams
{
  nsString contentType;
  uint64_t length;

  // This must be of type BlobData in a child->parent message, and will always
  // be of type void_t in a parent->child message.
  OptionalBlobData optionalBlobData;
};

struct FileBlobConstructorParams
{
  nsString name;
  nsString contentType;
  nsString path;
  uint64_t length;
  int64_t modDate;
  bool isDirectory;

  // This must be of type BlobData in a child->parent message, and will always
  // be of type void_t in a parent->child message.
  OptionalBlobData optionalBlobData;
};

struct SlicedBlobConstructorParams
{
  PBlob source;
  nsID id;
  uint64_t begin;
  uint64_t end;
  nsString contentType;
};

struct MysteryBlobConstructorParams
{
  // Nothing is known about this type of blob.
};

struct KnownBlobConstructorParams
{
  nsID id;
};

// This may only be used for same-process inter-thread communication!
struct SameProcessBlobConstructorParams
{
  // This member should be reinterpret_cast'd to mozilla::dom::BlobImpl. It
  // carries a reference.
  intptr_t addRefedBlobImpl;
};

union AnyBlobConstructorParams
{
  // These types may be sent to/from parent and child.
  NormalBlobConstructorParams;
  FileBlobConstructorParams;
  SameProcessBlobConstructorParams;

  // This type may only be sent from parent to child.
  MysteryBlobConstructorParams;

  // These types may only be sent from child to parent.
  SlicedBlobConstructorParams;
  KnownBlobConstructorParams;
};

struct ChildBlobConstructorParams
{
  nsID id;

  // May not be SlicedBlobConstructorParams or KnownBlobConstructorParams.
  AnyBlobConstructorParams blobParams;
};

struct ParentBlobConstructorParams
{
  // May not be MysteryBlobConstructorParams.
  AnyBlobConstructorParams blobParams;
};

union BlobConstructorParams
{
  ChildBlobConstructorParams;
  ParentBlobConstructorParams;
};

union IPCDataTransferData
{
  nsString;  // text
  Shmem;     // images using Shmem
  PBlob;     // files
};

struct IPCDataTransferImage
{
  uint32_t width;
  uint32_t height;
  uint32_t stride;
  uint8_t format;
};

struct IPCDataTransferItem
{
  nsCString flavor;
  // The image details are only used when transferring images.
  IPCDataTransferImage imageDetails;
  IPCDataTransferData data;
};

struct IPCDataTransfer
{
  IPCDataTransferItem[] items;
};

} // namespace dom
} // namespace mozilla