blob: 936dc3064c23d1fe747ef3e2e8ded6048dfe9779 [file] [log] [blame]
// Copyright 2014 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/web/test/wk_web_view_crash_utils.h"
#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>
#include "base/ios/ios_util.h"
#include "base/logging.h"
#import "base/mac/scoped_nsobject.h"
#include "ios/web/public/test/test_browser_state.h"
#import "ios/web/public/web_view_creation_util.h"
#import "third_party/ocmock/OCMock/NSInvocation+OCMAdditions.h"
#import "third_party/ocmock/OCMock/OCMock.h"
namespace {
// Returns an OCMocked WKWebView whose |evaluateJavaScript:stringResultHandler:|
// method has been mocked to execute |block| instead. |block| cannot be nil.
WKWebView* CreateMockWKWebViewWithStubbedJSEvalFunction(
void (^block)(NSInvocation*)) {
DCHECK(block);
web::TestBrowserState browser_state;
base::scoped_nsobject<WKWebView> webView(
web::CreateWKWebView(CGRectZero, &browser_state));
id mockWebView = [OCMockObject partialMockForObject:webView];
[[[mockWebView stub] andDo:^void(NSInvocation* invocation) {
block(invocation);
}] evaluateJavaScript:OCMOCK_ANY completionHandler:OCMOCK_ANY];
return [mockWebView retain];
}
} // namespace
namespace web {
void SimulateWKWebViewCrash(WKWebView* webView) {
if (base::ios::IsRunningOnIOS9OrLater()) {
SEL selector = @selector(webViewWebContentProcessDidTerminate:);
if ([webView.navigationDelegate respondsToSelector:selector]) {
[webView.navigationDelegate performSelector:selector withObject:webView];
}
}
[webView performSelector:@selector(_processDidExit)];
}
WKWebView* CreateTerminatedWKWebView() {
id fail = ^void(NSInvocation* invocation) {
// Always fails with WKErrorWebContentProcessTerminated error.
NSError* error =
[NSError errorWithDomain:WKErrorDomain
code:WKErrorWebContentProcessTerminated
userInfo:nil];
void (^completionHandler)(id, NSError*) =
[invocation getArgumentAtIndexAsObject:3];
completionHandler(nil, error);
};
return CreateMockWKWebViewWithStubbedJSEvalFunction(fail);
}
WKWebView* CreateHealthyWKWebView() {
id succeed = ^void(NSInvocation* invocation) {
void (^completionHandler)(id, NSError*) =
[invocation getArgumentAtIndexAsObject:3];
// Always succceeds with nil result.
completionHandler(nil, nil);
};
return CreateMockWKWebViewWithStubbedJSEvalFunction(succeed);
}
} // namespace web