Add WKNavigation/WKNavigationAction related SPI.
[WebKit-https.git] / Source / WebKit / UIProcess / API / C / mac / WKPagePrivateMac.mm
1 /*
2  * Copyright (C) 2011 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 #import "config.h"
27 #import "WKPagePrivateMac.h"
28
29 #import "FullscreenClient.h"
30 #import "PageLoadStateObserver.h"
31 #import "WKAPICast.h"
32 #import "WKNSURLExtras.h"
33 #import "WKNavigationInternal.h"
34 #import "WKViewInternal.h"
35 #import "WebPageGroup.h"
36 #import "WebPageProxy.h"
37 #import "WebPreferences.h"
38 #import "WebProcessPool.h"
39
40 using namespace WebKit;
41
42 @interface WKObservablePageState : NSObject <_WKObservablePageState> {
43     RefPtr<WebPageProxy> _page;
44     std::unique_ptr<PageLoadStateObserver> _observer;
45 }
46
47 @end
48
49 @implementation WKObservablePageState
50
51 - (id)initWithPage:(RefPtr<WebPageProxy>&&)page
52 {
53     if (!(self = [super init]))
54         return nil;
55
56     _page = WTFMove(page);
57     _observer = std::make_unique<PageLoadStateObserver>(self, @"URL");
58     _page->pageLoadState().addObserver(*_observer);
59
60     return self;
61 }
62
63 - (void)dealloc
64 {
65     _page->pageLoadState().removeObserver(*_observer);
66
67     [super dealloc];
68 }
69
70 - (BOOL)isLoading
71 {
72     return _page->pageLoadState().isLoading();
73 }
74
75 - (NSString *)title
76 {
77     return _page->pageLoadState().title();
78 }
79
80 - (NSURL *)URL
81 {
82     return [NSURL _web_URLWithWTFString:_page->pageLoadState().activeURL()];
83 }
84
85 - (BOOL)hasOnlySecureContent
86 {
87     return _page->pageLoadState().hasOnlySecureContent();
88 }
89
90 - (BOOL)_webProcessIsResponsive
91 {
92     return _page->process().isResponsive();
93 }
94
95 - (double)estimatedProgress
96 {
97     return _page->estimatedProgress();
98 }
99
100 - (NSURL *)unreachableURL
101 {
102     return [NSURL _web_URLWithWTFString:_page->pageLoadState().unreachableURL()];
103 }
104
105 - (SecTrustRef)serverTrust
106 {
107 #if HAVE(SEC_TRUST_SERIALIZATION)
108     auto certificateInfo = _page->pageLoadState().certificateInfo();
109     if (!certificateInfo)
110         return nil;
111
112     return certificateInfo->certificateInfo().trust();
113 #else
114     return nil;
115 #endif
116 }
117
118 @end
119
120 id <_WKObservablePageState> WKPageCreateObservableState(WKPageRef pageRef)
121 {
122     return [[WKObservablePageState alloc] initWithPage:toImpl(pageRef)];
123 }
124
125 _WKRemoteObjectRegistry *WKPageGetObjectRegistry(WKPageRef pageRef)
126 {
127 #if WK_API_ENABLED && !TARGET_OS_IPHONE
128     return toImpl(pageRef)->remoteObjectRegistry();
129 #else
130     return nil;
131 #endif
132 }
133
134 bool WKPageIsURLKnownHSTSHost(WKPageRef page, WKURLRef url)
135 {
136     WebPageProxy* webPageProxy = toImpl(page);
137     bool privateBrowsingEnabled = webPageProxy->pageGroup().preferences().privateBrowsingEnabled();
138
139     return webPageProxy->process().processPool().isURLKnownHSTSHost(toImpl(url)->string(), privateBrowsingEnabled);
140 }
141
142 #if !TARGET_OS_IPHONE && (defined(__clang__) && defined(__APPLE__) && !defined(__i386__))
143 WKNavigation *WKPageLoadURLRequestReturningNavigation(WKPageRef pageRef, WKURLRequestRef urlRequestRef)
144 {
145     auto resourceRequest = toImpl(urlRequestRef)->resourceRequest();
146     auto navigation = toImpl(pageRef)->loadRequest(WTFMove(resourceRequest));
147
148     if (!navigation)
149         return nil;
150
151     return [API::wrapper(*navigation.leakRef()) autorelease];
152 }
153 #endif
154
155 #if PLATFORM(MAC)
156 bool WKPageIsPlayingVideoInEnhancedFullscreen(WKPageRef pageRef)
157 {
158     return toImpl(pageRef)->isPlayingVideoInEnhancedFullscreen();
159 }
160 #endif
161
162 void WKPageSetFullscreenDelegate(WKPageRef page, id <_WKFullscreenDelegate> delegate)
163 {
164 #if WK_API_ENABLED && ENABLE(FULLSCREEN_API)
165     downcast<WebKit::FullscreenClient>(toImpl(page)->fullscreenClient()).setDelegate(delegate);
166 #endif
167 }
168
169 id <_WKFullscreenDelegate> WKPageGetFullscreenDelegate(WKPageRef page)
170 {
171 #if WK_API_ENABLED && ENABLE(FULLSCREEN_API)
172     return downcast<WebKit::FullscreenClient>(toImpl(page)->fullscreenClient()).delegate().autorelease();
173 #else
174     return nil;
175 #endif
176 }
177