Remove ParsedURLString
[WebKit-https.git] / Source / WebKitLegacy / 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 "WebLocalizableStringsInternal.h"
32 #import "WebPlatformStrategies.h"
33 #import "WebViewPrivate.h"
34 #import <JavaScriptCore/InitializeThreading.h>
35 #import <WebCore/BreakLines.h>
36 #import <WebCore/PathUtilities.h>
37 #import <WebCore/ResourceRequest.h>
38 #import <WebCore/Settings.h>
39 #import <WebCore/WebBackgroundTaskController.h>
40 #import <WebCore/WebCoreThreadSystemInterface.h>
41 #import <wtf/spi/darwin/dyldSPI.h>
42
43 using namespace WebCore;
44
45 static inline bool linkedOnOrAfterIOS5()
46 {
47     static bool s_linkedOnOrAfterIOS5 = dyld_get_program_sdk_version() >= DYLD_IOS_VERSION_5_0;
48     return s_linkedOnOrAfterIOS5;
49 }
50
51 // See <rdar://problem/7902473> Optimize WebLocalizedString for why we do this on a background thread on a timer callback
52 static void LoadWebLocalizedStringsTimerCallback(CFRunLoopTimerRef timer, void *info)
53 {
54     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^ {
55         // We don't care if we find this string, but searching for it will load the plist and save the results.
56         // FIXME: It would be nicer to do this in a more direct way.
57         UI_STRING_KEY_INTERNAL("Typing", "Typing (Undo action name)", "Undo action name");
58     });
59 }
60
61 static void LoadWebLocalizedStrings()
62 {
63     CFRunLoopTimerRef timer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), 0, 0, 0, &LoadWebLocalizedStringsTimerCallback, NULL);
64     CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes);
65     CFRelease(timer);
66 }
67
68 void WebKitInitialize(void)
69 {
70     static bool webkitInitialized;
71     if (webkitInitialized)
72         return;
73
74     ASSERT(pthread_main_np());
75     webkitInitialized = true;
76     InitWebCoreThreadSystemInterface();
77     [WebView enableWebThread];
78
79     // Initialize our platform strategies.
80     WebPlatformStrategies::initializeIfNecessary();
81
82     // We'd rather eat this cost at startup than slow down situations that need to be responsive.
83     // See <rdar://problem/6776301>.
84     LoadWebLocalizedStrings();
85     
86     // This needs to be called before any requests are made in the process, <rdar://problem/9691871>
87     WebCore::initializeHTTPConnectionSettingsOnStartup();
88     WebCore::enableURLSchemeCanonicalization(linkedOnOrAfterIOS5());
89 }
90
91 void WebKitSetIsClassic(BOOL flag)
92 {
93     // FIXME: Remove this once it stops being called.
94 }
95
96 float WebKitGetMinimumZoomFontSize(void)
97 {
98     return WebCore::Settings::defaultMinimumZoomFontSize();
99 }
100
101 int WebKitGetLastLineBreakInBuffer(UChar *characters, int position, int length)
102 {
103     unsigned lastBreakPos = position;
104     unsigned breakPos = 0;
105     LazyLineBreakIterator breakIterator(StringView(characters, length));
106     while (static_cast<int>(breakPos = nextBreakablePosition(breakIterator, breakPos)) < position)
107         lastBreakPos = breakPos++;
108     return static_cast<int>(lastBreakPos) < position ? lastBreakPos : INT_MAX;
109 }
110
111 const char *WebKitPlatformSystemRootDirectory(void)
112 {
113 #if PLATFORM(IOS_SIMULATOR)
114     static const char *platformSystemRootDirectory = nil;
115     if (!platformSystemRootDirectory) {
116         char *simulatorRoot = getenv("IPHONE_SIMULATOR_ROOT");
117         platformSystemRootDirectory = simulatorRoot ? simulatorRoot : "/";
118     }
119     return platformSystemRootDirectory;
120 #else
121     return "/";
122 #endif
123 }
124
125 void WebKitSetBackgroundAndForegroundNotificationNames(NSString *didEnterBackgroundName, NSString *willEnterForegroundName)
126 {
127     // FIXME: Remove this function.
128 }
129
130 void WebKitSetInvalidWebBackgroundTaskIdentifier(WebBackgroundTaskIdentifier taskIdentifier)
131 {
132     [[WebBackgroundTaskController sharedController] setInvalidBackgroundTaskIdentifier:taskIdentifier];
133 }
134
135 void WebKitSetStartBackgroundTaskBlock(StartBackgroundTaskBlock startBlock)
136 {
137     [[WebBackgroundTaskController sharedController] setBackgroundTaskStartBlock:startBlock];
138 }
139
140 void WebKitSetEndBackgroundTaskBlock(EndBackgroundTaskBlock endBlock)
141 {
142     [[WebBackgroundTaskController sharedController] setBackgroundTaskEndBlock:endBlock];
143 }
144
145 CGPathRef WebKitCreatePathWithShrinkWrappedRects(NSArray* cgRects, CGFloat radius)
146 {
147     Vector<FloatRect> rects;
148     rects.reserveInitialCapacity([cgRects count]);
149
150     const char* cgRectEncodedString = @encode(CGRect);
151
152     for (NSValue *rectValue in cgRects) {
153         CGRect cgRect;
154         [rectValue getValue:&cgRect];
155
156         if (strcmp(cgRectEncodedString, rectValue.objCType))
157             return nullptr;
158         rects.append(cgRect);
159     }
160
161     return CGPathRetain(PathUtilities::pathWithShrinkWrappedRects(rects, radius).platformPath());
162 }
163
164 #endif // PLATFORM(IOS)