Add globally-unique HistoryItem identifiers (and have WebKit2 adopt them).
[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         Type type = Type::Data;
63
64         // Data.
65         Vector<char> data;
66
67         // File.
68         String filePath;
69         int64_t fileStart;
70         std::optional<int64_t> fileLength;
71         std::optional<double> expectedFileModificationTime;
72
73         // Blob.
74         String blobURLString;
75     };
76
77     void encode(IPC::Encoder&) const;
78     static bool decode(IPC::Decoder&, HTTPBody&);
79
80     String contentType;
81     Vector<Element> elements;
82 };
83
84 struct FrameState {
85     void encode(IPC::Encoder&) const;
86     static std::optional<FrameState> decode(IPC::Decoder&);
87
88     String urlString;
89     String originalURLString;
90     String referrer;
91     String target;
92
93     Vector<String> documentState;
94     std::optional<Vector<uint8_t>> stateObjectData;
95
96     int64_t documentSequenceNumber { 0 };
97     int64_t itemSequenceNumber { 0 };
98
99     WebCore::IntPoint scrollPosition;
100     bool shouldRestoreScrollPosition { true };
101     float pageScaleFactor { 0 };
102
103     std::optional<HTTPBody> httpBody;
104
105     // FIXME: These should not be per frame.
106 #if PLATFORM(IOS)
107     WebCore::FloatRect exposedContentRect;
108     WebCore::IntRect unobscuredContentRect;
109     WebCore::FloatSize minimumLayoutSizeInScrollViewCoordinates;
110     WebCore::IntSize contentSize;
111     bool scaleIsInitial { false };
112 #endif
113
114     Vector<FrameState> children;
115 };
116
117 struct PageState {
118     void encode(IPC::Encoder&) const;
119     static bool decode(IPC::Decoder&, PageState&);
120
121     String title;
122     FrameState mainFrameState;
123     WebCore::ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy { WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow };
124     RefPtr<WebCore::SerializedScriptValue> sessionStateObject;
125 };
126
127 struct BackForwardListItemState {
128     void encode(IPC::Encoder&) const;
129     static std::optional<BackForwardListItemState> decode(IPC::Decoder&);
130
131     WebCore::BackForwardItemIdentifier identifier;
132
133     PageState pageState;
134 #if PLATFORM(COCOA)
135     RefPtr<ViewSnapshot> snapshot;
136 #endif
137 };
138
139 struct BackForwardListState {
140     void encode(IPC::Encoder&) const;
141     static std::optional<BackForwardListState> decode(IPC::Decoder&);
142
143     Vector<BackForwardListItemState> items;
144     std::optional<uint32_t> currentIndex;
145 };
146
147 struct SessionState {
148     BackForwardListState backForwardListState;
149     uint64_t renderTreeSize;
150     WebCore::URL provisionalURL;
151 };
152
153 } // namespace WebKit