165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef UserMessageCoders_h 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define UserMessageCoders_h 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentDecoder.h" 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentEncoder.h" 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ImmutableArray.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ImmutableDictionary.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ShareableBitmap.h" 342bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebCertificateInfo.h" 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebCoreArgumentCoders.h" 362bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "WebData.h" 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebImage.h" 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebNumber.h" 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebSerializedScriptValue.h" 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebString.h" 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebURL.h" 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebUserContentURLPattern.h" 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - Null -> Null 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - Array -> Array 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - Dictionary -> Dictionary 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - SerializedScriptValue -> SerializedScriptValue 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - String -> String 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - UserContentURLPattern -> UserContentURLPattern 522bde8e466a4451c7319e3a072d118917957d6554Steve Block// - WebCertificateInfo -> WebCertificateInfo 532bde8e466a4451c7319e3a072d118917957d6554Steve Block// - WebData -> WebData 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebDouble -> WebDouble 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebImage -> WebImage 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebUInt64 -> WebUInt64 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebURL -> WebURL 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename Owner> 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass UserMessageEncoder { 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool baseEncode(CoreIPC::ArgumentEncoder* encoder, APIObject::Type& type) const 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!m_root) { 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeUInt32(APIObject::TypeNull); 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch type = m_root->type(); 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeUInt32(type); 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (type) { 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeArray: { 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ImmutableArray* array = static_cast<ImmutableArray*>(m_root); 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(static_cast<uint64_t>(array->size())); 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < array->size(); ++i) 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(Owner(array->at(i))); 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeDictionary: { 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ImmutableDictionary* dictionary = static_cast<ImmutableDictionary*>(m_root); 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const ImmutableDictionary::MapType& map = dictionary->map(); 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(static_cast<uint64_t>(map.size())); 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ImmutableDictionary::MapType::const_iterator it = map.begin(); 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ImmutableDictionary::MapType::const_iterator end = map.end(); 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (; it != end; ++it) { 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(it->first); 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(Owner(it->second.get())); 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeString: { 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebString* string = static_cast<WebString*>(m_root); 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(string->string()); 9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeSerializedScriptValue: { 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebSerializedScriptValue* scriptValue = static_cast<WebSerializedScriptValue*>(m_root); 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encodeBytes(scriptValue->data().data(), scriptValue->data().size()); 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeDouble: { 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebDouble* doubleObject = static_cast<WebDouble*>(m_root); 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(doubleObject->value()); 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeUInt64: { 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebUInt64* uint64Object = static_cast<WebUInt64*>(m_root); 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(uint64Object->value()); 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeBoolean: { 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebBoolean* booleanObject = static_cast<WebBoolean*>(m_root); 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(booleanObject->value()); 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeURL: { 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebURL* urlObject = static_cast<WebURL*>(m_root); 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(urlObject->string()); 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeUserContentURLPattern: { 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebUserContentURLPattern* urlPattern = static_cast<WebUserContentURLPattern*>(m_root); 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(urlPattern->patternString()); 12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeImage: { 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WebImage* image = static_cast<WebImage*>(m_root); 13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!image->bitmap()->isBackedBySharedMemory()) { 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(false); 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1352bde8e466a4451c7319e3a072d118917957d6554Steve Block ShareableBitmap::Handle handle; 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!image->bitmap()->createHandle(handle)) 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(true); 14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch encoder->encode(handle); 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 1442bde8e466a4451c7319e3a072d118917957d6554Steve Block case APIObject::TypeData: { 1452bde8e466a4451c7319e3a072d118917957d6554Steve Block WebData* data = static_cast<WebData*>(m_root); 1462bde8e466a4451c7319e3a072d118917957d6554Steve Block encoder->encodeBytes(data->bytes(), data->size()); 1472bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 1482bde8e466a4451c7319e3a072d118917957d6554Steve Block } 1492bde8e466a4451c7319e3a072d118917957d6554Steve Block case APIObject::TypeCertificateInfo: { 1502bde8e466a4451c7319e3a072d118917957d6554Steve Block WebCertificateInfo* certificateInfo = static_cast<WebCertificateInfo*>(m_root); 1512bde8e466a4451c7319e3a072d118917957d6554Steve Block encoder->encode(certificateInfo->platformCertificateInfo()); 1522bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 1532bde8e466a4451c7319e3a072d118917957d6554Steve Block } 15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch default: 15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprotected: 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch UserMessageEncoder(APIObject* root) 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_root(root) 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch APIObject* m_root; 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// Handles 17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - Null -> Null 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - Array -> Array 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - Dictionary -> Dictionary 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - SerializedScriptValue -> SerializedScriptValue 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - String -> String 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - UserContentURLPattern -> UserContentURLPattern 1782bde8e466a4451c7319e3a072d118917957d6554Steve Block// - WebCertificateInfo -> WebCertificateInfo 1792bde8e466a4451c7319e3a072d118917957d6554Steve Block// - WebData -> WebData 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebDouble -> WebDouble 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebImage -> WebImage 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebUInt64 -> WebUInt64 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// - WebURL -> WebURL 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename Owner> 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass UserMessageDecoder { 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static bool baseDecode(CoreIPC::ArgumentDecoder* decoder, Owner& coder, APIObject::Type& type) 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint32_t typeAsUInt32; 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(typeAsUInt32)) 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch type = static_cast<APIObject::Type>(typeAsUInt32); 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (type) { 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeArray: { 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t size; 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(size)) 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<RefPtr<APIObject> > vector; 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < size; ++i) { 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<APIObject> element; 20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Owner messageCoder(coder, element); 20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(messageCoder)) 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch vector.append(element.release()); 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = ImmutableArray::adopt(vector); 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeDictionary: { 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t size; 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(size)) 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ImmutableDictionary::MapType map; 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (size_t i = 0; i < size; ++i) { 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String key; 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(key)) 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<APIObject> element; 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Owner messageCoder(coder, element); 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(messageCoder)) 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch std::pair<ImmutableDictionary::MapType::iterator, bool> result = map.set(key, element.release()); 23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!result.second) 23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = ImmutableDictionary::adopt(map); 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeString: { 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String string; 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(string)) 24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebString::create(string); 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeSerializedScriptValue: { 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<uint8_t> buffer; 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decodeBytes(buffer)) 24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebSerializedScriptValue::adopt(buffer); 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeDouble: { 25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch double value; 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(value)) 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebDouble::create(value); 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeUInt64: { 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t value; 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(value)) 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebUInt64::create(value); 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeBoolean: { 26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool value; 26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(value)) 26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebBoolean::create(value); 27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeURL: { 27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String string; 27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(string)) 27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebURL::create(string); 27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeUserContentURLPattern: { 28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch String string; 28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(string)) 28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch coder.m_root = WebUserContentURLPattern::create(string); 28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case APIObject::TypeImage: { 28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool didEncode = false; 28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(didEncode)) 29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!didEncode) 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2952bde8e466a4451c7319e3a072d118917957d6554Steve Block ShareableBitmap::Handle handle; 29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!decoder->decode(handle)) 29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2992bde8e466a4451c7319e3a072d118917957d6554Steve Block coder.m_root = WebImage::create(ShareableBitmap::create(handle)); 30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 3022bde8e466a4451c7319e3a072d118917957d6554Steve Block case APIObject::TypeData: { 3032bde8e466a4451c7319e3a072d118917957d6554Steve Block Vector<uint8_t> buffer; 3042bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!decoder->decodeBytes(buffer)) 3052bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 3062bde8e466a4451c7319e3a072d118917957d6554Steve Block coder.m_root = WebData::create(buffer); 3072bde8e466a4451c7319e3a072d118917957d6554Steve Block break; 3082bde8e466a4451c7319e3a072d118917957d6554Steve Block } 3092bde8e466a4451c7319e3a072d118917957d6554Steve Block case APIObject::TypeCertificateInfo: { 3102bde8e466a4451c7319e3a072d118917957d6554Steve Block PlatformCertificateInfo platformCertificateInfo; 3112bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!decoder->decode(platformCertificateInfo)) 3122bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 3132bde8e466a4451c7319e3a072d118917957d6554Steve Block coder.m_root = WebCertificateInfo::create(platformCertificateInfo); 3142bde8e466a4451c7319e3a072d118917957d6554Steve Block break; 3152bde8e466a4451c7319e3a072d118917957d6554Steve Block } 31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch default: 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return true; 32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprotected: 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch UserMessageDecoder(RefPtr<APIObject>& root) 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_root(root) 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RefPtr<APIObject>& m_root; 33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // UserMessageCoders_h 335