31458754607583a73a4635e4522315e65169f6b6
[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 <WebCore/break_lines.h>
31 #import <WebCore/ResourceRequest.h>
32 #import <WebCore/TextBreakIterator.h>
33 #import <WebCore/WebCoreSystemInterface.h>
34 #import <WebCore/WebCoreThreadSystemInterface.h>
35 #import "WebDatabaseManagerInternal.h"
36 #import "WebKitSystemInterface.h"
37 #import "WebLocalizableStrings.h"
38 #import "WebPlatformStrategies.h"
39 #import "WebSystemInterface.h"
40 #import "WebViewPrivate.h"
41
42
43 #import <runtime/InitializeThreading.h>
44
45 using namespace WebCore;
46
47 static inline bool linkedOnOrAfterIOS5()
48 {
49     static bool s_linkedOnOrAfterIOS5 = iosExecutableWasLinkedOnOrAfterVersion(wkIOSSystemVersion_5_0);
50     return s_linkedOnOrAfterIOS5;
51 }
52
53 void WebKitInitialize(void)
54 {
55     static bool webkitInitialized;
56     if (webkitInitialized)
57         return;
58
59     ASSERT(pthread_main_np());
60     webkitInitialized = true;
61     InitWebCoreThreadSystemInterface();
62     [WebView enableWebThread];
63     InitWebCoreSystemInterface();
64
65     // Initialize our platform strategies.
66     WebPlatformStrategies::initializeIfNecessary();
67
68     // We'd rather eat this cost at startup than slow down situations that need to be responsive.
69     // See <rdar://problem/6776301>.
70     LoadWebLocalizedStrings();
71     [WebView _setAllowsRoundingHacks:!linkedOnOrAfterIOS5()];
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 WKGetMinimumZoomFontSize();
87 }
88
89 int WebKitGetLastLineBreakInBuffer(UChar *characters, int position, int length)
90 {
91     int lastBreakPos = position;
92     int breakPos = 0;
93     LazyLineBreakIterator breakIterator(String(characters, length));
94     while ((breakPos = nextBreakablePosition(breakIterator, breakPos)) < position)
95         lastBreakPos = breakPos++;
96     return lastBreakPos < position ? (NSUInteger)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 static void applicationDidEnterBackground(CFNotificationCenterRef, void*, CFStringRef, const void *, CFDictionaryRef)
114 {
115     WebKitSetWebDatabasePaused(true);
116 }
117
118 static void applicationWillEnterForeground(CFNotificationCenterRef, void*, CFStringRef, const void*, CFDictionaryRef)
119 {
120     WebKitSetWebDatabasePaused(false);
121 }
122
123 void WebKitSetBackgroundAndForegroundNotificationNames(NSString *didEnterBackgroundName, NSString *willEnterForegroundName)
124 {
125     static bool initialized = false;
126     if (initialized)
127         return;
128     initialized = true;
129
130     CFNotificationCenterRef notificationCenter = CFNotificationCenterGetLocalCenter();
131     CFNotificationCenterAddObserver(notificationCenter, 0, applicationDidEnterBackground, (CFStringRef)didEnterBackgroundName, NULL, CFNotificationSuspensionBehaviorCoalesce);
132     CFNotificationCenterAddObserver(notificationCenter, 0, applicationWillEnterForeground, (CFStringRef)willEnterForegroundName, NULL, CFNotificationSuspensionBehaviorCoalesce);
133
134 }
135
136 static WebBackgroundTaskIdentifier invalidTaskIdentifier = 0;
137 static StartBackgroundTaskBlock startBackgroundTaskBlock = 0;
138 static EndBackgroundTaskBlock endBackgroundTaskBlock = 0;
139
140 void WebKitSetInvalidWebBackgroundTaskIdentifier(WebBackgroundTaskIdentifier taskIdentifier)
141 {
142     invalidTaskIdentifier = taskIdentifier;
143 }
144
145 void WebKitSetStartBackgroundTaskBlock(StartBackgroundTaskBlock startBlock)
146 {
147     Block_release(startBackgroundTaskBlock);
148     startBackgroundTaskBlock = Block_copy(startBlock);    
149 }
150
151 void WebKitSetEndBackgroundTaskBlock(EndBackgroundTaskBlock endBlock)
152 {
153     Block_release(endBackgroundTaskBlock);
154     endBackgroundTaskBlock = Block_copy(endBlock);    
155 }
156
157 WebBackgroundTaskIdentifier invalidWebBackgroundTaskIdentifier()
158 {
159     return invalidTaskIdentifier;
160 }
161
162 WebBackgroundTaskIdentifier startBackgroundTask(VoidBlock expirationHandler)
163 {
164     if (!startBackgroundTaskBlock)
165         return invalidTaskIdentifier;
166     return startBackgroundTaskBlock(expirationHandler);
167 }
168
169 void endBackgroundTask(WebBackgroundTaskIdentifier taskIdentifier)
170 {
171     if (!endBackgroundTaskBlock)
172         return;
173     endBackgroundTaskBlock(taskIdentifier);
174 }
175
176 #endif // PLATFORM(IOS)