Changeset 215918 in webkit
- Timestamp:
- Apr 27, 2017, 9:05:56 PM (8 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r215917 r215918 1 2017-04-27 Alex Christensen <achristensen@webkit.org> 2 3 Make navigation policy checking more robust 4 https://bugs.webkit.org/show_bug.cgi?id=171409 5 <rdar://problem/31489248> 6 7 Reviewed by Geoffrey Garen. 8 9 No change in behavior. Just added a protectedThis to a lambda and made the functions non-copyable. 10 11 * loader/DocumentLoader.cpp: 12 (WebCore::DocumentLoader::willSendRequest): 13 * loader/PolicyCallback.cpp: 14 (WebCore::PolicyCallback::set): 15 (WebCore::PolicyCallback::clear): Deleted. 16 * loader/PolicyCallback.h: 17 * loader/PolicyChecker.cpp: 18 (WebCore::PolicyChecker::cancelCheck): 19 (WebCore::PolicyChecker::stopCheck): 20 (WebCore::PolicyChecker::continueAfterNavigationPolicy): 21 (WebCore::PolicyChecker::continueAfterNewWindowPolicy): 22 (WebCore::PolicyChecker::continueAfterContentPolicy): 23 1 24 2017-04-27 Wenson Hsieh <wenson_hsieh@apple.com> 2 25 -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r215160 r215918 568 568 ASSERT(!m_waitingForNavigationPolicy); 569 569 m_waitingForNavigationPolicy = true; 570 frameLoader()->policyChecker().checkNavigationPolicy(newRequest, didReceiveRedirectResponse, [this ] (const ResourceRequest& request, FormState*, bool shouldContinue) {570 frameLoader()->policyChecker().checkNavigationPolicy(newRequest, didReceiveRedirectResponse, [this, protectedThis = makeRef(*this)] (const ResourceRequest& request, FormState*, bool shouldContinue) { 571 571 continueAfterNavigationPolicy(request, shouldContinue); 572 572 }); -
trunk/Source/WebCore/loader/PolicyCallback.cpp
r210216 r215918 39 39 namespace WebCore { 40 40 41 void PolicyCallback::clear() 42 { 43 clearRequest(); 44 m_navigationFunction = nullptr; 45 m_newWindowFunction = nullptr; 46 m_contentFunction = nullptr; 47 } 48 49 void PolicyCallback::set(const ResourceRequest& request, FormState* formState, 50 NavigationPolicyDecisionFunction function) 41 void PolicyCallback::set(const ResourceRequest& request, FormState* formState, NavigationPolicyDecisionFunction&& function) 51 42 { 52 43 m_request = request; … … 59 50 } 60 51 61 void PolicyCallback::set(const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& navigationAction, NewWindowPolicyDecisionFunction function)52 void PolicyCallback::set(const ResourceRequest& request, FormState* formState, const String& frameName, const NavigationAction& navigationAction, NewWindowPolicyDecisionFunction&& function) 62 53 { 63 54 m_request = request; … … 71 62 } 72 63 73 void PolicyCallback::set(ContentPolicyDecisionFunction function)64 void PolicyCallback::set(ContentPolicyDecisionFunction&& function) 74 65 { 75 66 m_request = ResourceRequest(); -
trunk/Source/WebCore/loader/PolicyCallback.h
r210216 r215918 34 34 #include "ResourceRequest.h" 35 35 #include <functional> 36 #include <wtf/Function.h> 36 37 #include <wtf/RefPtr.h> 37 38 #include <wtf/text/WTFString.h> … … 41 42 class FormState; 42 43 43 using ContentPolicyDecisionFunction = std::function<void(PolicyAction)>;44 using NavigationPolicyDecisionFunction = std::function<void(const ResourceRequest&, FormState*, bool shouldContinue)>;45 using NewWindowPolicyDecisionFunction = std::function<void(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, bool shouldContinue)>;44 using ContentPolicyDecisionFunction = Function<void(PolicyAction)>; 45 using NavigationPolicyDecisionFunction = Function<void(const ResourceRequest&, FormState*, bool shouldContinue)>; 46 using NewWindowPolicyDecisionFunction = Function<void(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, bool shouldContinue)>; 46 47 47 48 class PolicyCallback { 48 49 public: 49 void clear(); 50 void set(const ResourceRequest&, FormState*, NavigationPolicyDecisionFunction); 51 void set(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, NewWindowPolicyDecisionFunction); 52 void set(ContentPolicyDecisionFunction); 50 void set(const ResourceRequest&, FormState*, NavigationPolicyDecisionFunction&&); 51 void set(const ResourceRequest&, FormState*, const String& frameName, const NavigationAction&, NewWindowPolicyDecisionFunction&&); 52 void set(ContentPolicyDecisionFunction&&); 53 53 54 54 const ResourceRequest& request() const { return m_request; } -
trunk/Source/WebCore/loader/PolicyChecker.cpp
r213253 r215918 178 178 { 179 179 m_frame.loader().client().cancelPolicyCheck(); 180 m_callback .clear();180 m_callback = { }; 181 181 } 182 182 … … 184 184 { 185 185 m_frame.loader().client().cancelPolicyCheck(); 186 PolicyCallback callback = m_callback; 187 m_callback.clear(); 186 PolicyCallback callback = WTFMove(m_callback); 188 187 callback.cancel(); 189 188 } … … 203 202 void PolicyChecker::continueAfterNavigationPolicy(PolicyAction policy) 204 203 { 205 PolicyCallback callback = m_callback; 206 m_callback.clear(); 204 PolicyCallback callback = WTFMove(m_callback); 207 205 208 206 bool shouldContinue = policy == PolicyUse; … … 236 234 void PolicyChecker::continueAfterNewWindowPolicy(PolicyAction policy) 237 235 { 238 PolicyCallback callback = m_callback; 239 m_callback.clear(); 236 PolicyCallback callback = WTFMove(m_callback); 240 237 241 238 switch (policy) { … … 256 253 void PolicyChecker::continueAfterContentPolicy(PolicyAction policy) 257 254 { 258 PolicyCallback callback = m_callback; 259 m_callback.clear(); 255 PolicyCallback callback = WTFMove(m_callback); 260 256 callback.call(policy); 261 257 }
Note:
See TracChangeset
for help on using the changeset viewer.