Modernize NavigationAction code
[WebKit-https.git] / Source / WebKit / UIProcess / Cocoa / UIDelegate.h
1 /*
2  * Copyright (C) 2014 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 #import "WKFoundation.h"
29
30 #if WK_API_ENABLED
31
32 #import "APIContextMenuClient.h"
33 #import "APIUIClient.h"
34 #import "WeakObjCPtr.h"
35 #import <wtf/RetainPtr.h>
36
37 @class _WKActivatedElementInfo;
38 @class WKWebView;
39 @protocol WKUIDelegate;
40
41 namespace API {
42 class FrameInfo;
43 }
44
45 namespace WebKit {
46
47 class UIDelegate {
48 public:
49     explicit UIDelegate(WKWebView *);
50     ~UIDelegate();
51
52 #if ENABLE(CONTEXT_MENUS)
53     std::unique_ptr<API::ContextMenuClient> createContextMenuClient();
54 #endif
55     std::unique_ptr<API::UIClient> createUIClient();
56
57     RetainPtr<id <WKUIDelegate> > delegate();
58     void setDelegate(id <WKUIDelegate>);
59
60 private:
61 #if ENABLE(CONTEXT_MENUS)
62     class ContextMenuClient : public API::ContextMenuClient {
63     public:
64         explicit ContextMenuClient(UIDelegate&);
65         ~ContextMenuClient();
66
67     private:
68         // API::ContextMenuClient
69         RetainPtr<NSMenu> menuFromProposedMenu(WebKit::WebPageProxy&, NSMenu *, const WebKit::WebHitTestResultData&, API::Object*) override;
70
71         UIDelegate& m_uiDelegate;
72     };
73 #endif
74
75     class UIClient : public API::UIClient {
76     public:
77         explicit UIClient(UIDelegate&);
78         ~UIClient();
79
80     private:
81         // API::UIClient
82         RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&) override;
83         void createNewPageAsync(WebKit::WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&, WTF::Function<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler) final;
84         bool canCreateNewPageAsync() final;
85         RefPtr<WebKit::WebPageProxy> createNewPageCommon(WebKit::WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&, WTF::Function<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler);
86
87         void close(WebKit::WebPageProxy*) override;
88         void fullscreenMayReturnToInline(WebKit::WebPageProxy*) override;
89         void didEnterFullscreen(WebKit::WebPageProxy*) override;
90         void didExitFullscreen(WebKit::WebPageProxy*) override;
91         void runJavaScriptAlert(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void ()>&& completionHandler) override;
92         void runJavaScriptConfirm(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (bool)>&& completionHandler) override;
93         void runJavaScriptPrompt(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (const WTF::String&)>&& completionHandler) override;
94         bool canRunBeforeUnloadConfirmPanel() const final;
95         void runBeforeUnloadConfirmPanel(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, const WebCore::SecurityOriginData&, Function<void (bool)>&& completionHandler) final;
96         void exceededDatabaseQuota(WebPageProxy*, WebFrameProxy*, API::SecurityOrigin*, const WTF::String& databaseName, const WTF::String& displayName, unsigned long long currentQuota, unsigned long long currentOriginUsage, unsigned long long currentUsage, unsigned long long expectedUsage, Function<void (unsigned long long)>&& completionHandler) override;
97         void reachedApplicationCacheOriginQuota(WebPageProxy*, const WebCore::SecurityOrigin&, uint64_t currentQuota, uint64_t totalBytesNeeded, Function<void (unsigned long long)>&& completionHandler) override;
98 #if PLATFORM(MAC)
99         bool runOpenPanel(WebPageProxy*, WebFrameProxy*, const WebCore::SecurityOriginData&, API::OpenPanelParameters*, WebOpenPanelResultListenerProxy*) override;
100 #endif
101         bool decidePolicyForUserMediaPermissionRequest(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, WebKit::UserMediaPermissionRequestProxy&) override;
102         bool checkUserMediaPermissionForOrigin(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, API::SecurityOrigin&, API::SecurityOrigin&, WebKit::UserMediaPermissionCheckProxy&) override;
103         void mediaCaptureStateDidChange(WebCore::MediaProducer::MediaStateFlags) override;
104         void printFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*) override;
105 #if PLATFORM(IOS)
106 #if HAVE(APP_LINKS)
107         bool shouldIncludeAppLinkActionsForElement(_WKActivatedElementInfo *) override;
108 #endif
109         RetainPtr<NSArray> actionsForElement(_WKActivatedElementInfo *, RetainPtr<NSArray> defaultActions) override;
110         void didNotHandleTapAsClick(const WebCore::IntPoint&) override;
111         UIViewController *presentingViewController() override;
112 #endif // PLATFORM(IOS)
113
114         NSDictionary *dataDetectionContext() override;
115
116 #if ENABLE(POINTER_LOCK)
117         void requestPointerLock(WebKit::WebPageProxy*) override;
118         void didLosePointerLock(WebKit::WebPageProxy*) override;
119 #endif
120         
121         void hasVideoInPictureInPictureDidChange(WebKit::WebPageProxy*, bool) override;
122
123         void imageOrMediaDocumentSizeChanged(const WebCore::IntSize&) override;
124
125         UIDelegate& m_uiDelegate;
126     };
127
128     WKWebView *m_webView;
129     WeakObjCPtr<id <WKUIDelegate> > m_delegate;
130
131     struct {
132         bool webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures : 1;
133         bool webViewCreateWebViewWithConfigurationForNavigationActionWindowFeaturesAsync : 1;
134         bool webViewRunJavaScriptAlertPanelWithMessageInitiatedByFrameCompletionHandler : 1;
135         bool webViewRunJavaScriptConfirmPanelWithMessageInitiatedByFrameCompletionHandler : 1;
136         bool webViewRunJavaScriptTextInputPanelWithPromptDefaultTextInitiatedByFrameCompletionHandler : 1;
137         bool webViewRunBeforeUnloadConfirmPanelWithMessageInitiatedByFrameCompletionHandler : 1;
138 #if PLATFORM(MAC)
139         bool webViewRunOpenPanelWithParametersInitiatedByFrameCompletionHandler : 1;
140 #endif
141         bool webViewDecideDatabaseQuotaForSecurityOriginCurrentQuotaCurrentOriginUsageCurrentDatabaseUsageExpectedUsageDecisionHandler : 1;
142         bool webViewDecideWebApplicationCacheQuotaForSecurityOriginCurrentQuotaTotalBytesNeeded : 1;
143         bool webViewPrintFrame : 1;
144         bool webViewDidClose : 1;
145         bool webViewClose : 1;
146         bool webViewFullscreenMayReturnToInline : 1;
147         bool webViewDidEnterFullscreen : 1;
148         bool webViewDidExitFullscreen : 1;
149         bool webViewRequestUserMediaAuthorizationForDevicesURLMainFrameURLDecisionHandler : 1;
150         bool webViewCheckUserMediaPermissionForURLMainFrameURLFrameIdentifierDecisionHandler : 1;
151         bool webViewMediaCaptureStateDidChange : 1;
152 #if PLATFORM(IOS)
153 #if HAVE(APP_LINKS)
154         bool webViewShouldIncludeAppLinkActionsForElement : 1;
155 #endif
156         bool webViewActionsForElementDefaultActions : 1;
157         bool webViewDidNotHandleTapAsClickAtPoint : 1;
158         bool presentingViewControllerForWebView : 1;
159 #endif
160         bool dataDetectionContextForWebView : 1;
161         bool webViewImageOrMediaDocumentSizeChanged : 1;
162 #if ENABLE(POINTER_LOCK)
163         bool webViewRequestPointerLock : 1;
164         bool webViewDidLosePointerLock : 1;
165 #endif
166 #if ENABLE(CONTEXT_MENUS)
167         bool webViewContextMenuForElement : 1;
168         bool webViewContextMenuForElementUserInfo : 1;
169 #endif
170         bool webViewHasVideoInPictureInPictureDidChange : 1;
171     } m_delegateMethods;
172 };
173
174 } // namespace WebKit
175
176 #endif // WK_API_ENABLED