Diff
Modified: branches/safari-600.1.4.15-branch/Source/WebKit2/ChangeLog (178814 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/ChangeLog 2015-01-21 08:13:04 UTC (rev 178814)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/ChangeLog 2015-01-21 08:15:02 UTC (rev 178815)
@@ -1,5 +1,56 @@
2015-01-21 Babak Shafiei <[email protected]>
+ Merge r175698.
+
+ 2014-11-06 Daniel Bates <[email protected]>
+
+ [iOS] WebProcess needs to take a background task assertion to prevent being killed
+ for "suspended with locked system files"
+ https://bugs.webkit.org/show_bug.cgi?id=138155
+ <rdar://problem/17939303>
+
+ Reviewed by Anders Carlsson.
+
+ Mitigates an issue where the WebProcess may be killed when suspended holding locked files
+ by allowing the WebProcess to notify the UIProcess when it is holding such files so that
+ both can continue to run for a period of time after the UIProcess transitions to the
+ background. In particular, the WebProcess notifies the UIProcess that it is holding- or
+ relinquished- a locked file when it begins and ends a sequence of SQLite transactions,
+ respectively.
+
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::disconnect): Relinquish an existing background task assertion
+ when the WebProcess disconnects. Among other situations, the WebProcess may disconnect as
+ a result of being suspended holding locked files even when the UIProcess requested a
+ background task assertion (i.e. it may have exceeded its background time limit).
+ (WebKit::WebProcessProxy::setIsHoldingLockedFiles): Added. Either acquires a new background
+ task assertion or relinquishes an existing one.
+ * UIProcess/WebProcessProxy.h:
+ * UIProcess/WebProcessProxy.messages.in: Added message SetIsHoldingLockedFiles(bool). The WebProcess
+ dispatches this message to inform the UIProcess that it is holding- or relinquished- a locked file.
+ * WebKit2.xcodeproj/project.pbxproj: Added files WebSQLiteDatabaseTracker.{cpp, h}.
+ * WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.cpp: Added.
+ (WebKit::WebSQLiteDatabaseTracker::supplementName): Added.
+ (WebKit::WebSQLiteDatabaseTracker::WebSQLiteDatabaseTracker): Added.
+ (WebKit::WebSQLiteDatabaseTracker::initialize): Register to receive SQLiteDatabaseTrackerClient callbacks.
+ (WebKit::WebSQLiteDatabaseTracker::willBeginFirstTransaction): Inform the HysteresisActivity object on
+ the main thread that we began a transaction so that it calls WebSQLiteDatabaseTracker::started().
+ (WebKit::WebSQLiteDatabaseTracker::didFinishLastTransaction): Inform the HysteresisActivity object on
+ the main thread that we finished a transaction so that it may eventually call WebSQLiteDatabaseTracker::stopped().
+ (WebKit::WebSQLiteDatabaseTracker::started): Notify the UIProcess that the WebProcess is holding
+ a locked file.
+ (WebKit::WebSQLiteDatabaseTracker::stopped): Notify the UIProcess that the WebProcess has
+ relinquished the locked file.
+ * WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.h: Added. We use a HysteresisActivity object
+ to coalesce SetIsHoldingLockedFiles(false) messages as an optimization to minimize the number of
+ messages exchanged between the UIProcess and WebProcess when a web page performs SQLite transactions
+ in batches.
+ * WebProcess/WebProcess.cpp:
+ (WebKit::WebProcess::WebProcess): Instantiate the supplement WebSQLiteDatabaseTracker when building
+ for iOS.
+
+2015-01-21 Babak Shafiei <[email protected]>
+
Merge r175636.
2014-11-04 Jon Honeycutt <[email protected]>
Modified: branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.cpp (178814 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.cpp 2015-01-21 08:13:04 UTC (rev 178814)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.cpp 2015-01-21 08:15:02 UTC (rev 178815)
@@ -151,6 +151,7 @@
}
m_responsivenessTimer.invalidate();
+ m_tokenForHoldingLockedFiles = nullptr;
Vector<RefPtr<WebFrameProxy>> frames;
copyValuesToVector(m_frameMap, frames);
@@ -753,4 +754,14 @@
m_throttler->didCancelProcessSuspension();
}
+void WebProcessProxy::setIsHoldingLockedFiles(bool isHoldingLockedFiles)
+{
+ if (!isHoldingLockedFiles) {
+ m_tokenForHoldingLockedFiles = nullptr;
+ return;
+ }
+ if (!m_tokenForHoldingLockedFiles)
+ m_tokenForHoldingLockedFiles = std::make_unique<ProcessThrottler::BackgroundActivityToken>(*m_throttler);
+}
+
} // namespace WebKit
Modified: branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.h (178814 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.h 2015-01-21 08:13:04 UTC (rev 178814)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.h 2015-01-21 08:15:02 UTC (rev 178815)
@@ -139,7 +139,9 @@
void processReadyToSuspend();
void sendCancelProcessWillSuspend();
void didCancelProcessSuspension();
-
+
+ void setIsHoldingLockedFiles(bool);
+
ProcessThrottler& throttler() { return *m_throttler; }
private:
@@ -227,6 +229,7 @@
int m_numberOfTimesSuddenTerminationWasDisabled;
std::unique_ptr<ProcessThrottler> m_throttler;
+ std::unique_ptr<ProcessThrottler::BackgroundActivityToken> m_tokenForHoldingLockedFiles;
};
} // namespace WebKit
Modified: branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.messages.in (178814 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.messages.in 2015-01-21 08:13:04 UTC (rev 178814)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/WebProcessProxy.messages.in 2015-01-21 08:15:02 UTC (rev 178815)
@@ -49,4 +49,6 @@
#endif
ProcessReadyToSuspend()
DidCancelProcessSuspension()
+
+ SetIsHoldingLockedFiles(bool isHoldingLockedFiles)
}
Modified: branches/safari-600.1.4.15-branch/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (178814 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2015-01-21 08:13:04 UTC (rev 178814)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2015-01-21 08:15:02 UTC (rev 178815)
@@ -1595,6 +1595,8 @@
CDCA85C9132ABA4E00E961DF /* WKFullScreenWindowController.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCA85C7132ABA4E00E961DF /* WKFullScreenWindowController.h */; };
CEDA12E2152CD1AE00D9E08D /* WebAlternativeTextClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEDA12DF152CCAE800D9E08D /* WebAlternativeTextClient.cpp */; };
CEDA12E3152CD1B300D9E08D /* WebAlternativeTextClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CEDA12DE152CCAE800D9E08D /* WebAlternativeTextClient.h */; };
+ CEDBA84719FDA00A006866A5 /* WebSQLiteDatabaseTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEDBA84519FDA00A006866A5 /* WebSQLiteDatabaseTracker.cpp */; };
+ CEDBA84819FDA00A006866A5 /* WebSQLiteDatabaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = CEDBA84619FDA00A006866A5 /* WebSQLiteDatabaseTracker.h */; };
D3B9484611FF4B6500032B39 /* WebPopupMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3B9484211FF4B6500032B39 /* WebPopupMenu.cpp */; };
D3B9484711FF4B6500032B39 /* WebPopupMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = D3B9484311FF4B6500032B39 /* WebPopupMenu.h */; };
D3B9484811FF4B6500032B39 /* WebSearchPopupMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D3B9484411FF4B6500032B39 /* WebSearchPopupMenu.cpp */; };
@@ -3693,6 +3695,8 @@
CDCA85D4132AC2B300E961DF /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = /System/Library/Frameworks/IOKit.framework; sourceTree = "<absolute>"; };
CEDA12DE152CCAE800D9E08D /* WebAlternativeTextClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebAlternativeTextClient.h; sourceTree = "<group>"; };
CEDA12DF152CCAE800D9E08D /* WebAlternativeTextClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebAlternativeTextClient.cpp; sourceTree = "<group>"; };
+ CEDBA84519FDA00A006866A5 /* WebSQLiteDatabaseTracker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSQLiteDatabaseTracker.cpp; sourceTree = "<group>"; };
+ CEDBA84619FDA00A006866A5 /* WebSQLiteDatabaseTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSQLiteDatabaseTracker.h; sourceTree = "<group>"; };
D3B9484211FF4B6500032B39 /* WebPopupMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebPopupMenu.cpp; sourceTree = "<group>"; };
D3B9484311FF4B6500032B39 /* WebPopupMenu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebPopupMenu.h; sourceTree = "<group>"; };
D3B9484411FF4B6500032B39 /* WebSearchPopupMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebSearchPopupMenu.cpp; sourceTree = "<group>"; };
@@ -5705,6 +5709,8 @@
1A1E093218861D3800D2DC49 /* WebProgressTrackerClient.h */,
D3B9484411FF4B6500032B39 /* WebSearchPopupMenu.cpp */,
D3B9484511FF4B6500032B39 /* WebSearchPopupMenu.h */,
+ CEDBA84519FDA00A006866A5 /* WebSQLiteDatabaseTracker.cpp */,
+ CEDBA84619FDA00A006866A5 /* WebSQLiteDatabaseTracker.h */,
);
path = WebCoreSupport;
sourceTree = "<group>";
@@ -7342,6 +7348,7 @@
1AAB037A185A7C6A00EDF501 /* MessageSender.h in Headers */,
1A6FB7AF11E64B6800DB1371 /* PluginView.h in Headers */,
1AFE436618B6C081009C7A48 /* UIDelegate.h in Headers */,
+ CEDBA84819FDA00A006866A5 /* WebSQLiteDatabaseTracker.h in Headers */,
E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */,
BC1A7C581136E19C00FB7167 /* ProcessLauncher.h in Headers */,
BC597075116591D000551FCA /* ProcessModel.h in Headers */,
@@ -8977,6 +8984,7 @@
371B32DD184D67490013E2B2 /* WKNSURLProtectionSpace.mm in Sources */,
BCC43ABA127B95DC00317F16 /* PlatformPopupMenuData.cpp in Sources */,
1A6FB7D211E651E200DB1371 /* Plugin.cpp in Sources */,
+ CEDBA84719FDA00A006866A5 /* WebSQLiteDatabaseTracker.cpp in Sources */,
31A67E0C165B2A99006CBA66 /* PlugInAutoStartProvider.cpp in Sources */,
1A8EF4CC1252403700F7067F /* PluginControllerProxy.cpp in Sources */,
1A2D91A61281D739001EB962 /* PluginControllerProxyMac.mm in Sources */,
Copied: branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.cpp (from rev 175698, trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.cpp) (0 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.cpp (rev 0)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.cpp 2015-01-21 08:15:02 UTC (rev 178815)
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebSQLiteDatabaseTracker.h"
+
+#if ENABLE(SQL_DATABASE)
+
+#include "WebProcess.h"
+#include "WebProcessProxyMessages.h"
+#include <WebCore/SQLiteDatabaseTracker.h>
+#include <wtf/MainThread.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+const char* WebSQLiteDatabaseTracker::supplementName()
+{
+ return "WebSQLiteDatabaseTracker";
+}
+
+WebSQLiteDatabaseTracker::WebSQLiteDatabaseTracker(WebProcess* process)
+ : m_process(process)
+ , m_hysteresis(*this)
+{
+}
+
+void WebSQLiteDatabaseTracker::initialize(const WebProcessCreationParameters&)
+{
+ SQLiteDatabaseTracker::setClient(this);
+}
+
+void WebSQLiteDatabaseTracker::willBeginFirstTransaction()
+{
+ callOnMainThread([this] {
+ m_hysteresis.start();
+ });
+}
+
+void WebSQLiteDatabaseTracker::didFinishLastTransaction()
+{
+ callOnMainThread([this] {
+ m_hysteresis.stop();
+ });
+}
+
+void WebSQLiteDatabaseTracker::started()
+{
+ m_process->parentProcessConnection()->send(Messages::WebProcessProxy::SetIsHoldingLockedFiles(true), 0);
+}
+
+void WebSQLiteDatabaseTracker::stopped()
+{
+ m_process->parentProcessConnection()->send(Messages::WebProcessProxy::SetIsHoldingLockedFiles(false), 0);
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(SQL_DATABASE)
Copied: branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.h (from rev 175698, trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.h) (0 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.h (rev 0)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebCoreSupport/WebSQLiteDatabaseTracker.h 2015-01-21 08:15:02 UTC (rev 178815)
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebSQLiteDatabaseTracker_h
+#define WebSQLiteDatabaseTracker_h
+
+#include "WebProcessSupplement.h"
+#include <WebCore/HysteresisActivity.h>
+#include <WebCore/SQLiteDatabaseTrackerClient.h>
+#include <wtf/Noncopyable.h>
+
+#if ENABLE(SQL_DATABASE)
+
+namespace WebKit {
+
+class WebProcess;
+
+class WebSQLiteDatabaseTracker : public WebCore::SQLiteDatabaseTrackerClient, public WebProcessSupplement {
+ WTF_MAKE_NONCOPYABLE(WebSQLiteDatabaseTracker);
+public:
+ explicit WebSQLiteDatabaseTracker(WebProcess*);
+
+ static const char* supplementName();
+
+ // WebSupplement
+ virtual void initialize(const WebProcessCreationParameters&) override;
+
+ // WebCore::SQLiteDatabaseTrackerClient
+ virtual void willBeginFirstTransaction() override;
+ virtual void didFinishLastTransaction() override;
+
+private:
+ // WebCore::HysteresisActivity
+ friend class WebCore::HysteresisActivity<WebSQLiteDatabaseTracker>;
+ void started();
+ void stopped();
+
+ WebProcess* m_process;
+ WebCore::HysteresisActivity<WebSQLiteDatabaseTracker> m_hysteresis;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(SQL_DATABASE)
+
+#endif // WebSQLiteDatabaseTracker_h
Modified: branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebProcess.cpp (178814 => 178815)
--- branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebProcess.cpp 2015-01-21 08:13:04 UTC (rev 178814)
+++ branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/WebProcess.cpp 2015-01-21 08:15:02 UTC (rev 178815)
@@ -113,7 +113,10 @@
#if ENABLE(SQL_DATABASE)
#include "WebDatabaseManager.h"
+#if PLATFORM(IOS)
+#include "WebSQLiteDatabaseTracker.h"
#endif
+#endif
#if ENABLE(BATTERY_STATUS)
#include "WebBatteryManager.h"
@@ -192,7 +195,11 @@
#if ENABLE(SQL_DATABASE)
addSupplement<WebDatabaseManager>();
+#if PLATFORM(IOS)
+ addSupplement<WebSQLiteDatabaseTracker>();
#endif
+#endif
+
#if ENABLE(NOTIFICATIONS) || ENABLE(LEGACY_NOTIFICATIONS)
addSupplement<WebNotificationManager>();
#endif