Commit 0ba729b1 authored by Danyao Wang's avatar Danyao Wang Committed by Commit Bot

[Nav Experiment] Parameterize WebFrameWebStateObserverInttest on nav manager

Bug: 885274
Cq-Include-Trybots: luci.chromium.try:ios-simulator-cronet;luci.chromium.try:ios-simulator-full-configs
Change-Id: Iead2e9e13997d6d12987c4a40e02876d55108523
Reviewed-on: https://chromium-review.googlesource.com/1244596
Commit-Queue: Danyao Wang <danyao@chromium.org>
Reviewed-by: default avatarMike Dougherty <michaeldo@chromium.org>
Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Cr-Commit-Position: refs/heads/master@{#594852}
parent 7e0deb9b
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
#import "ios/web/public/test/web_test_with_web_state.h" #import "ios/web/public/test/web_test_with_web_state.h"
#include "base/ios/ios_util.h" #include "base/ios/ios_util.h"
#include "base/test/scoped_feature_list.h"
#include "ios/web/public/features.h"
#import "ios/web/public/web_state/web_frame.h"
#include "ios/web/public/web_state/web_frame_util.h" #include "ios/web/public/web_state/web_frame_util.h"
#import "ios/web/public/web_state/web_state.h" #import "ios/web/public/web_state/web_state.h"
#import "ios/web/public/web_state/web_state_observer.h" #import "ios/web/public/web_state/web_state_observer.h"
...@@ -15,7 +18,17 @@ ...@@ -15,7 +18,17 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
using testing::Truly;
namespace { namespace {
// WebFrameWebStateObserverInttest is parameterized on this enum to test both
// LegacyNavigationManager and WKBasedNavigationManager.
enum class NavigationManagerChoice {
LEGACY,
WK_BASED,
};
// Mocks WebStateObserver navigation callbacks. // Mocks WebStateObserver navigation callbacks.
class WebStateObserverMock : public web::WebStateObserver { class WebStateObserverMock : public web::WebStateObserver {
public: public:
...@@ -31,6 +44,11 @@ class WebStateObserverMock : public web::WebStateObserver { ...@@ -31,6 +44,11 @@ class WebStateObserverMock : public web::WebStateObserver {
DISALLOW_COPY_AND_ASSIGN(WebStateObserverMock); DISALLOW_COPY_AND_ASSIGN(WebStateObserverMock);
}; };
// A predicate that returns true if |frame| is a main frame.
bool IsMainFrame(web::WebFrame* frame) {
return frame->IsMainFrame();
}
// Verifies that the web frame passed to the observer is the main frame. // Verifies that the web frame passed to the observer is the main frame.
ACTION_P(VerifyMainWebFrame, web_state) { ACTION_P(VerifyMainWebFrame, web_state) {
EXPECT_EQ(web_state, arg0); EXPECT_EQ(web_state, arg0);
...@@ -51,10 +69,28 @@ ACTION_P(VerifyChildWebFrame, web_state) { ...@@ -51,10 +69,28 @@ ACTION_P(VerifyChildWebFrame, web_state) {
namespace web { namespace web {
typedef WebTestWithWebState WebFrameWebStateObserverInttest; class WebFrameWebStateObserverInttest
: public WebTestWithWebState,
public ::testing::WithParamInterface<NavigationManagerChoice> {
protected:
void SetUp() override {
if (GetParam() == NavigationManagerChoice::LEGACY) {
scoped_feature_list_.InitAndDisableFeature(
web::features::kSlimNavigationManager);
} else {
scoped_feature_list_.InitAndEnableFeature(
web::features::kSlimNavigationManager);
}
WebTestWithWebState::SetUp();
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
// Web frame events should be registered on HTTP navigation. // Web frame events should be registered on HTTP navigation.
TEST_F(WebFrameWebStateObserverInttest, SingleWebFrameHTTP) { TEST_P(WebFrameWebStateObserverInttest, SingleWebFrameHTTP) {
testing::StrictMock<WebStateObserverMock> observer; testing::StrictMock<WebStateObserverMock> observer;
web_state()->AddObserver(&observer); web_state()->AddObserver(&observer);
EXPECT_CALL(observer, WebFrameDidBecomeAvailable(web_state(), testing::_)) EXPECT_CALL(observer, WebFrameDidBecomeAvailable(web_state(), testing::_))
...@@ -69,7 +105,7 @@ TEST_F(WebFrameWebStateObserverInttest, SingleWebFrameHTTP) { ...@@ -69,7 +105,7 @@ TEST_F(WebFrameWebStateObserverInttest, SingleWebFrameHTTP) {
} }
// Web frame events should be registered on HTTPS navigation. // Web frame events should be registered on HTTPS navigation.
TEST_F(WebFrameWebStateObserverInttest, SingleWebFrameHTTPS) { TEST_P(WebFrameWebStateObserverInttest, SingleWebFrameHTTPS) {
testing::StrictMock<WebStateObserverMock> observer; testing::StrictMock<WebStateObserverMock> observer;
web_state()->AddObserver(&observer); web_state()->AddObserver(&observer);
EXPECT_CALL(observer, WebFrameDidBecomeAvailable(web_state(), testing::_)) EXPECT_CALL(observer, WebFrameDidBecomeAvailable(web_state(), testing::_))
...@@ -84,24 +120,42 @@ TEST_F(WebFrameWebStateObserverInttest, SingleWebFrameHTTPS) { ...@@ -84,24 +120,42 @@ TEST_F(WebFrameWebStateObserverInttest, SingleWebFrameHTTPS) {
} }
// Web frame event should be registered on HTTPS navigation with iframe. // Web frame event should be registered on HTTPS navigation with iframe.
TEST_F(WebFrameWebStateObserverInttest, TwoWebFrameHTTPS) { TEST_P(WebFrameWebStateObserverInttest, TwoWebFrameHTTPS) {
testing::StrictMock<WebStateObserverMock> observer; testing::StrictMock<WebStateObserverMock> observer;
web_state()->AddObserver(&observer); web_state()->AddObserver(&observer);
EXPECT_CALL(observer, WebFrameDidBecomeAvailable(web_state(), testing::_))
.Times(2) // The order in which the main and child frames become available is not
.WillOnce(VerifyChildWebFrame(web_state())) // guaranteed due to the async nature of messaging. The following expectations
// use separate matchers to identify main and child frames so that they can
// be matched in any order.
EXPECT_CALL(observer,
WebFrameDidBecomeAvailable(web_state(), Truly(IsMainFrame)))
.WillOnce(VerifyMainWebFrame(web_state())); .WillOnce(VerifyMainWebFrame(web_state()));
EXPECT_CALL(observer,
WebFrameDidBecomeAvailable(web_state(), Not(Truly(IsMainFrame))))
.WillOnce(VerifyChildWebFrame(web_state()));
LoadHtml(@"<p><iframe/></p>", GURL("https://testurl1")); LoadHtml(@"<p><iframe/></p>", GURL("https://testurl1"));
EXPECT_CALL(observer, WebFrameDidBecomeAvailable(web_state(), testing::_))
.Times(2) EXPECT_CALL(observer,
.WillOnce(VerifyChildWebFrame(web_state())) WebFrameDidBecomeAvailable(web_state(), Truly(IsMainFrame)))
.WillOnce(VerifyMainWebFrame(web_state())); .WillOnce(VerifyMainWebFrame(web_state()));
EXPECT_CALL(observer, WebFrameWillBecomeUnavailable(web_state(), testing::_)) EXPECT_CALL(observer,
.Times(2) WebFrameDidBecomeAvailable(web_state(), Not(Truly(IsMainFrame))))
.WillOnce(VerifyMainWebFrame(web_state())) .WillOnce(VerifyChildWebFrame(web_state()));
EXPECT_CALL(observer,
WebFrameWillBecomeUnavailable(web_state(), Truly(IsMainFrame)))
.WillOnce(VerifyMainWebFrame(web_state()));
EXPECT_CALL(observer, WebFrameWillBecomeUnavailable(web_state(),
Not(Truly(IsMainFrame))))
.WillOnce(VerifyChildWebFrame(web_state())); .WillOnce(VerifyChildWebFrame(web_state()));
LoadHtml(@"<p><iframe/></p>", GURL("https://testurl2")); LoadHtml(@"<p><iframe/></p>", GURL("https://testurl2"));
web_state()->RemoveObserver(&observer); web_state()->RemoveObserver(&observer);
} }
INSTANTIATE_TEST_CASE_P(ProgrammaticWebFrameWebStateObserverInttest,
WebFrameWebStateObserverInttest,
::testing::Values(NavigationManagerChoice::LEGACY,
NavigationManagerChoice::WK_BASED));
} // namespace web } // namespace web
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment