// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web/public/test/web_test_with_web_state.h"
#import "base/ios/ios_util.h"
#import "base/run_loop.h"
#import "base/strings/sys_string_conversions.h"
#import "base/task/current_thread.h"
#import "base/test/ios/wait_util.h"
#import "ios/web/common/features.h"
#import "ios/web/navigation/navigation_manager_impl.h"
#import "ios/web/navigation/wk_navigation_util.h"
#import "ios/web/public/test/js_test_util.h"
#import "ios/web/public/test/task_observer_util.h"
#import "ios/web/public/test/web_state_test_util.h"
#import "ios/web/public/test/web_view_interaction_test_util.h"
#import "ios/web/public/web_client.h"
#import "ios/web/public/web_state_observer.h"
#import "ios/web/web_state/ui/crw_web_controller.h"
#import "ios/web/web_state/ui/wk_web_view_configuration_provider.h"
#import "ios/web/web_state/web_state_impl.h"
#import "url/url_constants.h"
using base::test::ios::WaitUntilConditionOrTimeout;
namespace web {
WebTestWithWebState::WebTestWithWebState(
WebTaskEnvironment::MainThreadType main_thread_type)
: WebTest(main_thread_type) {}
WebTestWithWebState::WebTestWithWebState(
std::unique_ptr<web::WebClient> web_client,
WebTaskEnvironment::MainThreadType main_thread_type)
: WebTest(std::move(web_client), main_thread_type) {}
WebTestWithWebState::~WebTestWithWebState() {}
void WebTestWithWebState::SetUp() {
WebTest::SetUp();
web::WebState::CreateParams params(GetBrowserState());
web_state_ = web::WebState::Create(params);
// Force generation of child views; necessary for some tests.
web_state_->GetView();
web_state()->SetKeepRenderProcessAlive(true);
}
void WebTestWithWebState::TearDown() {
DestroyWebState();
WebTest::TearDown();
}
void WebTestWithWebState::AddPendingItem(const GURL& url,
ui::PageTransition transition) {
web::test::GetWebController(web_state())
.webStateImpl->GetNavigationManagerImpl()
.AddPendingItem(url, Referrer(), transition,
web::NavigationInitiationType::BROWSER_INITIATED,
/*is_post_navigation=*/false,
/*is_error_navigation=*/false,
web::HttpsUpgradeType::kNone);
}
bool WebTestWithWebState::LoadHtmlWithoutSubresources(const std::string& html) {
return web::test::LoadHtmlWithoutSubresources(base::SysUTF8ToNSString(html),
web_state());
}
void WebTestWithWebState::LoadHtml(NSString* html, const GURL& url) {
LoadHtmlInWebState(html, url, web_state());
}
void WebTestWithWebState::LoadHtml(NSString* html) {
LoadHtmlInWebState(html, web_state());
}
bool WebTestWithWebState::LoadHtml(const std::string& html) {
return LoadHtmlInWebState(html, web_state());
}
void WebTestWithWebState::LoadHtmlInWebState(NSString* html,
const GURL& url,
WebState* web_state) {
web::test::LoadHtml(html, url, web_state);
}
void WebTestWithWebState::LoadHtmlInWebState(NSString* html,
WebState* web_state) {
web::test::LoadHtml(html, web_state);
}
bool WebTestWithWebState::LoadHtmlInWebState(const std::string& html,
WebState* web_state) {
LoadHtmlInWebState(base::SysUTF8ToNSString(html), web_state);
// TODO(crbug.com/40547442): LoadHtmlInWebState(NSString*) should return bool.
return true;
}
void WebTestWithWebState::WaitForBackgroundTasks() {
web::test::WaitForBackgroundTasks();
}
bool WebTestWithWebState::WaitForCondition(ConditionBlock condition) {
return base::test::ios::WaitUntilConditionOrTimeout(base::Seconds(1000), true,
condition);
}
bool WebTestWithWebState::WaitUntilLoaded() {
return web::test::WaitUntilLoaded(web_state());
}
std::unique_ptr<base::Value> WebTestWithWebState::CallJavaScriptFunction(
const std::string& function,
const base::Value::List& parameters) {
return web::test::CallJavaScriptFunction(web_state(), function, parameters);
}
std::unique_ptr<base::Value>
WebTestWithWebState::CallJavaScriptFunctionForFeature(
const std::string& function,
const base::Value::List& parameters,
JavaScriptFeature* feature) {
return web::test::CallJavaScriptFunctionForFeature(web_state(), function,
parameters, feature);
}
id WebTestWithWebState::ExecuteJavaScript(NSString* script) {
SCOPED_TRACE(base::SysNSStringToUTF8(script));
return web::test::ExecuteJavaScript(script, web_state());
}
void WebTestWithWebState::DestroyWebState() {
web_state_.reset();
}
std::string WebTestWithWebState::BaseUrl() const {
return web_state()->GetLastCommittedURL().spec();
}
web::WebState* WebTestWithWebState::web_state() {
return web_state_.get();
}
const web::WebState* WebTestWithWebState::web_state() const {
return web_state_.get();
}
} // namespace web