Use a Variant for FormDataElement
[WebKit-https.git] / Source / WebKit / Shared / SessionState.h
1 /*
2  * Copyright (C) 2014-2018 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 #if PLATFORM(COCOA)
29 #include "ViewSnapshotStore.h"
30 #endif
31
32 #include <WebCore/BackForwardItemIdentifier.h>
33 #include <WebCore/FloatRect.h>
34 #include <WebCore/FrameLoaderTypes.h>
35 #include <WebCore/IntRect.h>
36 #include <WebCore/SerializedScriptValue.h>
37 #include <WebCore/URL.h>
38 #include <wtf/Optional.h>
39 #include <wtf/Vector.h>
40 #include <wtf/text/WTFString.h>
41
42 namespace IPC {
43 class Decoder;
44 class Encoder;
45 }
46
47 namespace WebKit {
48
49 bool isValidEnum(WebCore::ShouldOpenExternalURLsPolicy);
50
51 struct HTTPBody {
52     struct Element {
53         void encode(IPC::Encoder&) const;
54         static std::optional<Element> decode(IPC::Decoder&);
55
56         enum class Type {
57             Data,
58             File,
59             Blob,
60         };
61
62         // FIXME: This should be a Variant. It's also unclear why we don't just use FormDataElement here.
63         Type type = Type::Data;
64
65         // Data.
66         Vector<char> data;
67
68         // File.
69         String filePath;
70         int64_t fileStart;
71         std::optional<int64_t> fileLength;
72         std::optional<double> expectedFileModificationTime;
73
74         // Blob.
75         String blobURLString;
76     };
77
78     void encode(IPC::Encoder&) const;
79     static bool decode(IPC::Decoder&, HTTPBody&);
80
81     String contentType;
82     Vector<Element> elements;
83 };
84
85 struct FrameState {
86     void encode(IPC::Encoder&) const;
87     static std::optional<FrameState> decode(IPC::Decoder&);
88
89     String urlString;
90     String originalURLString;
91     String referrer;
92     String target;
93
94     Vector<String> documentState;
95     std::optional<Vector<uint8_t>> stateObjectData;
96
97     int64_t documentSequenceNumber { 0 };
98     int64_t itemSequenceNumber { 0 };
99
100     WebCore::IntPoint scrollPosition;
101     bool shouldRestoreScrollPosition { true };
102     float pageScaleFactor { 0 };
103
104     std::optional<HTTPBody> httpBody;
105
106     // FIXME: These should not be per frame.
107 #if PLATFORM(IOS)
108     WebCore::FloatRect exposedContentRect;
109     WebCore::IntRect unobscuredContentRect;
110     WebCore::FloatSize minimumLayoutSizeInScrollViewCoordinates;
111     WebCore::IntSize contentSize;
112     bool scaleIsInitial { false };
113 #endif
114
115     Vector<FrameState> children;
116 };
117
118 struct PageState {
119     void encode(IPC::Encoder&) const;
120     static bool decode(IPC::Decoder&, PageState&);
121
122     String title;
123     FrameState mainFrameState;
124     WebCore::ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy { WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow };
125     RefPtr<WebCore::SerializedScriptValue> sessionStateObject;
126 };
127
128 struct BackForwardListItemState {
129     void encode(IPC::Encoder&) const;
130     static std::optional<BackForwardListItemState> decode(IPC::Decoder&);
131
132     WebCore::BackForwardItemIdentifier identifier;
133
134     PageState pageState;
135 #if PLATFORM(COCOA)
136     RefPtr<ViewSnapshot> snapshot;
137 #endif
138 };
139
140 struct BackForwardListState {
141     void encode(IPC::Encoder&) const;
142     static std::optional<BackForwardListState> decode(IPC::Decoder&);
143
144     Vector<BackForwardListItemState> items;
145     std::optional<uint32_t> currentIndex;
146 };
147
148 struct SessionState {
149     BackForwardListState backForwardListState;
150     uint64_t renderTreeSize;
151     WebCore::URL provisionalURL;
152 };
153
154 } // namespace WebKit