Merge "Fixed paste issue after selecting word in inputbox" into tizen_2.1
[framework/web/webkit-efl.git] / Source / WebKit2 / WebProcess / WebPage / DecoderAdapter.cpp
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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.
24  */
25
26 #include "config.h"
27 #include "DecoderAdapter.h"
28
29 #include "DataReference.h"
30 #include "WebCoreArgumentCoders.h"
31 #include <wtf/text/WTFString.h>
32
33 namespace WebKit {
34
35 DecoderAdapter::DecoderAdapter(const uint8_t* buffer, size_t bufferSize)
36     : m_decoder(buffer, bufferSize)
37 {
38 }
39
40 bool DecoderAdapter::decodeBytes(Vector<uint8_t>& bytes)
41 {
42     CoreIPC::DataReference dataReference;
43     if (!m_decoder.decodeVariableLengthByteArray(dataReference))
44         return false;
45
46     bytes = dataReference.vector();
47     return true;
48 }
49
50 bool DecoderAdapter::decodeBool(bool& value)
51 {
52     return m_decoder.decodeBool(value);
53 }
54
55 bool DecoderAdapter::decodeUInt16(uint16_t& value)
56 {
57     return m_decoder.decodeUInt16(value);
58 }
59
60 bool DecoderAdapter::decodeUInt32(uint32_t& value)
61 {
62     return m_decoder.decodeUInt32(value);
63 }
64
65 bool DecoderAdapter::decodeUInt64(uint64_t& value)
66 {
67     return m_decoder.decodeUInt64(value);
68 }
69
70 bool DecoderAdapter::decodeInt32(int32_t& value)
71 {
72     return m_decoder.decodeInt32(value);
73 }
74
75 bool DecoderAdapter::decodeInt64(int64_t& value)
76 {
77     return m_decoder.decodeInt64(value);
78 }
79
80 bool DecoderAdapter::decodeFloat(float& value)
81 {
82     return m_decoder.decodeFloat(value);
83 }
84
85 bool DecoderAdapter::decodeDouble(double& value)
86 {
87     return m_decoder.decodeDouble(value);
88 }
89
90 bool DecoderAdapter::decodeString(String& value)
91 {
92     // This mimics the CoreIPC binary encoding of Strings prior to r88886.
93     // Whenever the CoreIPC binary encoding changes, we'll have to "undo" the changes here.
94     // FIXME: We shouldn't use the CoreIPC binary encoding format for history,
95     // and we should come up with a migration strategy so we can actually bump the version number
96     // without breaking encoding/decoding of the history tree.
97
98     uint32_t length;
99     if (!m_decoder.decode(length))
100         return false;
101
102     if (length == std::numeric_limits<uint32_t>::max()) {
103         // This is the null string.
104         value = String();
105         return true;
106     }
107
108     uint64_t lengthInBytes;
109     if (!m_decoder.decode(lengthInBytes))
110         return false;
111
112     if (lengthInBytes % sizeof(UChar) || lengthInBytes / sizeof(UChar) != length) {
113         m_decoder.markInvalid();
114         return false;
115     }
116
117     if (!m_decoder.bufferIsLargeEnoughToContain<UChar>(length)) {
118         m_decoder.markInvalid();
119         return false;
120     }
121
122     UChar* buffer;
123     String string = String::createUninitialized(length, buffer);
124     if (!m_decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(UChar), __alignof(UChar)))
125         return false;
126
127     value = string;
128     return true;
129 }
130
131 }