Changeset 234052 in webkit


Ignore:
Timestamp:
Jul 20, 2018 10:33:28 AM (6 years ago)
Author:
beidson@apple.com
Message:

Add WKNavigation/WKNavigationAction related SPI.
https://bugs.webkit.org/show_bug.cgi?id=187826

Reviewed by Chris Dumez.

Source/WebKit:

  • UIProcess/API/APINavigationAction.h:
  • UIProcess/API/C/mac/WKPagePrivateMac.h:
  • UIProcess/API/C/mac/WKPagePrivateMac.mm:

(WKPageLoadURLRequestReturningNavigation):

  • UIProcess/API/Cocoa/WKNavigationAction.mm:

(-[WKNavigationAction _mainFrameNavigation]):

  • UIProcess/API/Cocoa/WKNavigationActionPrivate.h:
  • UIProcess/API/glib/WebKitUIClient.cpp:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::WebPageProxy::decidePolicyForNewWindowAction):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm:

(-[NavigationActionHasNavigationDelegate webView:didFinishNavigation:]):
(-[NavigationActionHasNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
(TEST):

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r234038 r234052  
     12018-07-20  Brady Eidson  <beidson@apple.com>
     2
     3        Add WKNavigation/WKNavigationAction related SPI.
     4        https://bugs.webkit.org/show_bug.cgi?id=187826
     5
     6        Reviewed by Chris Dumez.
     7
     8        * UIProcess/API/APINavigationAction.h:
     9
     10        * UIProcess/API/C/mac/WKPagePrivateMac.h:
     11        * UIProcess/API/C/mac/WKPagePrivateMac.mm:
     12        (WKPageLoadURLRequestReturningNavigation):
     13
     14        * UIProcess/API/Cocoa/WKNavigationAction.mm:
     15        (-[WKNavigationAction _mainFrameNavigation]):
     16        * UIProcess/API/Cocoa/WKNavigationActionPrivate.h:
     17
     18        * UIProcess/API/glib/WebKitUIClient.cpp:
     19
     20        * UIProcess/WebPageProxy.cpp:
     21        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     22        (WebKit::WebPageProxy::decidePolicyForNewWindowAction):
     23
    1242018-07-20  Philippe Normand  <pnormand@igalia.com>
    225
  • trunk/Source/WebKit/UIProcess/API/APINavigationAction.h

    r224677 r234052  
    2727
    2828#include "APIFrameInfo.h"
     29#include "APINavigation.h"
    2930#include "APIObject.h"
    3031#include "APIUserInitiatedAction.h"
     
    3738class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction> {
    3839public:
    39     static Ref<NavigationAction> create(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, std::optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction)
     40    template<typename... Args> static Ref<NavigationAction> create(Args&&... args)
    4041    {
    41         return adoptRef(*new NavigationAction(WTFMove(navigationActionData), sourceFrame, targetFrame, targetFrameName, WTFMove(request), originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction)));
     42        return adoptRef(*new NavigationAction(std::forward<Args>(args)...));
    4243    }
    4344
     
    6364    UserInitiatedAction* userInitiatedAction() const { return m_userInitiatedAction.get(); }
    6465
     66    Navigation* mainFrameNavigation() const { return m_mainFrameNavigation.get(); }
     67
    6568private:
    66 NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, std::optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction)
     69    NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, std::optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction, API::Navigation* mainFrameNavigation)
    6770        : m_sourceFrame(sourceFrame)
    6871        , m_targetFrame(targetFrame)
     
    7376        , m_userInitiatedAction(WTFMove(userInitiatedAction))
    7477        , m_navigationActionData(WTFMove(navigationActionData))
     78        , m_mainFrameNavigation(mainFrameNavigation)
     79    {
     80    }
     81
     82    NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, std::optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WebCore::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction)
     83        : NavigationAction(WTFMove(navigationActionData), sourceFrame, targetFrame, targetFrameName, WTFMove(request), originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction), nullptr)
    7584    {
    7685    }
     
    8897
    8998    WebKit::NavigationActionData m_navigationActionData;
     99    RefPtr<Navigation> m_mainFrameNavigation;
    90100};
    91101
  • trunk/Source/WebKit/UIProcess/API/C/mac/WKPagePrivateMac.h

    r213112 r234052  
    6060WK_EXPORT id <_WKFullscreenDelegate> WKPageGetFullscreenDelegate(WKPageRef page);
    6161
     62#if !TARGET_OS_IPHONE && (defined(__clang__) && defined(__APPLE__) && !defined(__i386__))
     63@class WKNavigation;
     64WK_EXPORT WKNavigation *WKPageLoadURLRequestReturningNavigation(WKPageRef page, WKURLRequestRef request);
    6265#endif
     66
     67#endif // __OBJC__
    6368
    6469WK_EXPORT bool WKPageIsURLKnownHSTSHost(WKPageRef page, WKURLRef url);
  • trunk/Source/WebKit/UIProcess/API/C/mac/WKPagePrivateMac.mm

    r224558 r234052  
    3131#import "WKAPICast.h"
    3232#import "WKNSURLExtras.h"
     33#import "WKNavigationInternal.h"
    3334#import "WKViewInternal.h"
    3435#import "WebPageGroup.h"
     
    139140}
    140141
     142#if !TARGET_OS_IPHONE && (defined(__clang__) && defined(__APPLE__) && !defined(__i386__))
     143WKNavigation *WKPageLoadURLRequestReturningNavigation(WKPageRef pageRef, WKURLRequestRef urlRequestRef)
     144{
     145    auto resourceRequest = toImpl(urlRequestRef)->resourceRequest();
     146    auto navigation = toImpl(pageRef)->loadRequest(WTFMove(resourceRequest));
     147
     148    if (!navigation)
     149        return nil;
     150
     151    return [API::wrapper(*navigation.leakRef()) autorelease];
     152}
     153#endif
     154
    141155#if PLATFORM(MAC)
    142156bool WKPageIsPlayingVideoInEnhancedFullscreen(WKPageRef pageRef)
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm

    r233668 r234052  
    3131#import "NavigationActionData.h"
    3232#import "WKFrameInfoInternal.h"
     33#import "WKNavigationInternal.h"
    3334#import "_WKUserInitiatedActionInternal.h"
    3435#import <WebCore/FloatPoint.h>
     
    237238}
    238239
     240- (WKNavigation *)_mainFrameNavigation
     241{
     242    if (auto* navigation = _navigationAction->mainFrameNavigation())
     243        return wrapper(*navigation);
     244   
     245    return nil;
     246}
     247
    239248@end
    240249
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h

    r221930 r234052  
    2828#if WK_API_ENABLED
    2929
     30@class WKNavigation;
    3031@class _WKUserInitiatedAction;
    3132
     
    5657
    5758@property (nonatomic, readonly) BOOL _isRedirect WK_API_AVAILABLE(macosx(10.13), ios(11.0));
     59@property (nonatomic, readonly) WKNavigation *_mainFrameNavigation WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    5860
    5961@end
  • trunk/Source/WebKit/UIProcess/API/glib/WebKitUIClient.cpp

    r227670 r234052  
    5151    {
    5252        auto userInitiatedActivity = page.process().userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    53         WebKitNavigationAction navigationAction(API::NavigationAction::create(WTFMove(navigationActionData), frameInfo.ptr(), nullptr, std::nullopt, WTFMove(resourceRequest), { }, false, WTFMove(userInitiatedActivity)));
     53        WebKitNavigationAction navigationAction(API::NavigationAction::create(WTFMove(navigationActionData), frameInfo.ptr(), nullptr, std::nullopt, WTFMove(resourceRequest), WebCore::URL { }, false, WTFMove(userInitiatedActivity)));
    5454        completionHandler(webkitWebViewCreateNewPage(m_webView, windowFeatures, &navigationAction));
    5555    }
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r233986 r234052  
    40234023
    40244024    auto listener = makeRef(frame->setUpPolicyListenerProxy(listenerID, PolicyListenerType::NavigationAction));
     4025
     4026    API::Navigation* mainFrameNavigation = frame->isMainFrame() ? navigation.get() : nullptr;
    40254027    listener->setNavigation(navigation.releaseNonNull());
    40264028
     
    40484050        bool shouldOpenAppLinks = !m_shouldSuppressAppLinksInNextNavigationPolicyDecision && destinationFrameInfo->isMainFrame() && !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url()) && navigationActionData.navigationType != WebCore::NavigationType::BackForward;
    40494051
    4050         auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), destinationFrameInfo.ptr(), std::nullopt, WTFMove(request), originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
     4052        auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), destinationFrameInfo.ptr(), std::nullopt, WTFMove(request), originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity), mainFrameNavigation);
    40514053
    40524054        m_navigationClient->decidePolicyForNavigationAction(*this, WTFMove(navigationAction), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());
     
    40864088        auto userInitiatedActivity = m_process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
    40874089        bool shouldOpenAppLinks = !hostsAreEqual(URL(ParsedURLString, m_mainFrame->url()), request.url());
    4088         auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), nullptr, frameName, WTFMove(request), { }, shouldOpenAppLinks, WTFMove(userInitiatedActivity));
     4090        auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), nullptr, frameName, WTFMove(request), URL { }, shouldOpenAppLinks, WTFMove(userInitiatedActivity));
    40894091
    40904092        m_navigationClient->decidePolicyForNavigationAction(*this, navigationAction.get(), WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());
  • trunk/Tools/ChangeLog

    r234040 r234052  
     12018-07-20  Brady Eidson  <beidson@apple.com>
     2
     3        Add WKNavigation/WKNavigationAction related SPI.
     4        https://bugs.webkit.org/show_bug.cgi?id=187826
     5
     6        Reviewed by Chris Dumez.
     7
     8        * TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm:
     9        (-[NavigationActionHasNavigationDelegate webView:didFinishNavigation:]):
     10        (-[NavigationActionHasNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
     11        (TEST):
     12
    1132018-07-20  Commit Queue  <commit-queue@webkit.org>
    214
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm

    r226610 r234052  
    2727
    2828#import <WebKit/WKBackForwardListPrivate.h>
     29#import <WebKit/WKNavigationActionPrivate.h>
    2930#import <WebKit/WKNavigationDelegatePrivate.h>
    3031#import <WebKit/WKNavigationPrivate.h>
     
    216217
    217218    ASSERT_TRUE([delegate decidedPolicyForBackForwardNavigation]);
     219}
     220
     221@interface NavigationActionHasNavigationDelegate : NSObject <WKNavigationDelegate> {
     222@public
     223    WKNavigation *navigation;
     224}
     225@end
     226
     227@implementation NavigationActionHasNavigationDelegate
     228
     229- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
     230{
     231    isDone = true;
     232}
     233
     234- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
     235{
     236    EXPECT_TRUE(!!navigationAction._mainFrameNavigation);
     237    EXPECT_EQ(navigationAction._mainFrameNavigation, navigation);
     238    decisionHandler(WKNavigationActionPolicyAllow);
     239}
     240
     241@end
     242
     243TEST(WKNavigation, NavigationActionHasNavigation)
     244{
     245    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
     246
     247    RetainPtr<NavigationActionHasNavigationDelegate> delegate = adoptNS([[NavigationActionHasNavigationDelegate alloc] init]);
     248    [webView setNavigationDelegate:delegate.get()];
     249
     250    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"data:text/html,1"]];
     251
     252    isDone = false;
     253    delegate->navigation = [webView loadRequest:request];
     254    TestWebKitAPI::Util::run(&isDone);
    218255}
    219256
Note: See TracChangeset for help on using the changeset viewer.