e65448e23800e1162bf11447efbc14a681621cc1
[WebKit-https.git] / Source / WebCore / bindings / js / JSDOMConvertStrings.h
1 /*
2  * Copyright (C) 2016 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 #pragma once
27
28 #include "IDLTypes.h"
29 #include "JSDOMConvertBase.h"
30 #include "JSDOMExceptionHandling.h"
31
32 namespace WebCore {
33
34 WEBCORE_EXPORT String identifierToByteString(JSC::ExecState&, const JSC::Identifier&);
35 WEBCORE_EXPORT String valueToByteString(JSC::ExecState&, JSC::JSValue);
36 WEBCORE_EXPORT String identifierToUSVString(JSC::ExecState&, const JSC::Identifier&);
37 WEBCORE_EXPORT String valueToUSVString(JSC::ExecState&, JSC::JSValue);
38
39 inline String propertyNameToString(JSC::PropertyName propertyName)
40 {
41     ASSERT(!propertyName.isSymbol());
42     return propertyName.uid() ? propertyName.uid() : propertyName.publicName();
43 }
44
45 inline AtomicString propertyNameToAtomicString(JSC::PropertyName propertyName)
46 {
47     return AtomicString(propertyName.uid() ? propertyName.uid() : propertyName.publicName());
48 }
49
50 // MARK: -
51 // MARK: String types
52
53 template<> struct Converter<IDLDOMString> : DefaultConverter<IDLDOMString> {
54     static String convert(JSC::ExecState& state, JSC::JSValue value)
55     {
56         return value.toWTFString(&state);
57     }
58 };
59
60 template<> struct JSConverter<IDLDOMString> {
61     static constexpr bool needsState = true;
62     static constexpr bool needsGlobalObject = false;
63
64     static JSC::JSValue convert(JSC::ExecState& state, const String& value)
65     {
66         return JSC::jsStringWithCache(&state, value);
67     }
68 };
69
70 template<> struct Converter<IDLByteString> : DefaultConverter<IDLByteString> {
71     static String convert(JSC::ExecState& state, JSC::JSValue value)
72     {
73         return valueToByteString(state, value);
74     }
75 };
76
77 template<> struct JSConverter<IDLByteString> {
78     static constexpr bool needsState = true;
79     static constexpr bool needsGlobalObject = false;
80
81     static JSC::JSValue convert(JSC::ExecState& state, const String& value)
82     {
83         return JSC::jsStringWithCache(&state, value);
84     }
85 };
86
87 template<> struct Converter<IDLUSVString> : DefaultConverter<IDLUSVString> {
88     static String convert(JSC::ExecState& state, JSC::JSValue value)
89     {
90         return valueToUSVString(state, value);
91     }
92 };
93
94 template<> struct JSConverter<IDLUSVString> {
95     static constexpr bool needsState = true;
96     static constexpr bool needsGlobalObject = false;
97
98     static JSC::JSValue convert(JSC::ExecState& state, const String& value)
99     {
100         return JSC::jsStringWithCache(&state, value);
101     }
102 };
103
104 // MARK: -
105 // MARK: String type adaptors
106
107 template<typename T> struct Converter<IDLTreatNullAsEmptyAdaptor<T>> : DefaultConverter<IDLTreatNullAsEmptyAdaptor<T>> {
108     static String convert(JSC::ExecState& state, JSC::JSValue value)
109     {
110         if (value.isNull())
111             return emptyString();
112         return Converter<T>::convert(state, value);
113     }
114 };
115
116 template<typename T>  struct JSConverter<IDLTreatNullAsEmptyAdaptor<T>> {
117     static constexpr bool needsState = true;
118     static constexpr bool needsGlobalObject = false;
119
120     static JSC::JSValue convert(JSC::ExecState& state, const String& value)
121     {
122         return JSConverter<T>::convert(state, value);
123     }
124 };
125
126 template<typename T> struct Converter<IDLAtomicStringAdaptor<T>> : DefaultConverter<IDLAtomicStringAdaptor<T>> {
127     static AtomicString convert(JSC::ExecState& state, JSC::JSValue value)
128     {
129         static_assert(std::is_same<T, IDLDOMString>::value, "This adaptor is only supported for IDLDOMString at the moment.");
130
131         return value.toString(&state)->toAtomicString(&state);
132     }
133 };
134
135 template<typename T>  struct JSConverter<IDLAtomicStringAdaptor<T>> {
136     static constexpr bool needsState = true;
137     static constexpr bool needsGlobalObject = false;
138
139     static JSC::JSValue convert(JSC::ExecState& state, const AtomicString& value)
140     {
141         static_assert(std::is_same<T, IDLDOMString>::value, "This adaptor is only supported for IDLDOMString at the moment.");
142
143         return JSConverter<T>::convert(state, value);
144     }
145 };
146
147 template<typename T> struct Converter<IDLRequiresExistingAtomicStringAdaptor<T>> : DefaultConverter<IDLRequiresExistingAtomicStringAdaptor<T>> {
148     static AtomicString convert(JSC::ExecState& state, JSC::JSValue value)
149     {
150         static_assert(std::is_same<T, IDLDOMString>::value, "This adaptor is only supported for IDLDOMString at the moment.");
151     
152         return AtomicString(value.toString(&state)->toExistingAtomicString(&state));
153     }
154 };
155
156 template<typename T>  struct JSConverter<IDLRequiresExistingAtomicStringAdaptor<T>> {
157     static constexpr bool needsState = true;
158     static constexpr bool needsGlobalObject = false;
159
160     static JSC::JSValue convert(JSC::ExecState& state, const AtomicString& value)
161     {
162         static_assert(std::is_same<T, IDLDOMString>::value, "This adaptor is only supported for IDLDOMString at the moment.");
163
164         return JSConverter<T>::convert(state, value);
165     }
166 };
167
168
169 } // namespace WebCore