| Differences between
and this patch
- a/Source/WebKit2/ChangeLog +29 lines
Lines 1-3 a/Source/WebKit2/ChangeLog_sec1
1
2016-06-29  Chris Dumez  <cdumez@apple.com>
2
3
        [iOS] Process suspension is prevented for 30 seconds after closing a tab
4
        https://bugs.webkit.org/show_bug.cgi?id=159280
5
        <rdar://problem/27014867>
6
7
        Reviewed by NOBODY (OOPS!).
8
9
        When closing a tab, ConnectionTerminationWatchdog takes a background
10
        assertion on behalf of the WebContent process and only releases it
11
        after 30 seconds, allowing for the WebContent process to exit cleanly
12
        without worrying about getting suspended too early.
13
14
        However, the child process normally exits much sooner than this and
15
        we end up holding a process assertion for no reason for a full 30
16
        seconds anyway. This patch addresses the issue by registering an
17
        invalidation handler with the BKSProcessAssertion and releasing our
18
        our assertion in such case. The invalidation handler gets called
19
        as soon as the child process exits.
20
21
        * Platform/spi/ios/AssertionServicesSPI.h:
22
        * UIProcess/ProcessAssertion.cpp:
23
        (WebKit::ProcessAssertion::ProcessAssertion):
24
        * UIProcess/ProcessAssertion.h:
25
        (WebKit::ProcessAssertion::ProcessAssertion):
26
        * UIProcess/ios/ProcessAssertionIOS.mm:
27
        (WebKit::ProcessAssertion::ProcessAssertion):
28
        (WebKit::ProcessAndUIAssertion::ProcessAndUIAssertion):
29
1
2016-06-29  Anders Carlsson  <andersca@apple.com>
30
2016-06-29  Anders Carlsson  <andersca@apple.com>
2
31
3
        Rename addressFields to contactFields
32
        Rename addressFields to contactFields
- a/Source/WebKit2/Platform/spi/ios/AssertionServicesSPI.h +3 lines
Lines 72-77 enum { a/Source/WebKit2/Platform/spi/ios/AssertionServicesSPI.h_sec1
72
};
72
};
73
typedef uint32_t BKSProcessAssertionReason;
73
typedef uint32_t BKSProcessAssertionReason;
74
74
75
typedef void (^BKSProcessAssertionInvalidationHandler)(void);
75
typedef void (^BKSProcessAssertionAcquisitionHandler)(BOOL acquired);
76
typedef void (^BKSProcessAssertionAcquisitionHandler)(BOOL acquired);
76
77
77
@interface BKSProcessAssertion : NSObject
78
@interface BKSProcessAssertion : NSObject
Lines 80-85 typedef void (^BKSProcessAssertionAcquisitionHandler)(BOOL acquired); a/Source/WebKit2/Platform/spi/ios/AssertionServicesSPI.h_sec2
80
@interface BKSProcessAssertion ()
81
@interface BKSProcessAssertion ()
81
@property (nonatomic, assign) BKSProcessAssertionFlags flags;
82
@property (nonatomic, assign) BKSProcessAssertionFlags flags;
82
- (id)initWithPID:(pid_t)pid flags:(BKSProcessAssertionFlags)flags reason:(BKSProcessAssertionReason)reason name:(NSString *)name withHandler:(BKSProcessAssertionAcquisitionHandler)handler;
83
- (id)initWithPID:(pid_t)pid flags:(BKSProcessAssertionFlags)flags reason:(BKSProcessAssertionReason)reason name:(NSString *)name withHandler:(BKSProcessAssertionAcquisitionHandler)handler;
84
85
@property (nonatomic, copy) BKSProcessAssertionInvalidationHandler invalidationHandler;
83
- (void)invalidate;
86
- (void)invalidate;
84
@end
87
@end
85
88
- a/Source/WebKit2/UIProcess/ProcessAssertion.cpp -1 / +1 lines
Lines 30-36 a/Source/WebKit2/UIProcess/ProcessAssertion.cpp_sec1
30
30
31
namespace WebKit {
31
namespace WebKit {
32
32
33
ProcessAssertion::ProcessAssertion(pid_t, AssertionState assertionState)
33
ProcessAssertion::ProcessAssertion(pid_t, AssertionState assertionState, std::function<void()>)
34
    : m_assertionState(assertionState)
34
    : m_assertionState(assertionState)
35
{
35
{
36
}
36
}
- a/Source/WebKit2/UIProcess/ProcessAssertion.h -1 / +3 lines
Lines 26-31 a/Source/WebKit2/UIProcess/ProcessAssertion.h_sec1
26
#ifndef ProcessAssertion_h
26
#ifndef ProcessAssertion_h
27
#define ProcessAssertion_h
27
#define ProcessAssertion_h
28
28
29
#include <functional>
30
29
#if PLATFORM(IOS) && !PLATFORM(IOS_SIMULATOR)
31
#if PLATFORM(IOS) && !PLATFORM(IOS_SIMULATOR)
30
#include <wtf/RetainPtr.h>
32
#include <wtf/RetainPtr.h>
31
OBJC_CLASS BKSProcessAssertion;
33
OBJC_CLASS BKSProcessAssertion;
Lines 47-53 public: a/Source/WebKit2/UIProcess/ProcessAssertion.h_sec2
47
49
48
class ProcessAssertion {
50
class ProcessAssertion {
49
public:
51
public:
50
    ProcessAssertion(pid_t, AssertionState);
52
    ProcessAssertion(pid_t, AssertionState, std::function<void()> invalidationCallback = { });
51
    ~ProcessAssertion();
53
    ~ProcessAssertion();
52
54
53
    void setClient(ProcessAssertionClient& client) { m_client = &client; }
55
    void setClient(ProcessAssertionClient& client) { m_client = &client; }
- a/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm -5 / +8 lines
Lines 143-159 static BKSProcessAssertionFlags flagsForState(AssertionState assertionState) a/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm_sec1
143
    }
143
    }
144
}
144
}
145
145
146
ProcessAssertion::ProcessAssertion(pid_t pid, AssertionState assertionState)
146
ProcessAssertion::ProcessAssertion(pid_t pid, AssertionState assertionState, std::function<void()> invalidationCallback)
147
    : m_assertionState(assertionState)
