// Copyright 2019 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/testing/verify_custom_webkit.h"
#import <Foundation/Foundation.h>
#import <mach-o/dyld.h>
#import "base/command_line.h"
namespace {
// The switch used when running with custom WebKit frameworks.
const char kRunWithCustomWebKit[] = "run-with-custom-webkit";
}
bool IsCustomWebKitLoadedIfRequested() {
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
kRunWithCustomWebKit)) {
return true;
}
bool foundIncorrectLoadLocation = false;
NSArray<NSString*>* frameworks = @[
@"JavaScriptCore.framework/JavaScriptCore",
@"WebCore.framework/WebCore",
@"WebKit.framework/WebKit",
@"WebKitLegacy.framework/WebKitLegacy",
];
uint32_t numImages = _dyld_image_count();
for (uint32_t i = 0; i < numImages; i++) {
NSString* imagePath =
[NSString stringWithUTF8String:_dyld_get_image_name(i)];
for (NSString* framework in frameworks) {
if ([imagePath containsString:framework]) {
// Custom frameworks are bundled inside a "WebKitFrameworks"
// subdirectory, so look for that string to be present in |full_path|.
if (![imagePath containsString:@"WebKitFrameworks"]) {
// This framework was loaded from an unexpected location.
NSLog(@"Unexpectedly loaded %@ from %@ ", framework, imagePath);
foundIncorrectLoadLocation = true;
}
}
}
}
// Note that checks are not performed on frameworks that were never loaded at
// all. This function checks that *if* they were loaded, they were loaded
// from the correct location.
return !foundIncorrectLoadLocation;
}