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