| /* |
| * 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" |
| |
| #if WK_HAVE_C_SPI |
| |
| #include "PlatformUtilities.h" |
| #include "PlatformWebView.h" |
| #include "Test.h" |
| |
| // This test navigates from simple.html, to simple2.html, to simple3.html |
| // When navigating from simple2 to simple3, it disallows the simple2 back/forward list item from staying in the list |
| // It then navigates back from simple3, expecting to land at simple. |
| |
| namespace TestWebKitAPI { |
| |
| static bool finished = false; |
| static bool successfulSoFar = true; |
| static int navigationNumber = 0; |
| |
| static bool itemURLLastComponentIsString(WKBackForwardListItemRef item, const char* string) |
| { |
| WKRetainPtr<WKURLRef> url = adoptWK(WKBackForwardListItemCopyURL(item)); |
| WKRetainPtr<WKStringRef> path = adoptWK(WKURLCopyLastPathComponent(url.get())); |
| |
| return WKStringIsEqualToUTF8CString(path.get(), string); |
| } |
| |
| static void didFinishLoadForFrame(WKPageRef page, WKFrameRef frame, WKTypeRef, const void*) |
| { |
| // Only mark finished when the main frame loads |
| if (!WKFrameIsMainFrame(frame)) |
| return; |
| |
| finished = true; |
| navigationNumber++; |
| |
| WKBackForwardListRef list = WKPageGetBackForwardList(page); |
| WKBackForwardListItemRef currentItem = WKBackForwardListGetCurrentItem(list); |
| WKBackForwardListItemRef backItem = WKBackForwardListGetBackItem(list); |
| WKBackForwardListItemRef forwardItem = WKBackForwardListGetForwardItem(list); |
| unsigned forwardCount = WKBackForwardListGetForwardListCount(list); |
| |
| // This test should never have a forward list. |
| if (forwardCount) |
| successfulSoFar = false; |
| |
| if (navigationNumber == 1) { |
| // We've only performed 1 navigation, we should only have a current item. |
| if (!currentItem || !itemURLLastComponentIsString(currentItem, "simple.html")) |
| successfulSoFar = false; |
| if (backItem || forwardItem) |
| successfulSoFar = false; |
| } else if (navigationNumber == 2) { |
| // On the second navigation, simple2 should be current and simple should be the back item. |
| if (!currentItem || !itemURLLastComponentIsString(currentItem, "simple2.html")) |
| successfulSoFar = false; |
| if (!backItem || !itemURLLastComponentIsString(backItem, "simple.html")) |
| successfulSoFar = false; |
| if (forwardItem) |
| successfulSoFar = false; |
| } else if (navigationNumber == 3) { |
| // On the third navigation the item for simple2 should have been removed. |
| // So simple3 should be current and simple should still be the back item. |
| if (!currentItem || !itemURLLastComponentIsString(currentItem, "simple3.html")) |
| successfulSoFar = false; |
| if (!backItem || !itemURLLastComponentIsString(backItem, "simple.html")) |
| successfulSoFar = false; |
| if (forwardItem) |
| successfulSoFar = false; |
| } else if (navigationNumber == 4) { |
| // After the fourth navigation (which was a "back" navigation), the item for simple3 should have been removed. |
| // So simple should be current and there should be no other items. |
| if (!currentItem || !itemURLLastComponentIsString(currentItem, "simple.html")) |
| successfulSoFar = false; |
| if (backItem || forwardItem) |
| successfulSoFar = false; |
| } |
| } |
| |
| static void willGoToBackForwardListItem(WKPageRef, WKBackForwardListItemRef item, WKTypeRef userData, const void*) |
| { |
| if (!itemURLLastComponentIsString(item, "simple.html")) |
| successfulSoFar = false; |
| } |
| |
| static bool shouldKeepCurrentBackForwardListItemInList(WKPageRef page, WKBackForwardListItemRef item, const void*) |
| { |
| // We make sure the item for "simple2.html" is removed when we navigate to "simple3.html" |
| // We also want to make sure the item for "simple3.html" is removed when we go back to "simple.html" |
| // So we only want to keep "simple.html" |
| return itemURLLastComponentIsString(item, "simple.html"); |
| } |
| |
| static void setPageLoaderClient(WKPageRef page) |
| { |
| WKPageLoaderClientV5 loaderClient; |
| memset(&loaderClient, 0, sizeof(loaderClient)); |
| |
| loaderClient.base.version = 5; |
| loaderClient.didFinishLoadForFrame = didFinishLoadForFrame; |
| loaderClient.shouldKeepCurrentBackForwardListItemInList = shouldKeepCurrentBackForwardListItemInList; |
| loaderClient.willGoToBackForwardListItem = willGoToBackForwardListItem; |
| |
| WKPageSetPageLoaderClient(page, &loaderClient.base); |
| } |
| |
| TEST(WebKit2, ShouldKeepCurrentBackForwardListItemInList) |
| { |
| WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate()); |
| |
| PlatformWebView webView(context.get()); |
| setPageLoaderClient(webView.page()); |
| |
| WKPageLoadURL(webView.page(), adoptWK(Util::createURLForResource("simple", "html")).get()); |
| Util::run(&finished); |
| EXPECT_EQ(successfulSoFar, true); |
| |
| finished = false; |
| WKPageLoadURL(webView.page(), adoptWK(Util::createURLForResource("simple2", "html")).get()); |
| Util::run(&finished); |
| EXPECT_EQ(successfulSoFar, true); |
| |
| finished = false; |
| WKPageLoadURL(webView.page(), adoptWK(Util::createURLForResource("simple3", "html")).get()); |
| Util::run(&finished); |
| EXPECT_EQ(successfulSoFar, true); |
| |
| finished = false; |
| WKPageGoBack(webView.page()); |
| Util::run(&finished); |
| |
| EXPECT_EQ(successfulSoFar, true); |
| EXPECT_EQ(navigationNumber, 4); |
| } |
| |
| } // namespace TestWebKitAPI |
| |
| |
| #endif |