c4efc2e4de10d01577d654589d6172b9633890d7
[WebKit-https.git] / Source / WebKit / ios / Misc / WebUIKitSupport.mm
1 /*
2  * Copyright (C) 2006 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 #if PLATFORM(IOS)
27
28 #import "WebUIKitSupport.h"
29
30 #import "WebDatabaseManagerInternal.h"
31 #import "WebKitSystemInterface.h"
32 #import "WebLocalizableStrings.h"
33 #import "WebPlatformStrategies.h"
34 #import "WebSystemInterface.h"
35 #import "WebViewPrivate.h"
36 #import <WebCore/BreakLines.h>
37 #import <WebCore/PathUtilities.h>
38 #import <WebCore/ResourceRequest.h>
39 #import <WebCore/Settings.h>
40 #import <WebCore/WebCoreSystemInterface.h>
41 #import <WebCore/WebCoreThreadSystemInterface.h>
42 #import <wtf/spi/darwin/dyldSPI.h>
43
44 #import <runtime/InitializeThreading.h>
45
46 using namespace WebCore;
47
48 static inline bool linkedOnOrAfterIOS5()
49 {
50     static bool s_linkedOnOrAfterIOS5 = dyld_get_program_sdk_version() >= DYLD_IOS_VERSION_5_0;
51     return s_linkedOnOrAfterIOS5;
52 }
53
54 void WebKitInitialize(void)
55 {
56     static bool webkitInitialized;
57     if (webkitInitialized)
58         return;
59
60     ASSERT(pthread_main_np());
61     webkitInitialized = true;
62     InitWebCoreThreadSystemInterface();
63     [WebView enableWebThread];
64     InitWebCoreSystemInterface();
65
66     // Initialize our platform strategies.
67     WebPlatformStrategies::initializeIfNecessary();
68
69     // We'd rather eat this cost at startup than slow down situations that need to be responsive.
70     // See <rdar://problem/6776301>.
71     LoadWebLocalizedStrings();
72     [WebView registerForMemoryNotifications];
73     
74     // This needs to be called before any requests are made in the process, <rdar://problem/9691871>
75     WebCore::initializeHTTPConnectionSettingsOnStartup();
76     WebCore::enableURLSchemeCanonicalization(linkedOnOrAfterIOS5());
77 }
78
79 void WebKitSetIsClassic(BOOL flag)
80 {
81     // FIXME: Remove this once it stops being called.
82 }
83
84 float WebKitGetMinimumZoomFontSize(void)
85 {
86     return WebCore::Settings::defaultMinimumZoomFontSize();
87 }
88
89 int WebKitGetLastLineBreakInBuffer(UChar *characters, int position, int length)
90 {
91     unsigned lastBreakPos = position;
92     unsigned breakPos = 0;
93     LazyLineBreakIterator breakIterator(StringView(characters, length));
94     while (static_cast<int>(breakPos = nextBreakablePosition(breakIterator, breakPos)) < position)
95         lastBreakPos = breakPos++;
96     return static_cast<int>(lastBreakPos) < position ? lastBreakPos : INT_MAX;
97 }
98
99 const char *WebKitPlatformSystemRootDirectory(void)
100 {
101 #if PLATFORM(IOS_SIMULATOR)
102     static const char *platformSystemRootDirectory = nil;
103     if (!platformSystemRootDirectory) {
104         char *simulatorRoot = getenv("IPHONE_SIMULATOR_ROOT");
105         platformSystemRootDirectory = simulatorRoot ? simulatorRoot : "/";
106     }
107     return platformSystemRootDirectory;
108 #else
109     return "/";
110 #endif
111 }
112
113 void WebKitSetBackgroundAndForegroundNotificationNames(NSString *didEnterBackgroundName, NSString *willEnterForegroundName)
114 {
115     // FIXME: Remove this function.
116 }
117
118 static WebBackgroundTaskIdentifier invalidTaskIdentifier = 0;
119 static StartBackgroundTaskBlock startBackgroundTaskBlock = 0;
120 static EndBackgroundTaskBlock endBackgroundTaskBlock = 0;
121
122 void WebKitSetInvalidWebBackgroundTaskIdentifier(WebBackgroundTaskIdentifier taskIdentifier)
123 {
124     invalidTaskIdentifier = taskIdentifier;
125 }
126
127 void WebKitSetStartBackgroundTaskBlock(StartBackgroundTaskBlock startBlock)
128 {
129     Block_release(startBackgroundTaskBlock);
130     startBackgroundTaskBlock = Block_copy(startBlock);    
131 }
132
133 void WebKitSetEndBackgroundTaskBlock(EndBackgroundTaskBlock endBlock)
134 {
135     Block_release(endBackgroundTaskBlock);
136     endBackgroundTaskBlock = Block_copy(endBlock);    
137 }
138
139 WebBackgroundTaskIdentifier invalidWebBackgroundTaskIdentifier()
140 {
141     return invalidTaskIdentifier;
142 }
143
144 WebBackgroundTaskIdentifier startBackgroundTask(VoidBlock expirationHandler)
145 {
146     if (!startBackgroundTaskBlock)
147         return invalidTaskIdentifier;
148     return startBackgroundTaskBlock(expirationHandler);
149 }
150
151 void endBackgroundTask(WebBackgroundTaskIdentifier taskIdentifier)
152 {
153     if (!endBackgroundTaskBlock)
154         return;
155     endBackgroundTaskBlock(taskIdentifier);
156 }
157
158 CGPathRef WebKitCreatePathWithShrinkWrappedRects(NSArray* cgRects, CGFloat radius)
159 {
160     Vector<FloatRect> rects;
161     rects.reserveInitialCapacity([cgRects count]);
162
163     const char* cgRectEncodedString = @encode(CGRect);
164
165     for (NSValue *rectValue in cgRects) {
166         CGRect cgRect;
167         [rectValue getValue:&cgRect];
168
169         if (strcmp(cgRectEncodedString, rectValue.objCType))
170             return nullptr;
171         rects.append(cgRect);
172     }
173
174     return CGPathRetain(PathUtilities::pathWithShrinkWrappedRects(rects, radius).platformPath());
175 }
176
177 #endif // PLATFORM(IOS)