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