|  | // Copyright 2018 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/element_selector.h" | 
|  |  | 
|  | #import "base/strings/sys_string_conversions.h" | 
|  |  | 
|  | @interface ElementSelector () | 
|  |  | 
|  | - (instancetype)initWithSelectorScript:(NSString*)selectorScript | 
|  | selectorDescription:(NSString*)selectorDescription; | 
|  |  | 
|  | @end | 
|  |  | 
|  | @implementation ElementSelector | 
|  |  | 
|  | + (ElementSelector*)selectorWithElementID:(const std::string&)elementID { | 
|  | NSString* script = [NSString | 
|  | stringWithFormat:@"document.getElementById('%s')", elementID.c_str()]; | 
|  | NSString* description = | 
|  | [NSString stringWithFormat:@"with ID %s", elementID.c_str()]; | 
|  | return [[ElementSelector alloc] initWithSelectorScript:script | 
|  | selectorDescription:description]; | 
|  | } | 
|  |  | 
|  | + (ElementSelector*)selectorWithElementID:(const std::string&)elementID | 
|  | inFrameWithIndex:(int)frameIndex { | 
|  | NSString* script = [NSString | 
|  | stringWithFormat:@"window.frames[%d].document.getElementById('%s')", | 
|  | frameIndex, elementID.c_str()]; | 
|  | NSString* description = | 
|  | [NSString stringWithFormat:@"in iframe with index %d, with ID %s", | 
|  | frameIndex, elementID.c_str()]; | 
|  | return [[ElementSelector alloc] initWithSelectorScript:script | 
|  | selectorDescription:description]; | 
|  | } | 
|  |  | 
|  | + (ElementSelector*)selectorWithCSSSelector:(const std::string&)selector { | 
|  | NSString* script = [NSString | 
|  | stringWithFormat:@"document.querySelector(\"%s\")", selector.c_str()]; | 
|  | NSString* description = | 
|  | [NSString stringWithFormat:@"with CSS selector '%s'", selector.c_str()]; | 
|  | return [[ElementSelector alloc] initWithSelectorScript:script | 
|  | selectorDescription:description]; | 
|  | } | 
|  |  | 
|  | + (ElementSelector*)selectorWithXPathQuery:(const std::string&)query { | 
|  | NSString* script = [NSString | 
|  | stringWithFormat: | 
|  | @"document.evaluate(`%s`, document, " | 
|  | @"null,XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue", | 
|  | query.c_str()]; | 
|  |  | 
|  | NSString* description = | 
|  | [NSString stringWithFormat:@"with xpath '%s'", query.c_str()]; | 
|  |  | 
|  | return [[ElementSelector alloc] initWithSelectorScript:script | 
|  | selectorDescription:description]; | 
|  | } | 
|  |  | 
|  | + (ElementSelector*)selectorWithScript:(NSString*)selectorScript | 
|  | selectorDescription:(NSString*)selectorDescription { | 
|  | return [[ElementSelector alloc] initWithSelectorScript:selectorScript | 
|  | selectorDescription:selectorDescription]; | 
|  | } | 
|  |  | 
|  | - (instancetype)initWithSelectorScript:(NSString*)selectorScript | 
|  | selectorDescription:(NSString*)selectorDescription { | 
|  | if ((self = [super init])) { | 
|  | _selectorScript = [selectorScript copy]; | 
|  | _selectorDescription = [selectorDescription copy]; | 
|  | } | 
|  | return self; | 
|  | } | 
|  |  | 
|  | @end |