LoadWebLocalizedStrings method should be moved in correct file
[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 "WebLocalizableStringsInternal.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 // See <rdar://problem/7902473> Optimize WebLocalizedString for why we do this on a background thread on a timer callback
55 static void LoadWebLocalizedStringsTimerCallback(CFRunLoopTimerRef timer, void *info)
56 {
57     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^ {
58         // We don't care if we find this string, but searching for it will load the plist and save the results.
59         // FIXME: It would be nicer to do this in a more direct way.
60         UI_STRING_KEY_INTERNAL("Typing", "Typing (Undo action name)", "Undo action name");
61     });
62 }
63
64 static void LoadWebLocalizedStrings()
65 {
66     CFRunLoopTimerRef timer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), 0, 0, 0, &LoadWebLocalizedStringsTimerCallback, NULL);
67     CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes);
68     CFRelease(timer);
69 }
70
71 void WebKitInitialize(void)
72 {
73     static bool webkitInitialized;
74     if (webkitInitialized)
75         return;
76
77     ASSERT(pthread_main_np());
78     webkitInitialized = true;
79     InitWebCoreThreadSystemInterface();
80     [WebView enableWebThread];
81     InitWebCoreSystemInterface();
82
83     // Initialize our platform strategies.
84     WebPlatformStrategies::initializeIfNecessary();
85
86     // We'd rather eat this cost at startup than slow down situations that need to be responsive.
87     // See <rdar://problem/6776301>.
88     LoadWebLocalizedStrings();
89     [WebView registerForMemoryNotifications];
90     
91     // This needs to be called before any requests are made in the process, <rdar://problem/9691871>
92     WebCore::initializeHTTPConnectionSettingsOnStartup();
93     WebCore::enableURLSchemeCanonicalization(linkedOnOrAfterIOS5());
94 }
95
96 void WebKitSetIsClassic(BOOL flag)
97 {
98     // FIXME: Remove this once it stops being called.
99 }
100
101 float WebKitGetMinimumZoomFontSize(void)
102 {
103     return WebCore::Settings::defaultMinimumZoomFontSize();
104 }
105
106 int WebKitGetLastLineBreakInBuffer(UChar *characters, int position, int length)
107 {
108     unsigned lastBreakPos = position;
109     unsigned breakPos = 0;
110     LazyLineBreakIterator breakIterator(StringView(characters, length));
111     while (static_cast<int>(breakPos = nextBreakablePosition(breakIterator, breakPos)) < position)
112         lastBreakPos = breakPos++;
113     return static_cast<int>(lastBreakPos) < position ? lastBreakPos : INT_MAX;
114 }
115
116 const char *WebKitPlatformSystemRootDirectory(void)
117 {
118 #if PLATFORM(IOS_SIMULATOR)
119     static const char *platformSystemRootDirectory = nil;
120     if (!platformSystemRootDirectory) {
121         char *simulatorRoot = getenv("IPHONE_SIMULATOR_ROOT");
122         platformSystemRootDirectory = simulatorRoot ? simulatorRoot : "/";
123     }
124     return platformSystemRootDirectory;
125 #else
126     return "/";
127 #endif
128 }
129
130 void WebKitSetBackgroundAndForegroundNotificationNames(NSString *didEnterBackgroundName, NSString *willEnterForegroundName)
131 {
132     // FIXME: Remove this function.
133 }
134
135 static WebBackgroundTaskIdentifier invalidTaskIdentifier = 0;
136 static StartBackgroundTaskBlock startBackgroundTaskBlock = 0;
137 static EndBackgroundTaskBlock endBackgroundTaskBlock = 0;
138
139 void WebKitSetInvalidWebBackgroundTaskIdentifier(WebBackgroundTaskIdentifier taskIdentifier)
140 {
141     invalidTaskIdentifier = taskIdentifier;
142 }
143
144 void WebKitSetStartBackgroundTaskBlock(StartBackgroundTaskBlock startBlock)
145 {
146     Block_release(startBackgroundTaskBlock);
147     startBackgroundTaskBlock = Block_copy(startBlock);    
148 }
149
150 void WebKitSetEndBackgroundTaskBlock(EndBackgroundTaskBlock endBlock)
151 {
152     Block_release(endBackgroundTaskBlock);
153     endBackgroundTaskBlock = Block_copy(endBlock);    
154 }
155
156 WebBackgroundTaskIdentifier invalidWebBackgroundTaskIdentifier()
157 {
158     return invalidTaskIdentifier;
159 }
160
161 WebBackgroundTaskIdentifier startBackgroundTask(VoidBlock expirationHandler)
162 {
163     if (!startBackgroundTaskBlock)
164         return invalidTaskIdentifier;
165     return startBackgroundTaskBlock(expirationHandler);
166 }
167
168 void endBackgroundTask(WebBackgroundTaskIdentifier taskIdentifier)
169 {
170     if (!endBackgroundTaskBlock)
171         return;
172     endBackgroundTaskBlock(taskIdentifier);
173 }
174
175 CGPathRef WebKitCreatePathWithShrinkWrappedRects(NSArray* cgRects, CGFloat radius)
176 {
177     Vector<FloatRect> rects;
178     rects.reserveInitialCapacity([cgRects count]);
179
180     const char* cgRectEncodedString = @encode(CGRect);
181
182     for (NSValue *rectValue in cgRects) {
183         CGRect cgRect;
184         [rectValue getValue:&cgRect];
185
186         if (strcmp(cgRectEncodedString, rectValue.objCType))
187             return nullptr;
188         rects.append(cgRect);
189     }
190
191     return CGPathRetain(PathUtilities::pathWithShrinkWrappedRects(rects, radius).platformPath());
192 }
193
194 #endif // PLATFORM(IOS)