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->encodeUInt32(APIObject::TypeNull);
77 type = m_root->type();
78 encoder->encodeUInt32(type);
81 case APIObject::TypeArray: {
82 ImmutableArray* array = static_cast<ImmutableArray*>(m_root);
83 encoder->encode(static_cast<uint64_t>(array->size()));
84 for (size_t i = 0; i < array->size(); ++i)
85 encoder->encode(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->encode(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) {
96 encoder->encode(it->first);
97 encoder->encode(Owner(it->second.get()));
101 case APIObject::TypeString: {
102 WebString* string = static_cast<WebString*>(m_root);
103 encoder->encode(string->string());
106 case APIObject::TypeSerializedScriptValue: {
107 WebSerializedScriptValue* scriptValue = static_cast<WebSerializedScriptValue*>(m_root);
108 encoder->encodeVariableLengthByteArray(scriptValue->dataReference());
111 case APIObject::TypeBoolean: {
112 WebBoolean* booleanObject = static_cast<WebBoolean*>(m_root);
113 encoder->encode(booleanObject->value());
116 case APIObject::TypeDouble: {
117 WebDouble* doubleObject = static_cast<WebDouble*>(m_root);
118 encoder->encode(doubleObject->value());
121 case APIObject::TypeUInt64: {
122 WebUInt64* uint64Object = static_cast<WebUInt64*>(m_root);
123 encoder->encode(uint64Object->value());
126 case APIObject::TypePoint: {
127 WebPoint* pointObject = static_cast<WebPoint*>(m_root);
128 encoder->encode(pointObject->point().x);
129 encoder->encode(pointObject->point().y);
132 case APIObject::TypeSize: {
133 WebSize* sizeObject = static_cast<WebSize*>(m_root);
134 encoder->encode(sizeObject->size().width);
135 encoder->encode(sizeObject->size().height);
138 case APIObject::TypeRect: {
139 WebRect* rectObject = static_cast<WebRect*>(m_root);
140 encoder->encode(rectObject->rect().origin.x);
141 encoder->encode(rectObject->rect().origin.y);
142 encoder->encode(rectObject->rect().size.width);
143 encoder->encode(rectObject->rect().size.height);
146 case APIObject::TypeRenderLayer: {
147 WebRenderLayer* renderLayer = static_cast<WebRenderLayer*>(m_root);
148 encoder->encode(Owner(renderLayer->renderer()));
149 encoder->encode(renderLayer->isReflection());
150 encoder->encode(renderLayer->isClipping());
151 encoder->encode(renderLayer->isClipped());
152 encoder->encode(static_cast<uint32_t>(renderLayer->compositingLayerType()));
153 encoder->encode(renderLayer->absoluteBoundingBox());
154 encoder->encode(Owner(renderLayer->negativeZOrderList()));
155 encoder->encode(Owner(renderLayer->normalFlowList()));
156 encoder->encode(Owner(renderLayer->positiveZOrderList()));
159 case APIObject::TypeRenderObject: {
160 WebRenderObject* renderObject = static_cast<WebRenderObject*>(m_root);
161 encoder->encode(renderObject->name());
162 encoder->encode(renderObject->elementTagName());
163 encoder->encode(renderObject->elementID());
164 encoder->encode(Owner(renderObject->elementClassNames()));
165 encoder->encode(renderObject->absolutePosition());
166 encoder->encode(renderObject->frameRect());
167 encoder->encode(Owner(renderObject->children().get()));
170 case APIObject::TypeURL: {
171 WebURL* urlObject = static_cast<WebURL*>(m_root);
172 encoder->encode(urlObject->string());
175 case APIObject::TypeURLRequest: {
176 WebURLRequest* urlRequestObject = static_cast<WebURLRequest*>(m_root);
177 encoder->encode(urlRequestObject->resourceRequest());
180 case APIObject::TypeUserContentURLPattern: {
181 WebUserContentURLPattern* urlPattern = static_cast<WebUserContentURLPattern*>(m_root);
182 encoder->encode(urlPattern->patternString());
185 case APIObject::TypeImage: {
186 WebImage* image = static_cast<WebImage*>(m_root);
188 ShareableBitmap::Handle handle;
189 if (!image->bitmap() || !image->bitmap()->isBackedBySharedMemory() || !image->bitmap()->createHandle(handle)) {
190 // Initial false indicates no allocated bitmap or is not shareable.
191 encoder->encode(false);
195 // Initial true indicates a bitmap was allocated and is shareable.
196 encoder->encode(true);
198 encoder->encode(handle);
201 case APIObject::TypeData: {
202 WebData* data = static_cast<WebData*>(m_root);
203 encoder->encodeVariableLengthByteArray(data->dataReference());
206 case APIObject::TypeCertificateInfo: {
207 WebCertificateInfo* certificateInfo = static_cast<WebCertificateInfo*>(m_root);
208 encoder->encode(certificateInfo->platformCertificateInfo());
219 UserMessageEncoder(APIObject* root)
231 // - Dictionary -> Dictionary
232 // - SerializedScriptValue -> SerializedScriptValue
233 // - String -> String
234 // - UserContentURLPattern -> UserContentURLPattern
235 // - WebCertificateInfo -> WebCertificateInfo
236 // - WebData -> WebData
237 // - WebDouble -> WebDouble
238 // - WebImage -> WebImage
239 // - WebUInt64 -> WebUInt64
240 // - WebURL -> WebURL
241 // - WebURLRequest -> WebURLRequest
243 template<typename Owner>
244 class UserMessageDecoder {
246 static bool baseDecode(CoreIPC::ArgumentDecoder* decoder, Owner& coder, APIObject::Type& type)
248 uint32_t typeAsUInt32;
249 if (!decoder->decode(typeAsUInt32))
252 type = static_cast<APIObject::Type>(typeAsUInt32);
255 case APIObject::TypeArray: {
257 if (!decoder->decode(size))
260 Vector<RefPtr<APIObject> > vector;
261 for (size_t i = 0; i < size; ++i) {
262 RefPtr<APIObject> element;
263 Owner messageCoder(coder, element);
264 if (!decoder->decode(messageCoder))
266 vector.append(element.release());
269 coder.m_root = ImmutableArray::adopt(vector);
272 case APIObject::TypeDictionary: {
274 if (!decoder->decode(size))
277 ImmutableDictionary::MapType map;
278 for (size_t i = 0; i < size; ++i) {
280 if (!decoder->decode(key))
283 RefPtr<APIObject> element;
284 Owner messageCoder(coder, element);
285 if (!decoder->decode(messageCoder))
288 ImmutableDictionary::MapType::AddResult result = map.set(key, element.release());
289 if (!result.isNewEntry)
293 coder.m_root = ImmutableDictionary::adopt(map);
296 case APIObject::TypeString: {
298 if (!decoder->decode(string))
300 coder.m_root = WebString::create(string);
303 case APIObject::TypeSerializedScriptValue: {
304 CoreIPC::DataReference dataReference;
305 if (!decoder->decodeVariableLengthByteArray(dataReference))
308 Vector<uint8_t> vector = dataReference.vector();
309 coder.m_root = WebSerializedScriptValue::adopt(vector);
312 case APIObject::TypeDouble: {
314 if (!decoder->decode(value))
316 coder.m_root = WebDouble::create(value);
319 case APIObject::TypeUInt64: {
321 if (!decoder->decode(value))
323 coder.m_root = WebUInt64::create(value);
326 case APIObject::TypeBoolean: {
328 if (!decoder->decode(value))
330 coder.m_root = WebBoolean::create(value);
333 case APIObject::TypeSize: {
336 if (!decoder->decode(width))
338 if (!decoder->decode(height))
340 coder.m_root = WebSize::create(WKSizeMake(width, height));
343 case APIObject::TypePoint: {
346 if (!decoder->decode(x))
348 if (!decoder->decode(y))
350 coder.m_root = WebPoint::create(WKPointMake(x, y));
353 case APIObject::TypeRect: {
358 if (!decoder->decode(x))
360 if (!decoder->decode(y))
362 if (!decoder->decode(width))
364 if (!decoder->decode(height))
366 coder.m_root = WebRect::create(WKRectMake(x, y, width, height));
369 case APIObject::TypeRenderLayer: {
370 RefPtr<APIObject> renderer;
374 uint32_t compositingLayerTypeAsUInt32;
375 WebCore::IntRect absoluteBoundingBox;
376 RefPtr<APIObject> negativeZOrderList;
377 RefPtr<APIObject> normalFlowList;
378 RefPtr<APIObject> positiveZOrderList;
380 Owner rendererCoder(coder, renderer);
381 if (!decoder->decode(rendererCoder))
383 if (renderer->type() != APIObject::TypeRenderObject)
385 if (!decoder->decodeBool(isReflection))
387 if (!decoder->decodeBool(isClipping))
389 if (!decoder->decodeBool(isClipped))
391 if (!decoder->decodeUInt32(compositingLayerTypeAsUInt32))
393 if (!decoder->decode(absoluteBoundingBox))
395 Owner negativeZOrderListCoder(coder, negativeZOrderList);
396 if (!decoder->decode(negativeZOrderListCoder))
398 Owner normalFlowListCoder(coder, normalFlowList);
399 if (!decoder->decode(normalFlowListCoder))
401 Owner positiveZOrderListCoder(coder, positiveZOrderList);
402 if (!decoder->decode(positiveZOrderListCoder))
404 coder.m_root = WebRenderLayer::create(static_pointer_cast<WebRenderObject>(renderer), isReflection, isClipping, isClipped, static_cast<WebRenderLayer::CompositingLayerType>(compositingLayerTypeAsUInt32),
405 absoluteBoundingBox, static_pointer_cast<MutableArray>(negativeZOrderList), static_pointer_cast<MutableArray>(normalFlowList),
406 static_pointer_cast<MutableArray>(positiveZOrderList));
409 case APIObject::TypeRenderObject: {
411 String elementTagName;
413 RefPtr<APIObject> elementClassNames;
414 WebCore::IntPoint absolutePosition;
415 WebCore::IntRect frameRect;
416 RefPtr<APIObject> children;
418 if (!decoder->decode(name))
420 if (!decoder->decode(elementTagName))
422 if (!decoder->decode(elementID))
424 Owner classNamesCoder(coder, elementClassNames);
425 if (!decoder->decode(classNamesCoder))
427 if (!decoder->decode(absolutePosition))
429 if (!decoder->decode(frameRect))
431 Owner messageCoder(coder, children);
432 if (!decoder->decode(messageCoder))
434 if (children && children->type() != APIObject::TypeArray)
436 coder.m_root = WebRenderObject::create(name, elementTagName, elementID, WTF::static_pointer_cast<MutableArray>(elementClassNames), absolutePosition, frameRect, WTF::static_pointer_cast<MutableArray>(children));
439 case APIObject::TypeURL: {
441 if (!decoder->decode(string))
443 coder.m_root = WebURL::create(string);
446 case APIObject::TypeURLRequest: {
447 WebCore::ResourceRequest request;
448 if (!decoder->decode(request))
450 coder.m_root = WebURLRequest::create(request);
453 case APIObject::TypeUserContentURLPattern: {
455 if (!decoder->decode(string))
457 coder.m_root = WebUserContentURLPattern::create(string);
460 case APIObject::TypeImage: {
461 bool didEncode = false;
462 if (!decoder->decode(didEncode))
468 ShareableBitmap::Handle handle;
469 if (!decoder->decode(handle))
472 coder.m_root = WebImage::create(ShareableBitmap::create(handle));
475 case APIObject::TypeData: {
476 CoreIPC::DataReference dataReference;
477 if (!decoder->decodeVariableLengthByteArray(dataReference))
479 coder.m_root = WebData::create(dataReference.data(), dataReference.size());
482 case APIObject::TypeCertificateInfo: {
483 PlatformCertificateInfo platformCertificateInfo;
484 if (!decoder->decode(platformCertificateInfo))
486 coder.m_root = WebCertificateInfo::create(platformCertificateInfo);
497 UserMessageDecoder(RefPtr<APIObject>& root)
502 RefPtr<APIObject>& m_root;
505 } // namespace WebKit
507 #endif // UserMessageCoders_h