2
* Copyright (C) 2010 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23
* THE POSSIBILITY OF SUCH DAMAGE.
26
#ifndef UserMessageCoders_h
27
#define UserMessageCoders_h
29
#include "ArgumentDecoder.h"
30
#include "ArgumentEncoder.h"
31
#include "DataReference.h"
32
#include "ImmutableArray.h"
33
#include "ImmutableDictionary.h"
34
#include "ShareableBitmap.h"
35
#include "WebCertificateInfo.h"
36
#include "WebCoreArgumentCoders.h"
38
#include "WebGeometry.h"
40
#include "WebNumber.h"
41
#include "WebRenderLayer.h"
42
#include "WebRenderObject.h"
43
#include "WebSerializedScriptValue.h"
44
#include "WebString.h"
46
#include "WebURLRequest.h"
47
#include "WebUserContentURLPattern.h"
53
// - Dictionary -> Dictionary
54
// - SerializedScriptValue -> SerializedScriptValue
56
// - UserContentURLPattern -> UserContentURLPattern
57
// - WebCertificateInfo -> WebCertificateInfo
58
// - WebData -> WebData
59
// - WebDouble -> WebDouble
60
// - WebImage -> WebImage
61
// - WebRenderLayer -> WebRenderLayer
62
// - WebRenderObject -> WebRenderObject
63
// - WebUInt64 -> WebUInt64
65
// - WebURLRequest -> WebURLRequest
67
template<typename Owner>
68
class UserMessageEncoder {
70
bool baseEncode(CoreIPC::ArgumentEncoder& encoder, APIObject::Type& type) const
73
encoder << static_cast<uint32_t>(APIObject::TypeNull);
77
type = m_root->type();
78
encoder << static_cast<uint32_t>(type);
81
case APIObject::TypeArray: {
82
ImmutableArray* array = static_cast<ImmutableArray*>(m_root);
83
encoder << static_cast<uint64_t>(array->size());
84
for (size_t i = 0; i < array->size(); ++i)
85
encoder << Owner(array->at(i));
88
case APIObject::TypeDictionary: {
89
ImmutableDictionary* dictionary = static_cast<ImmutableDictionary*>(m_root);
90
const ImmutableDictionary::MapType& map = dictionary->map();
91
encoder << static_cast<uint64_t>(map.size());
93
ImmutableDictionary::MapType::const_iterator it = map.begin();
94
ImmutableDictionary::MapType::const_iterator end = map.end();
95
for (; it != end; ++it) {
97
encoder << Owner(it->value.get());
101
case APIObject::TypeString: {
102
WebString* string = static_cast<WebString*>(m_root);
103
encoder << string->string();
106
case APIObject::TypeSerializedScriptValue: {
107
WebSerializedScriptValue* scriptValue = static_cast<WebSerializedScriptValue*>(m_root);
108
encoder << scriptValue->dataReference();
111
case APIObject::TypeBoolean: {
112
WebBoolean* booleanObject = static_cast<WebBoolean*>(m_root);
113
encoder << booleanObject->value();
116
case APIObject::TypeDouble: {
117
WebDouble* doubleObject = static_cast<WebDouble*>(m_root);
118
encoder << doubleObject->value();
121
case APIObject::TypeUInt64: {
122
WebUInt64* uint64Object = static_cast<WebUInt64*>(m_root);
123
encoder << uint64Object->value();
126
case APIObject::TypePoint: {
127
WebPoint* pointObject = static_cast<WebPoint*>(m_root);
128
encoder << pointObject->point().x;
129
encoder << pointObject->point().y;
132
case APIObject::TypeSize: {
133
WebSize* sizeObject = static_cast<WebSize*>(m_root);
134
encoder << sizeObject->size().width;
135
encoder << sizeObject->size().height;
138
case APIObject::TypeRect: {
139
WebRect* rectObject = static_cast<WebRect*>(m_root);
140
encoder << rectObject->rect().origin.x;
141
encoder << rectObject->rect().origin.y;
142
encoder << rectObject->rect().size.width;
143
encoder << rectObject->rect().size.height;
146
case APIObject::TypeRenderLayer: {
147
WebRenderLayer* renderLayer = static_cast<WebRenderLayer*>(m_root);
148
encoder << Owner(renderLayer->renderer());
149
encoder << renderLayer->isReflection();
150
encoder << renderLayer->isClipping();
151
encoder << renderLayer->isClipped();
152
encoder << static_cast<uint32_t>(renderLayer->compositingLayerType());
153
encoder << renderLayer->absoluteBoundingBox();
154
encoder << Owner(renderLayer->negativeZOrderList());
155
encoder << Owner(renderLayer->normalFlowList());
156
encoder << Owner(renderLayer->positiveZOrderList());
159
case APIObject::TypeRenderObject: {
160
WebRenderObject* renderObject = static_cast<WebRenderObject*>(m_root);
161
encoder << renderObject->name();
162
encoder << renderObject->elementTagName();
163
encoder << renderObject->elementID();
164
encoder << Owner(renderObject->elementClassNames());
165
encoder << renderObject->absolutePosition();
166
encoder << renderObject->frameRect();
167
encoder << Owner(renderObject->children().get());
170
case APIObject::TypeURL: {
171
WebURL* urlObject = static_cast<WebURL*>(m_root);
172
encoder << urlObject->string();
175
case APIObject::TypeURLRequest: {
176
WebURLRequest* urlRequestObject = static_cast<WebURLRequest*>(m_root);
177
encoder << urlRequestObject->resourceRequest();
180
case APIObject::TypeUserContentURLPattern: {
181
WebUserContentURLPattern* urlPattern = static_cast<WebUserContentURLPattern*>(m_root);
182
encoder << urlPattern->patternString();
185
case APIObject::TypeImage: {
186
WebImage* image = static_cast<WebImage*>(m_root);
188
ShareableBitmap::Handle handle;
189
ASSERT(!image->bitmap() || image->bitmap()->isBackedBySharedMemory());
190
if (!image->bitmap() || !image->bitmap()->isBackedBySharedMemory() || !image->bitmap()->createHandle(handle)) {
191
// Initial false indicates no allocated bitmap or is not shareable.
196
// Initial true indicates a bitmap was allocated and is shareable.
202
case APIObject::TypeData: {
203
WebData* data = static_cast<WebData*>(m_root);
204
encoder << data->dataReference();
207
case APIObject::TypeCertificateInfo: {
208
WebCertificateInfo* certificateInfo = static_cast<WebCertificateInfo*>(m_root);
209
encoder << certificateInfo->platformCertificateInfo();
220
UserMessageEncoder(APIObject* root)
232
// - Dictionary -> Dictionary
233
// - SerializedScriptValue -> SerializedScriptValue
234
// - String -> String
235
// - UserContentURLPattern -> UserContentURLPattern
236
// - WebCertificateInfo -> WebCertificateInfo
237
// - WebData -> WebData
238
// - WebDouble -> WebDouble
239
// - WebImage -> WebImage
240
// - WebUInt64 -> WebUInt64
241
// - WebURL -> WebURL
242
// - WebURLRequest -> WebURLRequest
244
template<typename Owner>
245
class UserMessageDecoder {
247
static bool baseDecode(CoreIPC::ArgumentDecoder* decoder, Owner& coder, APIObject::Type& type)
249
uint32_t typeAsUInt32;
250
if (!decoder->decode(typeAsUInt32))
253
type = static_cast<APIObject::Type>(typeAsUInt32);
256
case APIObject::TypeArray: {
258
if (!decoder->decode(size))
261
Vector<RefPtr<APIObject> > vector;
262
for (size_t i = 0; i < size; ++i) {
263
RefPtr<APIObject> element;
264
Owner messageCoder(coder, element);
265
if (!decoder->decode(messageCoder))
267
vector.append(element.release());
270
coder.m_root = ImmutableArray::adopt(vector);
273
case APIObject::TypeDictionary: {
275
if (!decoder->decode(size))
278
ImmutableDictionary::MapType map;
279
for (size_t i = 0; i < size; ++i) {
281
if (!decoder->decode(key))
284
RefPtr<APIObject> element;
285
Owner messageCoder(coder, element);
286
if (!decoder->decode(messageCoder))
289
ImmutableDictionary::MapType::AddResult result = map.set(key, element.release());
290
if (!result.isNewEntry)
294
coder.m_root = ImmutableDictionary::adopt(map);
297
case APIObject::TypeString: {
299
if (!decoder->decode(string))
301
coder.m_root = WebString::create(string);
304
case APIObject::TypeSerializedScriptValue: {
305
CoreIPC::DataReference dataReference;
306
if (!decoder->decode(dataReference))
309
Vector<uint8_t> vector = dataReference.vector();
310
coder.m_root = WebSerializedScriptValue::adopt(vector);
313
case APIObject::TypeDouble: {
315
if (!decoder->decode(value))
317
coder.m_root = WebDouble::create(value);
320
case APIObject::TypeUInt64: {
322
if (!decoder->decode(value))
324
coder.m_root = WebUInt64::create(value);
327
case APIObject::TypeBoolean: {
329
if (!decoder->decode(value))
331
coder.m_root = WebBoolean::create(value);
334
case APIObject::TypeSize: {
337
if (!decoder->decode(width))
339
if (!decoder->decode(height))
341
coder.m_root = WebSize::create(WKSizeMake(width, height));
344
case APIObject::TypePoint: {
347
if (!decoder->decode(x))
349
if (!decoder->decode(y))
351
coder.m_root = WebPoint::create(WKPointMake(x, y));
354
case APIObject::TypeRect: {
359
if (!decoder->decode(x))
361
if (!decoder->decode(y))
363
if (!decoder->decode(width))
365
if (!decoder->decode(height))
367
coder.m_root = WebRect::create(WKRectMake(x, y, width, height));
370
case APIObject::TypeRenderLayer: {
371
RefPtr<APIObject> renderer;
375
uint32_t compositingLayerTypeAsUInt32;
376
WebCore::IntRect absoluteBoundingBox;
377
RefPtr<APIObject> negativeZOrderList;
378
RefPtr<APIObject> normalFlowList;
379
RefPtr<APIObject> positiveZOrderList;
381
Owner rendererCoder(coder, renderer);
382
if (!decoder->decode(rendererCoder))
384
if (renderer->type() != APIObject::TypeRenderObject)
386
if (!decoder->decodeBool(isReflection))
388
if (!decoder->decodeBool(isClipping))
390
if (!decoder->decodeBool(isClipped))
392
if (!decoder->decodeUInt32(compositingLayerTypeAsUInt32))
394
if (!decoder->decode(absoluteBoundingBox))
396
Owner negativeZOrderListCoder(coder, negativeZOrderList);
397
if (!decoder->decode(negativeZOrderListCoder))
399
Owner normalFlowListCoder(coder, normalFlowList);
400
if (!decoder->decode(normalFlowListCoder))
402
Owner positiveZOrderListCoder(coder, positiveZOrderList);
403
if (!decoder->decode(positiveZOrderListCoder))
405
coder.m_root = WebRenderLayer::create(static_pointer_cast<WebRenderObject>(renderer), isReflection, isClipping, isClipped, static_cast<WebRenderLayer::CompositingLayerType>(compositingLayerTypeAsUInt32),
406
absoluteBoundingBox, static_pointer_cast<MutableArray>(negativeZOrderList), static_pointer_cast<MutableArray>(normalFlowList),
407
static_pointer_cast<MutableArray>(positiveZOrderList));
410
case APIObject::TypeRenderObject: {
412
String elementTagName;
414
RefPtr<APIObject> elementClassNames;
415
WebCore::IntPoint absolutePosition;
416
WebCore::IntRect frameRect;
417
RefPtr<APIObject> children;
419
if (!decoder->decode(name))
421
if (!decoder->decode(elementTagName))
423
if (!decoder->decode(elementID))
425
Owner classNamesCoder(coder, elementClassNames);
426
if (!decoder->decode(classNamesCoder))
428
if (!decoder->decode(absolutePosition))
430
if (!decoder->decode(frameRect))
432
Owner messageCoder(coder, children);
433
if (!decoder->decode(messageCoder))
435
if (children && children->type() != APIObject::TypeArray)
437
coder.m_root = WebRenderObject::create(name, elementTagName, elementID, WTF::static_pointer_cast<MutableArray>(elementClassNames), absolutePosition, frameRect, WTF::static_pointer_cast<MutableArray>(children));
440
case APIObject::TypeURL: {
442
if (!decoder->decode(string))
444
coder.m_root = WebURL::create(string);
447
case APIObject::TypeURLRequest: {
448
WebCore::ResourceRequest request;
449
if (!decoder->decode(request))
451
coder.m_root = WebURLRequest::create(request);
454
case APIObject::TypeUserContentURLPattern: {
456
if (!decoder->decode(string))
458
coder.m_root = WebUserContentURLPattern::create(string);
461
case APIObject::TypeImage: {
462
bool didEncode = false;
463
if (!decoder->decode(didEncode))
469
ShareableBitmap::Handle handle;
470
if (!decoder->decode(handle))
473
coder.m_root = WebImage::create(ShareableBitmap::create(handle));
476
case APIObject::TypeData: {
477
CoreIPC::DataReference dataReference;
478
if (!decoder->decode(dataReference))
480
coder.m_root = WebData::create(dataReference.data(), dataReference.size());
483
case APIObject::TypeCertificateInfo: {
484
PlatformCertificateInfo platformCertificateInfo;
485
if (!decoder->decode(platformCertificateInfo))
487
coder.m_root = WebCertificateInfo::create(platformCertificateInfo);
498
UserMessageDecoder(RefPtr<APIObject>& root)
503
RefPtr<APIObject>& m_root;
506
} // namespace WebKit
508
#endif // UserMessageCoders_h