147
{
148
{
148
    m_assertionState = assertionState;
149
    
150
    BKSProcessAssertionAcquisitionHandler handler = ^(BOOL acquired) {
149
    BKSProcessAssertionAcquisitionHandler handler = ^(BOOL acquired) {
151
        if (!acquired) {
150
        if (!acquired) {
152
            LOG_ERROR("Unable to acquire assertion for process %d", pid);
151
            LOG_ERROR("Unable to acquire assertion for process %d", pid);
153
            ASSERT_NOT_REACHED();
152
            ASSERT_NOT_REACHED();
153
            invalidationCallback();
154
        }
154
        }
155
    };
155
    };
156
    m_assertion = adoptNS([[BKSProcessAssertion alloc] initWithPID:pid flags:flagsForState(assertionState) reason:BKSProcessAssertionReasonExtension name:@"Web content visible" withHandler:handler]);
156
    m_assertion = adoptNS([[BKSProcessAssertion alloc] initWithPID:pid flags:flagsForState(assertionState) reason:BKSProcessAssertionReasonExtension name:@"Web content visible" withHandler:handler]);
157
    m_assertion.get().invalidationHandler = ^() {
158
        invalidationCallback();
159
    };
157
}
160
}
158
161
159
ProcessAssertion::~ProcessAssertion()
162
ProcessAssertion::~ProcessAssertion()
Lines 173-179 void ProcessAssertion::setState(AssertionState assertionState) a/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm_sec2
173
}
176
}
174
177
175
ProcessAndUIAssertion::ProcessAndUIAssertion(pid_t pid, AssertionState assertionState)
178
ProcessAndUIAssertion::ProcessAndUIAssertion(pid_t pid, AssertionState assertionState)
176
    : ProcessAssertion(pid, assertionState)
179
    : ProcessAssertion(pid, assertionState, [this] { setState(AssertionState::Suspended); })
177
{
180
{
178
    if (assertionState != AssertionState::Suspended)
181
    if (assertionState != AssertionState::Suspended)
179
        [[WKProcessAssertionBackgroundTaskManager shared] incrementNeedsToRunInBackgroundCount];
182
        [[WKProcessAssertionBackgroundTaskManager shared] incrementNeedsToRunInBackgroundCount];
Lines 209-215 void ProcessAndUIAssertion::setClient(ProcessAssertionClient& newClient) a/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm_sec3
209
212
210
namespace WebKit {
213
namespace WebKit {
211
214
212
ProcessAssertion::ProcessAssertion(pid_t, AssertionState assertionState)
215
ProcessAssertion::ProcessAssertion(pid_t, AssertionState assertionState, std::function<void()>)
213
    : m_assertionState(assertionState)
216
    : m_assertionState(assertionState)
214
{
217
{
215
}
218
}

Return to Bug 159280