2
* Copyright (C) 2017-2019 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
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.
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.
28
#if ENABLE(PREVIEW_CONVERTER)
30
#include "ResourceError.h"
31
#include "ResourceResponse.h"
32
#include <wtf/RefCounted.h>
33
#include <wtf/RetainPtr.h>
34
#include <wtf/WeakPtr.h>
35
#include <wtf/text/WTFString.h>
37
OBJC_CLASS QLPreviewConverter;
38
OBJC_CLASS WebPreviewConverterDelegate;
43
class ResourceRequest;
45
class SharedBufferDataView;
46
struct PreviewConverterClient;
47
struct PreviewConverterProvider;
49
struct PreviewPlatformDelegate : CanMakeWeakPtr<PreviewPlatformDelegate> {
50
virtual ~PreviewPlatformDelegate() = default;
52
virtual void delegateDidReceiveData(const SharedBuffer&) = 0;
53
virtual void delegateDidFinishLoading() = 0;
54
virtual void delegateDidFailWithError(const ResourceError&) = 0;
57
class PreviewConverter final : private PreviewPlatformDelegate, public RefCounted<PreviewConverter> {
58
WTF_MAKE_FAST_ALLOCATED;
59
WTF_MAKE_NONCOPYABLE(PreviewConverter);
61
static Ref<PreviewConverter> create(const ResourceResponse& response, PreviewConverterProvider& provider)
63
return adoptRef(*new PreviewConverter(response, provider));
66
WEBCORE_EXPORT static bool supportsMIMEType(const String& mimeType);
70
ResourceRequest safeRequest(const ResourceRequest&) const;
71
ResourceResponse previewResponse() const;
72
WEBCORE_EXPORT String previewFileName() const;
73
WEBCORE_EXPORT String previewUTI() const;
74
const ResourceError& previewError() const;
75
const SharedBuffer& previewData() const;
77
void failedUpdating();
78
void finishUpdating();
79
void updateMainResource();
81
bool hasClient(PreviewConverterClient&) const;
82
void addClient(PreviewConverterClient&);
83
void removeClient(PreviewConverterClient&);
85
WEBCORE_EXPORT static const String& passwordForTesting();
86
WEBCORE_EXPORT static void setPasswordForTesting(const String&);
89
static HashSet<String, ASCIICaseInsensitiveHash> platformSupportedMIMETypes();
91
PreviewConverter(const ResourceResponse&, PreviewConverterProvider&);
93
ResourceResponse platformPreviewResponse() const;
94
bool isPlatformPasswordError(const ResourceError&) const;
96
template<typename T> void iterateClients(T&& callback);
97
void appendFromBuffer(const SharedBuffer&);
98
void didAddClient(PreviewConverterClient&);
99
void didFailConvertingWithError(const ResourceError&);
100
void didFailUpdating();
101
void replayToClient(PreviewConverterClient&);
103
void platformAppend(const SharedBufferDataView&);
104
void platformFailedAppending();
105
void platformFinishedAppending();
106
void platformUnlockWithPassword(const String&);
108
// PreviewPlatformDelegate
109
void delegateDidReceiveData(const SharedBuffer&) final;
110
void delegateDidFinishLoading() final;
111
void delegateDidFailWithError(const ResourceError&) final;
113
enum class State : uint8_t {
121
Ref<SharedBuffer> m_previewData;
122
ResourceError m_previewError;
123
ResourceResponse m_originalResponse;
124
State m_state { State::Updating };
125
Vector<WeakPtr<PreviewConverterClient>, 1> m_clients;
126
WeakPtr<PreviewConverterProvider> m_provider;
127
bool m_isInClientCallback { false };
128
size_t m_lengthAppended { 0 };
131
RetainPtr<WebPreviewConverterDelegate> m_platformDelegate;
132
RetainPtr<QLPreviewConverter> m_platformConverter;
136
} // namespace WebCore
138
#endif // ENABLE(PREVIEW_CONVERTER)