| // Copyright 2017 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 "ios/chrome/test/app/static_html_view_test_util.h" |
| |
| #import <Foundation/Foundation.h> |
| |
| #include "base/mac/foundation_util.h" |
| #include "base/strings/sys_string_conversions.h" |
| #import "ios/chrome/browser/ui/static_content/static_html_view_controller.h" |
| #import "ios/chrome/test/app/chrome_test_util.h" |
| #import "ios/testing/wait_util.h" |
| |
| #if !defined(__has_feature) || !__has_feature(objc_arc) |
| #error "This file requires ARC support." |
| #endif |
| |
| namespace chrome_test_util { |
| |
| // Synchronously returns the result of executed JavaScript. |
| id ExecuteScriptInStaticController( |
| StaticHtmlViewController* html_view_controller, |
| NSString* script) { |
| __block id result = nil; |
| __block bool did_finish = false; |
| [html_view_controller executeJavaScript:script |
| completionHandler:^(id script_result, NSError* error) { |
| result = [script_result copy]; |
| did_finish = true; |
| }]; |
| |
| // If a timeout is reached, then return |result|, which should be nil; |
| testing::WaitUntilConditionOrTimeout(testing::kWaitForJSCompletionTimeout, ^{ |
| return did_finish; |
| }); |
| |
| return result; |
| } |
| |
| // Returns the StaticHtmlViewController for the given |web_state|. If none is |
| // found, it returns nil. |
| StaticHtmlViewController* GetStaticHtmlView(web::WebState* web_state) { |
| // The WKWebView in a static HTML view isn't part of a |
| // webState, but it does have the StaticHtmlViewController |
| // as its navigation delegate. The WKWebView is the only child subview |
| // of the web state's view. |
| UIView* web_state_view = chrome_test_util::GetCurrentWebState()->GetView(); |
| WKWebView* web_view = |
| base::mac::ObjCCast<WKWebView>(web_state_view.subviews.firstObject); |
| return base::mac::ObjCCast<StaticHtmlViewController>( |
| web_view.navigationDelegate); |
| } |
| |
| bool StaticHtmlViewContainingText(web::WebState* web_state, std::string text) { |
| StaticHtmlViewController* html_view_controller = GetStaticHtmlView(web_state); |
| if (!html_view_controller) { |
| return false; |
| } |
| |
| id body = ExecuteScriptInStaticController( |
| html_view_controller, @"document.body ? document.body.textContent : ''"); |
| return [body containsString:base::SysUTF8ToNSString(text)]; |
| return false; |
| } |
| } // namespace chrome_test_util |