| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #import <ChromeWebView/ChromeWebView.h> |
| #import <Foundation/Foundation.h> |
| |
| #import "ios/web_view/test/web_view_inttest_base.h" |
| #import "ios/web_view/test/web_view_test_util.h" |
| #import "net/base/mac/url_conversions.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "testing/gtest_mac.h" |
| #import "third_party/ocmock/OCMock/OCMock.h" |
| #include "url/gurl.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace ios_web_view { |
| |
| // Tests CWVNavigationDelegate. |
| class NavigationDelegateTest : public ios_web_view::WebViewInttestBase { |
| public: |
| NavigationDelegateTest() |
| : mock_delegate_( |
| OCMStrictProtocolMock(@protocol(CWVNavigationDelegate))) { |
| [(id)mock_delegate_ setExpectationOrderMatters:YES]; |
| web_view_.navigationDelegate = mock_delegate_; |
| } |
| |
| void SetUp() override { |
| ios_web_view::WebViewInttestBase::SetUp(); |
| ASSERT_TRUE(test_server_->Start()); |
| } |
| |
| NSURL* GetEchoURL() { |
| return net::NSURLWithGURL(test_server_->GetURL("/echo")); |
| } |
| |
| NSURL* GetCloseSocketURL() { |
| return net::NSURLWithGURL(test_server_->GetURL("/close-socket")); |
| } |
| |
| id ArgWithURL(NSURL* url) { |
| return [OCMArg checkWithBlock:^(id object) { |
| return [[object URL] isEqual:url]; |
| }]; |
| } |
| |
| id<CWVNavigationDelegate> mock_delegate_; |
| }; |
| |
| // Tests that expected delegate methods are called for a successful request. |
| TEST_F(NavigationDelegateTest, RequestSucceeds) { |
| // A request made with -loadRequest: has type CWVNavigationTypeTyped. |
| OCMExpect([mock_delegate_ webView:web_view_ |
| shouldStartLoadWithRequest:ArgWithURL(GetEchoURL()) |
| navigationType:CWVNavigationTypeTyped]) |
| .andReturn(YES); |
| OCMExpect([mock_delegate_ webViewDidStartProvisionalNavigation:web_view_]); |
| OCMExpect([mock_delegate_ webView:web_view_ |
| shouldContinueLoadWithResponse:ArgWithURL(GetEchoURL()) |
| forMainFrame:YES]) |
| .andReturn(YES); |
| OCMExpect([mock_delegate_ webViewDidCommitNavigation:web_view_]); |
| OCMExpect([mock_delegate_ webViewDidFinishNavigation:web_view_]); |
| |
| ASSERT_TRUE(test::LoadUrl(web_view_, GetEchoURL())); |
| [(id)mock_delegate_ verify]; |
| } |
| |
| // Tests that expected delegate methods are called for a failed request. |
| TEST_F(NavigationDelegateTest, RequestFails) { |
| OCMExpect([mock_delegate_ webView:web_view_ |
| shouldStartLoadWithRequest:ArgWithURL(GetCloseSocketURL()) |
| navigationType:CWVNavigationTypeTyped]) |
| .andReturn(YES); |
| OCMExpect([mock_delegate_ webViewDidStartProvisionalNavigation:web_view_]); |
| OCMExpect([mock_delegate_ webViewDidCommitNavigation:web_view_]); |
| OCMExpect([mock_delegate_ webView:web_view_ |
| didFailNavigationWithError:[OCMArg any]]); |
| |
| ASSERT_TRUE(test::LoadUrl(web_view_, GetCloseSocketURL())); |
| [(id)mock_delegate_ verify]; |
| } |
| |
| // Tests that a request is canceled and no further delegate methods are called |
| // when -shouldStartLoadWithRequest:navigationType: returns NO. |
| TEST_F(NavigationDelegateTest, CancelRequest) { |
| OCMExpect([mock_delegate_ webView:web_view_ |
| shouldStartLoadWithRequest:ArgWithURL(GetEchoURL()) |
| navigationType:CWVNavigationTypeTyped]) |
| .andReturn(NO); |
| |
| ASSERT_TRUE(test::LoadUrl(web_view_, GetEchoURL())); |
| [(id)mock_delegate_ verify]; |
| } |
| |
| // Tests that a response is canceled and no further delegate methods are called |
| // when -shouldContinueLoadWithResponse:forMainFrame: returns NO. |
| TEST_F(NavigationDelegateTest, CancelResponse) { |
| OCMExpect([mock_delegate_ webView:web_view_ |
| shouldStartLoadWithRequest:ArgWithURL(GetEchoURL()) |
| navigationType:CWVNavigationTypeTyped]) |
| .andReturn(YES); |
| OCMExpect([mock_delegate_ webViewDidStartProvisionalNavigation:web_view_]); |
| OCMExpect([mock_delegate_ webView:web_view_ |
| shouldContinueLoadWithResponse:ArgWithURL(GetEchoURL()) |
| forMainFrame:YES]) |
| .andReturn(NO); |
| |
| ASSERT_TRUE(test::LoadUrl(web_view_, GetEchoURL())); |
| [(id)mock_delegate_ verify]; |
| } |
| |
| } // namespace ios_web_view |