Changeset 219871 in webkit
- Timestamp:
- Jul 25, 2017 10:17:55 AM (7 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r219866 r219871 1 2017-07-25 Alex Christensen <achristensen@webkit.org> 2 3 Modernize NavigationAction code 4 https://bugs.webkit.org/show_bug.cgi?id=174807 5 6 Reviewed by Darin Adler. 7 8 Mostly just use more move semantics. 9 10 * Platform/IPC/HandleMessage.h: 11 (IPC::callMemberFunctionImpl): 12 * Shared/API/APIURLRequest.h: 13 * Shared/NavigationActionData.h: 14 * UIProcess/API/APINavigation.cpp: 15 (API::Navigation::Navigation): 16 * UIProcess/API/APINavigation.h: 17 (API::Navigation::create): 18 * UIProcess/API/APINavigationAction.h: 19 * UIProcess/API/APINavigationClient.h: 20 (API::NavigationClient::decidePolicyForNavigationAction): 21 * UIProcess/API/APIPolicyClient.h: 22 * UIProcess/API/APIUIClient.h: 23 (API::UIClient::createNewPage): 24 (API::UIClient::createNewPageAsync): 25 (API::UIClient::canCreateNewPageAsync): 26 * UIProcess/API/C/WKPage.cpp: 27 (WKPageLoadURLRequest): 28 (WKPageLoadURLRequestWithUserData): 29 (WKPageSetPageUIClient): 30 (WKPageSetPageNavigationClient): 31 * UIProcess/Cocoa/NavigationState.h: 32 * UIProcess/Cocoa/NavigationState.mm: 33 (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction): 34 * UIProcess/Cocoa/UIDelegate.h: 35 * UIProcess/Cocoa/UIDelegate.mm: 36 (WebKit::UIDelegate::UIClient::createNewPageCommon): 37 (WebKit::UIDelegate::UIClient::createNewPage): 38 (WebKit::UIDelegate::UIClient::canCreateNewPageAsync): 39 (WebKit::UIDelegate::UIClient::createNewPageAsync): 40 * UIProcess/WebInspectorProxy.cpp: 41 (WebKit::decidePolicyForNavigationAction): 42 * UIProcess/WebNavigationState.cpp: 43 (WebKit::WebNavigationState::createLoadRequestNavigation): 44 * UIProcess/WebNavigationState.h: 45 * UIProcess/WebPageProxy.cpp: 46 (WebKit::WebPageProxy::loadRequest): 47 (WebKit::WebPageProxy::decidePolicyForNavigationAction): 48 (WebKit::WebPageProxy::decidePolicyForNewWindowAction): 49 (WebKit::WebPageProxy::createNewPage): 50 * UIProcess/WebPageProxy.h: 51 1 52 2017-07-25 Carlos Garcia Campos <cgarcia@igalia.com> 2 53 -
trunk/Source/WebKit/Platform/IPC/HandleMessage.h
r210887 r219871 66 66 void callMemberFunctionImpl(C* object, MF function, Ref<R>&& delayedReply, ArgsTuple&& args, std::index_sequence<ArgsIndex...>) 67 67 { 68 (object->*function)(std::get<ArgsIndex>( args)..., WTFMove(delayedReply));68 (object->*function)(std::get<ArgsIndex>(std::forward<ArgsTuple>(args))..., WTFMove(delayedReply)); 69 69 } 70 70 -
trunk/Source/WebKit/Shared/API/APIURLRequest.h
r204668 r219871 24 24 */ 25 25 26 #ifndef APIURLRequest_h 27 #define APIURLRequest_h 26 #pragma once 28 27 29 28 #include "APIObject.h" … … 60 59 61 60 } // namespace API 62 63 #endif // APIURLRequest_h -
trunk/Source/WebKit/Shared/NavigationActionData.h
r219304 r219871 24 24 */ 25 25 26 #ifndef NavigationActionData_h 27 #define NavigationActionData_h 26 #pragma once 28 27 29 28 #include "WebEvent.h" … … 54 53 55 54 } 56 57 #endif // NavigationActionData_h -
trunk/Source/WebKit/UIProcess/API/APINavigation.cpp
r178217 r219871 36 36 } 37 37 38 Navigation::Navigation(WebKit::WebNavigationState& state, const WebCore::ResourceRequest& request)38 Navigation::Navigation(WebKit::WebNavigationState& state, WebCore::ResourceRequest&& request) 39 39 : m_navigationID(state.generateNavigationID()) 40 , m_request( request)40 , m_request(WTFMove(request)) 41 41 { 42 42 } -
trunk/Source/WebKit/UIProcess/API/APINavigation.h
r178217 r219871 24 24 */ 25 25 26 #ifndef APINavigation_h 27 #define APINavigation_h 26 #pragma once 28 27 29 28 #include "APIObject.h" … … 44 43 } 45 44 46 static Ref<Navigation> create(WebKit::WebNavigationState& state, const WebCore::ResourceRequest& request)45 static Ref<Navigation> create(WebKit::WebNavigationState& state, WebCore::ResourceRequest&& request) 47 46 { 48 return adoptRef(*new Navigation(state, request));47 return adoptRef(*new Navigation(state, WTFMove(request))); 49 48 } 50 49 … … 57 56 private: 58 57 explicit Navigation(WebKit::WebNavigationState&); 59 explicit Navigation(WebKit::WebNavigationState&, const WebCore::ResourceRequest&);58 explicit Navigation(WebKit::WebNavigationState&, WebCore::ResourceRequest&&); 60 59 61 60 uint64_t m_navigationID; … … 64 63 65 64 } // namespace API 66 67 68 #endif // APINavigation_h -
trunk/Source/WebKit/UIProcess/API/APINavigationAction.h
r219304 r219871 24 24 */ 25 25 26 #ifndef APINavigationAction_h 27 #define APINavigationAction_h 26 #pragma once 28 27 29 28 #include "APIFrameInfo.h" … … 38 37 class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction> { 39 38 public: 40 static Ref<NavigationAction> create( const WebKit::NavigationActionData& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WebCore::ResourceRequest& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>userInitiatedAction)39 static Ref<NavigationAction> create(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, WebCore::ResourceRequest&& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction) 41 40 { 42 return adoptRef(*new NavigationAction(navigationActionData, sourceFrame, targetFrame, request, originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction))); 43 } 44 45 NavigationAction(const WebKit::NavigationActionData& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WebCore::ResourceRequest& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction> userInitiatedAction) 46 : m_sourceFrame(sourceFrame) 47 , m_targetFrame(targetFrame) 48 , m_request(request) 49 , m_originalURL(originalURL) 50 , m_shouldOpenAppLinks(shouldOpenAppLinks) 51 , m_userInitiatedAction(WTFMove(userInitiatedAction)) 52 , m_navigationActionData(navigationActionData) 53 { 41 return adoptRef(*new NavigationAction(WTFMove(navigationActionData), sourceFrame, targetFrame, WTFMove(request), originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction))); 54 42 } 55 43 … … 74 62 75 63 private: 64 NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, WebCore::ResourceRequest&& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction) 65 : m_sourceFrame(sourceFrame) 66 , m_targetFrame(targetFrame) 67 , m_request(WTFMove(request)) 68 , m_originalURL(originalURL) 69 , m_shouldOpenAppLinks(shouldOpenAppLinks) 70 , m_userInitiatedAction(WTFMove(userInitiatedAction)) 71 , m_navigationActionData(WTFMove(navigationActionData)) 72 { 73 } 74 76 75 RefPtr<FrameInfo> m_sourceFrame; 77 76 RefPtr<FrameInfo> m_targetFrame; … … 88 87 89 88 } // namespace API 90 91 #endif // APINavigationAction_h -
trunk/Source/WebKit/UIProcess/API/APINavigationClient.h
r219709 r219871 68 68 virtual ~NavigationClient() { } 69 69 70 virtual void didStartProvisionalNavigation(WebKit::WebPageProxy&, API::Navigation*, API::Object*) { }71 virtual void didReceiveServerRedirectForProvisionalNavigation(WebKit::WebPageProxy&, API::Navigation*, API::Object*) { }72 virtual void didPerformClientRedirectForNavigation(WebKit::WebPageProxy&, API::Navigation*) { }73 virtual void didFailProvisionalNavigationWithError(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, API::Navigation*, const WebCore::ResourceError&, API::Object*) { }74 virtual void didFailProvisionalLoadInSubframeWithError(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WebCore::SecurityOriginData&, API::Navigation*, const WebCore::ResourceError&, API::Object*) { }75 virtual void didCommitNavigation(WebKit::WebPageProxy&, API::Navigation*, API::Object*) { }76 virtual void didFinishDocumentLoad(WebKit::WebPageProxy&, API::Navigation*, API::Object*) { }77 virtual void didFinishNavigation(WebKit::WebPageProxy&, API::Navigation*, API::Object*) { }78 virtual void didFailNavigationWithError(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, API::Navigation*, const WebCore::ResourceError&, API::Object*) { }79 virtual void didSameDocumentNavigation(WebKit::WebPageProxy&, API::Navigation*, WebKit::SameDocumentNavigationType, API::Object*) { }70 virtual void didStartProvisionalNavigation(WebKit::WebPageProxy&, Navigation*, Object*) { } 71 virtual void didReceiveServerRedirectForProvisionalNavigation(WebKit::WebPageProxy&, Navigation*, Object*) { } 72 virtual void didPerformClientRedirectForNavigation(WebKit::WebPageProxy&, Navigation*) { } 73 virtual void didFailProvisionalNavigationWithError(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, Navigation*, const WebCore::ResourceError&, Object*) { } 74 virtual void didFailProvisionalLoadInSubframeWithError(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, const WebCore::SecurityOriginData&, Navigation*, const WebCore::ResourceError&, Object*) { } 75 virtual void didCommitNavigation(WebKit::WebPageProxy&, Navigation*, Object*) { } 76 virtual void didFinishDocumentLoad(WebKit::WebPageProxy&, Navigation*, Object*) { } 77 virtual void didFinishNavigation(WebKit::WebPageProxy&, Navigation*, Object*) { } 78 virtual void didFailNavigationWithError(WebKit::WebPageProxy&, WebKit::WebFrameProxy&, Navigation*, const WebCore::ResourceError&, Object*) { } 79 virtual void didSameDocumentNavigation(WebKit::WebPageProxy&, Navigation*, WebKit::SameDocumentNavigationType, Object*) { } 80 80 81 81 virtual void renderingProgressDidChange(WebKit::WebPageProxy&, WebCore::LayoutMilestones) { } … … 96 96 #endif 97 97 98 virtual void decidePolicyForNavigationAction(WebKit::WebPageProxy&, API::NavigationAction&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)98 virtual void decidePolicyForNavigationAction(WebKit::WebPageProxy&, Ref<NavigationAction>&&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, Object*) 99 99 { 100 100 listener->use({ }); 101 101 } 102 102 103 virtual void decidePolicyForNavigationResponse(WebKit::WebPageProxy&, API::NavigationResponse&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object*)103 virtual void decidePolicyForNavigationResponse(WebKit::WebPageProxy&, NavigationResponse&, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, Object*) 104 104 { 105 105 listener->use({ }); … … 107 107 108 108 #if ENABLE(NETSCAPE_PLUGIN_API) 109 virtual WebKit::PluginModuleLoadPolicy decidePolicyForPluginLoad(WebKit::WebPageProxy&, WebKit::PluginModuleLoadPolicy currentPluginLoadPolicy, API::Dictionary*, WTF::String&)109 virtual WebKit::PluginModuleLoadPolicy decidePolicyForPluginLoad(WebKit::WebPageProxy&, WebKit::PluginModuleLoadPolicy currentPluginLoadPolicy, Dictionary*, WTF::String&) 110 110 { 111 111 return currentPluginLoadPolicy; -
trunk/Source/WebKit/UIProcess/API/APIPolicyClient.h
r209604 r219871 24 24 */ 25 25 26 #ifndef APIPolicyClient_h 27 #define APIPolicyClient_h 26 #pragma once 28 27 29 28 #include "WebEvent.h" … … 69 68 70 69 } // namespace API 71 72 #endif // APIPolicyClient_h -
trunk/Source/WebKit/UIProcess/API/APIUIClient.h
r219013 r219871 73 73 virtual ~UIClient() { } 74 74 75 virtual RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&) { return nullptr; } 76 virtual bool createNewPageAsync(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) { return false; } 75 virtual RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&) { return nullptr; } 76 virtual void createNewPageAsync(WebKit::WebPageProxy*, FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&, WTF::Function<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler) { } 77 virtual bool canCreateNewPageAsync() { return false; } 77 78 virtual void showPage(WebKit::WebPageProxy*) { } 78 79 virtual void fullscreenMayReturnToInline(WebKit::WebPageProxy*) { } … … 91 92 92 93 virtual void setStatusText(WebKit::WebPageProxy*, const WTF::String&) { } 93 virtual void mouseDidMoveOverElement(WebKit::WebPageProxy*, const WebKit::WebHitTestResultData&, WebKit::WebEvent::Modifiers, API::Object*) { }94 virtual void mouseDidMoveOverElement(WebKit::WebPageProxy*, const WebKit::WebHitTestResultData&, WebKit::WebEvent::Modifiers, Object*) { } 94 95 #if ENABLE(NETSCAPE_PLUGIN_API) 95 virtual void unavailablePluginButtonClicked(WebKit::WebPageProxy*, WKPluginUnavailabilityReason, API::Dictionary*) { }96 virtual void unavailablePluginButtonClicked(WebKit::WebPageProxy*, WKPluginUnavailabilityReason, Dictionary*) { } 96 97 #endif // ENABLE(NETSCAPE_PLUGIN_API) 97 98 … … 145 146 virtual void runModal(WebKit::WebPageProxy*) { } 146 147 147 virtual void saveDataToFileInDownloadsFolder(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, const WTF::String&, API::Data*) { }148 virtual void saveDataToFileInDownloadsFolder(WebKit::WebPageProxy*, const WTF::String&, const WTF::String&, const WTF::String&, Data*) { } 148 149 149 150 virtual void pinnedStateDidChange(WebKit::WebPageProxy&) { } … … 174 175 #endif 175 176 176 virtual void didClickAutoFillButton(WebKit::WebPageProxy&, API::Object*) { }177 virtual void didClickAutoFillButton(WebKit::WebPageProxy&, Object*) { } 177 178 178 179 virtual void imageOrMediaDocumentSizeChanged(const WebCore::IntSize&) { } -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r219106 r219871 168 168 void WKPageLoadURLRequest(WKPageRef pageRef, WKURLRequestRef urlRequestRef) 169 169 { 170 toImpl(pageRef)->loadRequest(toImpl(urlRequestRef)->resourceRequest()); 170 auto resourceRequest = toImpl(urlRequestRef)->resourceRequest(); 171 toImpl(pageRef)->loadRequest(WTFMove(resourceRequest)); 171 172 } 172 173 173 174 void WKPageLoadURLRequestWithUserData(WKPageRef pageRef, WKURLRequestRef urlRequestRef, WKTypeRef userDataRef) 174 175 { 175 toImpl(pageRef)->loadRequest(toImpl(urlRequestRef)->resourceRequest(), ShouldOpenExternalURLsPolicy::ShouldNotAllow, toImpl(userDataRef)); 176 auto resourceRequest = toImpl(urlRequestRef)->resourceRequest(); 177 toImpl(pageRef)->loadRequest(WTFMove(resourceRequest), ShouldOpenExternalURLsPolicy::ShouldNotAllow, toImpl(userDataRef)); 176 178 } 177 179 … … 1564 1566 1565 1567 private: 1566 RefPtr<WebPageProxy> createNewPage(WebPageProxy* page, API::FrameInfo& sourceFrameInfo, const ResourceRequest& resourceRequest, const WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData) override1568 RefPtr<WebPageProxy> createNewPage(WebPageProxy* page, API::FrameInfo& sourceFrameInfo, ResourceRequest&& resourceRequest, const WindowFeatures& windowFeatures, NavigationActionData&& navigationActionData) final 1567 1569 { 1568 1570 if (m_client.createNewPage) { … … 1572 1574 auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 1573 1575 bool shouldOpenAppLinks = !hostsAreEqual(sourceFrameInfo.request().url(), resourceRequest.url()); 1574 auto apiNavigationAction = API::NavigationAction::create( navigationActionData, &sourceFrameInfo, nullptr, resourceRequest, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);1576 auto apiNavigationAction = API::NavigationAction::create(WTFMove(navigationActionData), &sourceFrameInfo, nullptr, WTFMove(resourceRequest), WebCore::URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity)); 1575 1577 1576 1578 auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures); … … 2158 2160 2159 2161 private: 2160 void decidePolicyForNavigationAction(WebPageProxy& page, API::NavigationAction& navigationAction, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object* userData) override2162 void decidePolicyForNavigationAction(WebPageProxy& page, Ref<API::NavigationAction>&& navigationAction, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object* userData) final 2161 2163 { 2162 2164 if (!m_client.decidePolicyForNavigationAction) { … … 2164 2166 return; 2165 2167 } 2166 m_client.decidePolicyForNavigationAction(toAPI(&page), toAPI( &navigationAction), toAPI(listener.ptr()), toAPI(userData), m_client.base.clientInfo);2168 m_client.decidePolicyForNavigationAction(toAPI(&page), toAPI(navigationAction.ptr()), toAPI(listener.ptr()), toAPI(userData), m_client.base.clientInfo); 2167 2169 } 2168 2170 -
trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp
r219018 r219871 47 47 48 48 private: 49 RefPtr<WebPageProxy> createNewPage(WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest& resourceRequest, const WebCore::WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData) override49 RefPtr<WebPageProxy> createNewPage(WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&& resourceRequest, const WebCore::WindowFeatures& windowFeatures, NavigationActionData&& navigationActionData) override 50 50 { 51 51 GRefPtr<WebKitURIRequest> request = adoptGRef(webkitURIRequestCreateForResourceRequest(resourceRequest)); -
trunk/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp
r219106 r219871 2505 2505 ResourceRequest resourceRequest; 2506 2506 webkitURIRequestGetResourceRequest(request, resourceRequest); 2507 getPage(webView).loadRequest( resourceRequest);2507 getPage(webView).loadRequest(WTFMove(resourceRequest)); 2508 2508 } 2509 2509 -
trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.h
r219709 r219871 116 116 #endif 117 117 118 void decidePolicyForNavigationAction(WebPageProxy&, API::NavigationAction&, Ref<WebFramePolicyListenerProxy>&&, API::Object* userData) override;118 void decidePolicyForNavigationAction(WebPageProxy&, Ref<API::NavigationAction>&&, Ref<WebFramePolicyListenerProxy>&&, API::Object* userData) override; 119 119 void decidePolicyForNavigationResponse(WebPageProxy&, API::NavigationResponse&, Ref<WebFramePolicyListenerProxy>&&, API::Object* userData) override; 120 120 -
trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm
r219709 r219871 305 305 } 306 306 307 void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageProxy& webPageProxy, API::NavigationAction& navigationAction, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData)307 void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageProxy& webPageProxy, Ref<API::NavigationAction>&& navigationAction, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData) 308 308 { 309 309 String mainFrameURLString = webPageProxy.mainFrame()->url(); … … 311 311 if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler 312 312 && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies) { 313 Ref Ptr<API::NavigationAction> localNavigationAction = &navigationAction;313 Ref<API::NavigationAction> localNavigationAction = navigationAction.copyRef(); 314 314 RefPtr<WebFramePolicyListenerProxy> localListener = WTFMove(listener); 315 315 316 tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [webPage = RefPtr<WebPageProxy>(&webPageProxy), localListener, localNavigationAction = RefPtr<API::NavigationAction>(&navigationAction)] (bool followedLinkToApp) {316 tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [webPage = RefPtr<WebPageProxy>(&webPageProxy), localListener, localNavigationAction = navigationAction.copyRef()] (bool followedLinkToApp) { 317 317 if (followedLinkToApp) { 318 318 localListener->ignore(); … … 354 354 RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:)); 355 355 356 auto decisionHandlerWithPolicies = [localListener = RefPtr<WebFramePolicyListenerProxy>(WTFMove(listener)), localNavigationAction = RefPtr<API::NavigationAction>(&navigationAction), checker = WTFMove(checker), mainFrameURLString](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {356 auto decisionHandlerWithPolicies = [localListener = RefPtr<WebFramePolicyListenerProxy>(WTFMove(listener)), localNavigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable { 357 357 if (checker->completionHandlerHasBeenCalled()) 358 358 return; … … 394 394 395 395 if (delegateHasWebsitePolicies) 396 [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler: decisionHandlerWithPolicies];396 [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:BlockPtr<void(WKNavigationActionPolicy, _WKWebsitePolicies *)>::fromCallable(WTFMove(decisionHandlerWithPolicies)).get()]; 397 397 else { 398 auto decisionHandlerWithoutPolicies = [decisionHandlerWithPolicies ] (WKNavigationActionPolicy actionPolicy) mutable {398 auto decisionHandlerWithoutPolicies = [decisionHandlerWithPolicies = WTFMove(decisionHandlerWithPolicies)] (WKNavigationActionPolicy actionPolicy) mutable { 399 399 decisionHandlerWithPolicies(actionPolicy, nil); 400 400 }; 401 [navigationDelegate webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler: decisionHandlerWithoutPolicies];401 [navigationDelegate webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:BlockPtr<void(WKNavigationActionPolicy)>::fromCallable(WTFMove(decisionHandlerWithoutPolicies)).get()]; 402 402 } 403 403 } -
trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h
r219013 r219871 80 80 private: 81 81 // API::UIClient 82 RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&) override; 83 bool createNewPageAsync(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) override; 84 RefPtr<WebKit::WebPageProxy> createNewPageCommon(WebKit::WebPageProxy*, API::FrameInfo&, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const WebKit::NavigationActionData&, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler); 82 RefPtr<WebKit::WebPageProxy> createNewPage(WebKit::WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&) override; 83 void createNewPageAsync(WebKit::WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&, WTF::Function<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler) final; 84 bool canCreateNewPageAsync() final; 85 RefPtr<WebKit::WebPageProxy> createNewPageCommon(WebKit::WebPageProxy*, API::FrameInfo&, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, WebKit::NavigationActionData&&, WTF::Function<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler); 85 86 86 87 void close(WebKit::WebPageProxy*) override; -
trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm
r219191 r219871 175 175 } 176 176 177 RefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPageCommon(WebKit::WebPageProxy* page, API::FrameInfo& sourceFrameInfo, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler)177 RefPtr<WebKit::WebPageProxy> UIDelegate::UIClient::createNewPageCommon(WebKit::WebPageProxy* page, API::FrameInfo& sourceFrameInfo, WebCore::ResourceRequest&& request, const WebCore::WindowFeatures& windowFeatures, WebKit::NavigationActionData&& navigationActionData, WTF::Function<void(RefPtr<WebKit::WebPageProxy>&&)>&& completionHandler) 178 178 { 179 179 auto delegate = m_uiDelegate.m_delegate.get(); … … 185 185 auto userInitiatedActivity = page->process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 186 186 bool shouldOpenAppLinks = !hostsAreEqual(sourceFrameInfo.request().url(), request.url()); 187 auto apiNavigationAction = API::NavigationAction::create( navigationActionData, &sourceFrameInfo, nullptr, request, WebCore::URL(), shouldOpenAppLinks, userInitiatedActivity);187 auto apiNavigationAction = API::NavigationAction::create(WTFMove(navigationActionData), &sourceFrameInfo, nullptr, WTFMove(request), WebCore::URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity)); 188 188 189 189 auto apiWindowFeatures = API::WindowFeatures::create(windowFeatures); … … 222 222 } 223 223 224 RefPtr<Web Kit::WebPageProxy> UIDelegate::UIClient::createNewPage(WebKit::WebPageProxy* page, API::FrameInfo& originatingFrameInfo, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData)224 RefPtr<WebPageProxy> UIDelegate::UIClient::createNewPage(WebPageProxy* page, API::FrameInfo& originatingFrameInfo, WebCore::ResourceRequest&& request, const WebCore::WindowFeatures& windowFeatures, NavigationActionData&& navigationActionData) 225 225 { 226 226 if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeatures) … … 231 231 return nullptr; 232 232 233 return createNewPageCommon(page, originatingFrameInfo, request, windowFeatures, navigationActionData, nullptr); 234 } 235 236 bool UIDelegate::UIClient::createNewPageAsync(WebKit::WebPageProxy* page, API::FrameInfo& originatingFrameInfo, const WebCore::ResourceRequest& request, const WebCore::WindowFeatures& windowFeatures, const WebKit::NavigationActionData& navigationActionData, WTF::Function<void (RefPtr<WebKit::WebPageProxy>)>&& completionHandler) 237 { 238 if (!m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeaturesAsync) 239 return false; 240 241 auto delegate = m_uiDelegate.m_delegate.get(); 242 if (!delegate) 243 return false; 244 245 createNewPageCommon(page, originatingFrameInfo, request, windowFeatures, navigationActionData, WTFMove(completionHandler)); 246 247 return true; 233 return createNewPageCommon(page, originatingFrameInfo, WTFMove(request), windowFeatures, WTFMove(navigationActionData), nullptr); 234 } 235 236 bool UIDelegate::UIClient::canCreateNewPageAsync() 237 { 238 return m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeaturesAsync 239 && m_uiDelegate.m_delegate.get(); 240 } 241 242 void UIDelegate::UIClient::createNewPageAsync(WebPageProxy* page, API::FrameInfo& originatingFrameInfo, WebCore::ResourceRequest&& request, const WebCore::WindowFeatures& windowFeatures, NavigationActionData&& navigationActionData, WTF::Function<void(RefPtr<WebPageProxy>&&)>&& completionHandler) 243 { 244 ASSERT(canCreateNewPageAsync()); 245 ASSERT(m_uiDelegate.m_delegateMethods.webViewCreateWebViewWithConfigurationForNavigationActionWindowFeaturesAsync); 246 247 auto delegate = m_uiDelegate.m_delegate.get(); 248 ASSERT(delegate); 249 250 createNewPageCommon(page, originatingFrameInfo, WTFMove(request), windowFeatures, WTFMove(navigationActionData), WTFMove(completionHandler)); 248 251 } 249 252 -
trunk/Source/WebKit/UIProcess/WebInspectorProxy.cpp
r219595 r219871 359 359 360 360 // And instead load it in the inspected page. 361 webInspectorProxy->inspectedPage()->loadRequest( request);361 webInspectorProxy->inspectedPage()->loadRequest(WTFMove(request)); 362 362 } 363 363 -
trunk/Source/WebKit/UIProcess/WebNavigationState.cpp
r178217 r219871 41 41 } 42 42 43 Ref<API::Navigation> WebNavigationState::createLoadRequestNavigation( const WebCore::ResourceRequest& request)43 Ref<API::Navigation> WebNavigationState::createLoadRequestNavigation(WebCore::ResourceRequest&& request) 44 44 { 45 auto navigation = API::Navigation::create(*this, request);45 auto navigation = API::Navigation::create(*this, WTFMove(request)); 46 46 47 47 m_navigations.set(navigation->navigationID(), navigation.ptr()); -
trunk/Source/WebKit/UIProcess/WebNavigationState.h
r178217 r219871 24 24 */ 25 25 26 #ifndef WebNavigationState_h 27 #define WebNavigationState_h 26 #pragma once 28 27 29 28 #include <wtf/HashMap.h> … … 49 48 50 49 Ref<API::Navigation> createBackForwardNavigation(); 51 Ref<API::Navigation> createLoadRequestNavigation( const WebCore::ResourceRequest&);50 Ref<API::Navigation> createLoadRequestNavigation(WebCore::ResourceRequest&&); 52 51 Ref<API::Navigation> createReloadNavigation(); 53 52 Ref<API::Navigation> createLoadDataNavigation(); … … 69 68 70 69 } // namespace WebKit 71 72 #endif // WebNavigationState_h -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r219722 r219871 820 820 #endif 821 821 822 RefPtr<API::Navigation> WebPageProxy::loadRequest( const ResourceRequest& request, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, API::Object* userData)822 RefPtr<API::Navigation> WebPageProxy::loadRequest(ResourceRequest&& request, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, API::Object* userData) 823 823 { 824 824 if (m_isClosed) 825 825 return nullptr; 826 826 827 auto navigation = m_navigationState->createLoadRequestNavigation( request);827 auto navigation = m_navigationState->createLoadRequestNavigation(ResourceRequest(request)); 828 828 829 829 auto transaction = m_pageLoadState.transaction(); 830 830 831 m_pageLoadState.setPendingAPIRequestURL(transaction, request.url()); 831 auto url = request.url(); 832 m_pageLoadState.setPendingAPIRequestURL(transaction, url); 832 833 833 834 if (!isValid()) … … 836 837 LoadParameters loadParameters; 837 838 loadParameters.navigationID = navigation->navigationID(); 838 loadParameters.request = request;839 loadParameters.request = WTFMove(request); 839 840 loadParameters.shouldOpenExternalURLsPolicy = (uint64_t)shouldOpenExternalURLsPolicy; 840 841 loadParameters.userData = UserData(process().transformObjectsToHandles(userData).get()); 841 bool createdExtension = maybeInitializeSandboxExtensionHandle( request.url(), loadParameters.sandboxExtensionHandle);842 bool createdExtension = maybeInitializeSandboxExtensionHandle(url, loadParameters.sandboxExtensionHandle); 842 843 if (createdExtension) 843 844 m_process->willAcquireUniversalFileReadSandboxExtension(); … … 3618 3619 } 3619 3620 3620 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&& reply)3621 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, ResourceRequest&& request, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&& reply) 3621 3622 { 3622 3623 PageClientProtector protector(m_pageClient); … … 3636 3637 Ref<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID); 3637 3638 if (!navigationID && frame->isMainFrame()) { 3638 auto navigation = m_navigationState->createLoadRequestNavigation( request);3639 auto navigation = m_navigationState->createLoadRequestNavigation(ResourceRequest(request)); 3639 3640 m_newNavigationID = navigation->navigationID(); 3640 3641 listener->setNavigation(WTFMove(navigation)); … … 3657 3658 3658 3659 if (m_navigationClient) { 3659 RefPtr<API::FrameInfo>destinationFrameInfo = API::FrameInfo::create(*frame, frameSecurityOrigin.securityOrigin());3660 auto destinationFrameInfo = API::FrameInfo::create(*frame, frameSecurityOrigin.securityOrigin()); 3660 3661 RefPtr<API::FrameInfo> sourceFrameInfo; 3661 3662 if (!fromAPI && originatingFrame == frame) 3662 sourceFrameInfo = destinationFrameInfo ;3663 sourceFrameInfo = destinationFrameInfo.copyRef(); 3663 3664 else if (!fromAPI) 3664 3665 sourceFrameInfo = API::FrameInfo::create(originatingFrameInfoData, originatingPageID ? m_process->webPage(originatingPageID) : nullptr); 3665 3666 3666 3667 auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 3667 bool shouldOpenAppLinks = !m_shouldSuppressAppLinksInNextNavigationPolicyDecision && (!destinationFrameInfo || destinationFrameInfo->isMainFrame()) && !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url()) && navigationActionData.navigationType != WebCore::NavigationType::BackForward;3668 3669 auto navigationAction = API::NavigationAction::create( navigationActionData, sourceFrameInfo.get(), destinationFrameInfo.get(), request, originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));3670 3671 m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());3668 bool shouldOpenAppLinks = !m_shouldSuppressAppLinksInNextNavigationPolicyDecision && destinationFrameInfo->isMainFrame() && !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url()) && navigationActionData.navigationType != WebCore::NavigationType::BackForward; 3669 3670 auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), destinationFrameInfo.ptr(), WTFMove(request), originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity)); 3671 3672 m_navigationClient->decidePolicyForNavigationAction(*this, WTFMove(navigationAction), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get()); 3672 3673 } else 3673 m_policyClient->decidePolicyForNavigationAction(*this, frame, navigationActionData, originatingFrame, originalRequest, request, WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());3674 m_policyClient->decidePolicyForNavigationAction(*this, frame, WTFMove(navigationActionData), originatingFrame, originalRequest, WTFMove(request), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get()); 3674 3675 3675 3676 m_shouldSuppressAppLinksInNextNavigationPolicyDecision = false; 3676 3677 } 3677 3678 3678 void WebPageProxy::decidePolicyForNewWindowAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, const NavigationActionData& navigationActionData, const ResourceRequest& request, const String& frameName, uint64_t listenerID, const UserData& userData)3679 void WebPageProxy::decidePolicyForNewWindowAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, NavigationActionData&& navigationActionData, ResourceRequest&& request, const String& frameName, uint64_t listenerID, const UserData& userData) 3679 3680 { 3680 3681 PageClientProtector protector(m_pageClient); … … 3693 3694 auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier); 3694 3695 bool shouldOpenAppLinks = !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url()); 3695 auto navigationAction = API::NavigationAction::create( navigationActionData, sourceFrameInfo.get(), nullptr, request, request.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));3696 auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), nullptr, WTFMove(request), request.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity)); 3696 3697 3697 3698 m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get()); … … 3833 3834 // UIClient 3834 3835 3835 void WebPageProxy::createNewPage(const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const ResourceRequest& request, const WindowFeatures& windowFeatures, const NavigationActionData& navigationActionData, RefPtr<Messages::WebPageProxy::CreateNewPage::DelayedReply>reply)3836 void WebPageProxy::createNewPage(const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, ResourceRequest&& request, const WindowFeatures& windowFeatures, NavigationActionData&& navigationActionData, Ref<Messages::WebPageProxy::CreateNewPage::DelayedReply>&& reply) 3836 3837 { 3837 3838 MESSAGE_CHECK(m_process->webFrame(originatingFrameInfoData.frameID)); … … 3853 3854 }; 3854 3855 3855 if (m_uiClient->createNewPageAsync(this, originatingFrameInfo, request, windowFeatures, navigationActionData, [completionHandler](RefPtr<WebPageProxy> newPage) { completionHandler(newPage); })) 3856 return; 3857 3858 RefPtr<WebPageProxy> newPage = m_uiClient->createNewPage(this, originatingFrameInfo, request, windowFeatures, navigationActionData); 3856 if (m_uiClient->canCreateNewPageAsync()) { 3857 m_uiClient->createNewPageAsync(this, originatingFrameInfo, WTFMove(request), windowFeatures, WTFMove(navigationActionData), [completionHandler = WTFMove(completionHandler)](RefPtr<WebPageProxy> newPage) { 3858 completionHandler(newPage); 3859 }); 3860 } 3861 3862 RefPtr<WebPageProxy> newPage = m_uiClient->createNewPage(this, originatingFrameInfo, WTFMove(request), windowFeatures, WTFMove(navigationActionData)); 3859 3863 completionHandler(WTFMove(newPage)); 3860 3864 } -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r219709 r219871 392 392 393 393 void addPlatformLoadParameters(LoadParameters&); 394 RefPtr<API::Navigation> loadRequest( const WebCore::ResourceRequest&, WebCore::ShouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, API::Object* userData = nullptr);394 RefPtr<API::Navigation> loadRequest(WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, API::Object* userData = nullptr); 395 395 RefPtr<API::Navigation> loadFile(const String& fileURL, const String& resourceDirectoryURL, API::Object* userData = nullptr); 396 396 RefPtr<API::Navigation> loadData(API::Data*, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData = nullptr); … … 1277 1277 void didDestroyNavigation(uint64_t navigationID); 1278 1278 1279 void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&&);1280 void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&);1279 void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&&); 1280 void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, NavigationActionData&&, WebCore::ResourceRequest&&, const String& frameName, uint64_t listenerID, const UserData&); 1281 1281 void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&); 1282 1282 void decidePolicyForResponseSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply>&&); … … 1292 1292 1293 1293 // UI client 1294 void createNewPage(const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest&, const WebCore::WindowFeatures&, const NavigationActionData&, RefPtr<Messages::WebPageProxy::CreateNewPage::DelayedReply>);1294 void createNewPage(const FrameInfoData&, uint64_t originatingPageID, WebCore::ResourceRequest&&, const WebCore::WindowFeatures&, NavigationActionData&&, Ref<Messages::WebPageProxy::CreateNewPage::DelayedReply>&&); 1295 1295 void showPage(); 1296 1296 void runJavaScriptAlert(uint64_t frameID, const WebCore::SecurityOriginData&, const String&, Ref<Messages::WebPageProxy::RunJavaScriptAlert::DelayedReply>&&);
Note: See TracChangeset
for help on using the changeset viewer.