28968edca6ca929ae1dbec3061c2e4c5943240e9
[WebKit-https.git] / Source / WebKit / Shared / LoadParameters.cpp
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 #include "config.h"
27 #include "LoadParameters.h"
28
29 #include "FormDataReference.h"
30 #include "WebCoreArgumentCoders.h"
31
32 namespace WebKit {
33
34 void LoadParameters::encode(IPC::Encoder& encoder) const
35 {
36     encoder << navigationID;
37     encoder << request;
38
39     encoder << static_cast<bool>(request.httpBody());
40     if (request.httpBody()) {
41         // FormDataReference encoder / decoder takes care of passing and consuming the needed sandbox extensions.
42         encoder << IPC::FormDataReference { request.httpBody() };
43     }
44
45     encoder << sandboxExtensionHandle;
46     encoder << data;
47     encoder << MIMEType;
48     encoder << encodingName;
49     encoder << baseURLString;
50     encoder << unreachableURLString;
51     encoder << provisionalLoadErrorURLString;
52     encoder << websitePolicies;
53     encoder << shouldOpenExternalURLsPolicy;
54     encoder << shouldTreatAsContinuingLoad;
55     encoder << userData;
56     encoder.encodeEnum(lockHistory);
57     encoder.encodeEnum(lockBackForwardList);
58     encoder << clientRedirectSourceForHistory;
59     encoder << isNavigatingToAppBoundDomain;
60
61     platformEncode(encoder);
62 }
63
64 bool LoadParameters::decode(IPC::Decoder& decoder, LoadParameters& data)
65 {
66     if (!decoder.decode(data.navigationID))
67         return false;
68
69     if (!decoder.decode(data.request))
70         return false;
71
72     bool hasHTTPBody;
73     if (!decoder.decode(hasHTTPBody))
74         return false;
75
76     if (hasHTTPBody) {
77         // FormDataReference encoder / decoder takes care of passing and consuming the needed sandbox extensions.
78         Optional<IPC::FormDataReference> formDataReference;
79         decoder >> formDataReference;
80         if (!formDataReference)
81             return false;
82
83         data.request.setHTTPBody(formDataReference->takeData());
84     }
85
86     Optional<SandboxExtension::Handle> sandboxExtensionHandle;
87     decoder >> sandboxExtensionHandle;
88     if (!sandboxExtensionHandle)
89         return false;
90     data.sandboxExtensionHandle = WTFMove(*sandboxExtensionHandle);
91
92     if (!decoder.decode(data.data))
93         return false;
94
95     if (!decoder.decode(data.MIMEType))
96         return false;
97
98     if (!decoder.decode(data.encodingName))
99         return false;
100
101     if (!decoder.decode(data.baseURLString))
102         return false;
103
104     if (!decoder.decode(data.unreachableURLString))
105         return false;
106
107     if (!decoder.decode(data.provisionalLoadErrorURLString))
108         return false;
109
110     Optional<Optional<WebsitePoliciesData>> websitePolicies;
111     decoder >> websitePolicies;
112     if (!websitePolicies)
113         return false;
114     data.websitePolicies = WTFMove(*websitePolicies);
115
116     if (!decoder.decode(data.shouldOpenExternalURLsPolicy))
117         return false;
118
119     if (!decoder.decode(data.shouldTreatAsContinuingLoad))
120         return false;
121
122     if (!decoder.decode(data.userData))
123         return false;
124
125     if (!decoder.decodeEnum(data.lockHistory))
126         return false;
127
128     if (!decoder.decodeEnum(data.lockBackForwardList))
129         return false;
130
131     Optional<String> clientRedirectSourceForHistory;
132     decoder >> clientRedirectSourceForHistory;
133     if (!clientRedirectSourceForHistory)
134         return false;
135     data.clientRedirectSourceForHistory = WTFMove(*clientRedirectSourceForHistory);
136     
137     if (!decoder.decode(data.isNavigatingToAppBoundDomain))
138         return false;
139     
140     if (!platformDecode(decoder, data))
141         return false;
142
143     return true;
144 }
145
146 #if !PLATFORM(COCOA)
147
148 void LoadParameters::platformEncode(IPC::Encoder&) const
149 {
150 }
151
152 bool LoadParameters::platformDecode(IPC::Decoder&, LoadParameters&)
153 {
154     return true;
155 }
156
157 #endif // !PLATFORM(COCOA)
158
159
160 } // namespace WebKit