// 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/earl_grey/web_view_matchers.h"

#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>

#import "base/strings/sys_string_conversions.h"
#import "base/strings/utf_string_conversions.h"
#import "base/values.h"
#import "ios/testing/earl_grey/earl_grey_app.h"
#import "ios/web/public/test/web_view_interaction_test_util.h"
#import "ios/web/public/web_state.h"
#import "net/base/apple/url_conversions.h"

// TODO(crbug.com/41340619): Remove this class, after LoadImage() is removed.
// A helper delegate class that allows downloading responses with invalid
// SSL certs.
@interface TestURLSessionDelegateDeprecated : NSObject <NSURLSessionDelegate>
@end

@implementation TestURLSessionDelegateDeprecated

- (void)URLSession:(NSURLSession*)session
    didReceiveChallenge:(NSURLAuthenticationChallenge*)challenge
      completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition,
                                  NSURLCredential*))completionHandler {
  SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
  completionHandler(NSURLSessionAuthChallengeUseCredential,
                    [NSURLCredential credentialForTrust:serverTrust]);
}

@end

namespace web {

id<GREYMatcher> WebViewInWebState(WebState* web_state) {
  __weak UIView* web_state_view = web_state->GetView();
  GREYMatchesBlock matches = ^BOOL(UIView* view) {
    return [view isKindOfClass:[WKWebView class]] &&
           [view isDescendantOfView:web_state_view];
  };

  GREYDescribeToBlock describe = ^(id<GREYDescription> description) {
    [description
        appendText:[NSString
                       stringWithFormat:@"web view in web state (webView: %@)",
                                        web_state_view.description]];
  };

  return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
                                              descriptionBlock:describe];
}

id<GREYMatcher> WebViewScrollView(WebState* web_state) {
  __weak UIView* web_state_view = web_state->GetView();
  GREYMatchesBlock matches = ^BOOL(UIView* view) {
    return [view isKindOfClass:[UIScrollView class]] &&
           [view.superview isKindOfClass:[WKWebView class]] &&
           [view isDescendantOfView:web_state_view];
  };

  GREYDescribeToBlock describe = ^(id<GREYDescription> description) {
    [description
        appendText:[NSString
                       stringWithFormat:@"web view scroll view (webView: %@)",
                                        web_state_view.description]];
  };

  return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
                                              descriptionBlock:describe];
}

}  // namespace web
