From 15059b8560107f7558d6a6930d154d6ed38e0d7f Mon Sep 17 00:00:00 2001 From: Justin Cohen Date: Fri, 17 Mar 2023 18:27:37 +0000 Subject: [PATCH] ios: Implement IOSContentMainRunner on content. Support basic RunContentProcess implementation. Change-Id: I476f71def35d3ba42d73b8b92c68d4856e2a19ee Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4343473 Reviewed-by: Scott Violet Reviewed-by: Avi Drissman Reviewed-by: Rohit Rao Commit-Queue: Avi Drissman Reviewed-by: Mike Taylor Cr-Commit-Position: refs/heads/main@{#1118778} --- ios/web/content/init/BUILD.gn | 33 +++++ ios/web/content/init/DEPS | 8 ++ ios/web/content/init/ios_browser_main_parts.h | 40 ++++++ .../content/init/ios_browser_main_parts.mm | 44 +++++++ .../init/ios_content_browser_client.cc | 120 ++++++++++++++++++ .../content/init/ios_content_browser_client.h | 47 +++++++ ios/web/content/init/ios_content_client.cc | 51 ++++++++ ios/web/content/init/ios_content_client.h | 43 +++++++ .../content/init/ios_content_main_runner.cc | 31 +++++ .../content/init/ios_content_main_runner.h | 36 ++++++ ios/web/content/init/ios_main_delegate.cc | 42 ++++++ ios/web/content/init/ios_main_delegate.h | 50 ++++++++ ios/web/init/BUILD.gn | 7 + ios/web/init/web_main_runner_factory.mm | 9 ++ 14 files changed, 561 insertions(+) create mode 100644 ios/web/content/init/BUILD.gn create mode 100644 ios/web/content/init/DEPS create mode 100644 ios/web/content/init/ios_browser_main_parts.h create mode 100644 ios/web/content/init/ios_browser_main_parts.mm create mode 100644 ios/web/content/init/ios_content_browser_client.cc create mode 100644 ios/web/content/init/ios_content_browser_client.h create mode 100644 ios/web/content/init/ios_content_client.cc create mode 100644 ios/web/content/init/ios_content_client.h create mode 100644 ios/web/content/init/ios_content_main_runner.cc create mode 100644 ios/web/content/init/ios_content_main_runner.h create mode 100644 ios/web/content/init/ios_main_delegate.cc create mode 100644 ios/web/content/init/ios_main_delegate.h diff --git a/ios/web/content/init/BUILD.gn b/ios/web/content/init/BUILD.gn new file mode 100644 index 0000000000000..5ec20476d69eb --- /dev/null +++ b/ios/web/content/init/BUILD.gn @@ -0,0 +1,33 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("init") { + sources = [ + "ios_browser_main_parts.h", + "ios_browser_main_parts.mm", + "ios_content_browser_client.cc", + "ios_content_browser_client.h", + "ios_content_client.cc", + "ios_content_client.h", + "ios_content_main_runner.cc", + "ios_content_main_runner.h", + "ios_main_delegate.cc", + "ios_main_delegate.h", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ + "//build:blink_buildflags", + "//components/embedder_support:browser_util", + "//components/embedder_support/origin_trials:origin_trials", + "//components/version_info", + "//content/public/app", + "//content/public/browser", + "//content/public/common/", + "//content/public/renderer", + "//ios/web/public", + "//ios/web/public/init", + ] +} diff --git a/ios/web/content/init/DEPS b/ios/web/content/init/DEPS new file mode 100644 index 0000000000000..a3250d28324ec --- /dev/null +++ b/ios/web/content/init/DEPS @@ -0,0 +1,8 @@ +include_rules = [ + "+content/public/app", + "+content/public/browser", + "+content/public/common", + "+content/public/renderer", + "+components/embedder_support", + "+components/version_info", +] diff --git a/ios/web/content/init/ios_browser_main_parts.h b/ios/web/content/init/ios_browser_main_parts.h new file mode 100644 index 0000000000000..c21d4bfe51b72 --- /dev/null +++ b/ios/web/content/init/ios_browser_main_parts.h @@ -0,0 +1,40 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_CONTENT_INIT_IOS_BROWSER_MAIN_PARTS_H_ +#define IOS_WEB_CONTENT_INIT_IOS_BROWSER_MAIN_PARTS_H_ + +#import "build/blink_buildflags.h" +#import "content/public/browser/browser_main_parts.h" + +#if !BUILDFLAG(USE_BLINK) +#error File can only be included when USE_BLINK is true +#endif + +namespace web { + +class WebMainParts; + +class IOSBrowserMainParts : public content::BrowserMainParts { + public: + IOSBrowserMainParts(); + IOSBrowserMainParts(const IOSBrowserMainParts&) = delete; + IOSBrowserMainParts& operator=(const IOSBrowserMainParts&) = delete; + ~IOSBrowserMainParts() override; + + // BrowserMainParts implementation: + int PreEarlyInitialization() override; + void PostEarlyInitialization() override; + void PreCreateMainMessageLoop() override; + void PostCreateMainMessageLoop() override; + int PreCreateThreads() override; + int PreMainMessageLoopRun() override; + + private: + std::unique_ptr parts_; +}; + +} // namespace web + +#endif // IOS_WEB_CONTENT_INIT_IOS_BROWSER_MAIN_PARTS_H_ diff --git a/ios/web/content/init/ios_browser_main_parts.mm b/ios/web/content/init/ios_browser_main_parts.mm new file mode 100644 index 0000000000000..ee285fa3af371 --- /dev/null +++ b/ios/web/content/init/ios_browser_main_parts.mm @@ -0,0 +1,44 @@ +// Copyright 2023 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/content/init/ios_browser_main_parts.h" + +#import "ios/web/public/init/web_main_parts.h" +#import "ios/web/public/web_client.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace web { + +IOSBrowserMainParts::IOSBrowserMainParts() { + parts_ = web::GetWebClient()->CreateWebMainParts(); +} + +IOSBrowserMainParts::~IOSBrowserMainParts() {} + +int IOSBrowserMainParts::PreEarlyInitialization() { + parts_->PreEarlyInitialization(); + return 0; +} +void IOSBrowserMainParts::PostEarlyInitialization() { + parts_->PostEarlyInitialization(); +} +void IOSBrowserMainParts::PreCreateMainMessageLoop() { + parts_->PreCreateMainMessageLoop(); +} +void IOSBrowserMainParts::PostCreateMainMessageLoop() { + parts_->PostCreateMainMessageLoop(); +} +int IOSBrowserMainParts::PreCreateThreads() { + parts_->PreCreateThreads(); + return 0; +} +int IOSBrowserMainParts::PreMainMessageLoopRun() { + parts_->PreMainMessageLoopRun(); + return 0; +} + +} // namespace web diff --git a/ios/web/content/init/ios_content_browser_client.cc b/ios/web/content/init/ios_content_browser_client.cc new file mode 100644 index 0000000000000..925b9e4caab5c --- /dev/null +++ b/ios/web/content/init/ios_content_browser_client.cc @@ -0,0 +1,120 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ios/web/content/init/ios_content_browser_client.h" + +#import "components/embedder_support/user_agent_utils.h" +#import "components/version_info/version_info.h" +#import "content/public/browser/browser_context.h" +#import "content/public/browser/devtools_manager_delegate.h" +#import "content/public/common/url_constants.h" +#import "content/public/common/user_agent.h" +#import "ios/web/content/init/ios_browser_main_parts.h" + +namespace web { + +bool IOSContentBrowserClient::IsHandledURL(const GURL& url) { + if (!url.is_valid()) { + return false; + } + static const char* const kProtocolList[] = { + url::kHttpScheme, + url::kHttpsScheme, + url::kWsScheme, + url::kWssScheme, + url::kBlobScheme, + url::kFileSystemScheme, + content::kChromeUIScheme, + content::kChromeUIUntrustedScheme, + content::kChromeDevToolsScheme, + url::kDataScheme, + url::kFileScheme, + }; + for (const char* supported_protocol : kProtocolList) { + if (url.scheme_piece() == supported_protocol) { + return true; + } + } + return false; +} + +std::unique_ptr +IOSContentBrowserClient::CreateBrowserMainParts(bool is_integration_test) { + return std::make_unique(); +} + +std::string IOSContentBrowserClient::GetAcceptLangs( + content::BrowserContext* context) { + return "en-us,en"; +} + +std::string IOSContentBrowserClient::GetProduct() { + return version_info::GetProductNameAndVersionForUserAgent(); +} + +std::string IOSContentBrowserClient::GetUserAgent() { + return embedder_support::GetUserAgent(); +} + +std::string IOSContentBrowserClient::GetUserAgentBasedOnPolicy( + content::BrowserContext* context) { + return GetUserAgent(); +} + +std::string IOSContentBrowserClient::GetFullUserAgent() { + return embedder_support::GetFullUserAgent(); +} + +std::string IOSContentBrowserClient::GetReducedUserAgent() { + return embedder_support::GetReducedUserAgent(); +} + +blink::UserAgentMetadata IOSContentBrowserClient::GetUserAgentMetadata() { + blink::UserAgentMetadata metadata; + + metadata.brand_version_list.emplace_back(version_info::GetProductName(), + "113"); + metadata.brand_full_version_list.emplace_back( + version_info::GetProductName(), version_info::GetVersionNumber()); + metadata.full_version = version_info::GetVersionNumber(); + metadata.platform = "Unknown"; + metadata.architecture = content::GetCpuArchitecture(); + metadata.model = content::BuildModelInfo(); + + metadata.bitness = content::GetCpuBitness(); + metadata.wow64 = content::IsWoW64(); + + return metadata; +} + +bool IOSContentBrowserClient::IsSharedStorageAllowed( + content::BrowserContext* browser_context, + content::RenderFrameHost* rfh, + const url::Origin& top_frame_origin, + const url::Origin& accessing_origin) { + return true; +} + +bool IOSContentBrowserClient::IsSharedStorageSelectURLAllowed( + content::BrowserContext* browser_context, + const url::Origin& top_frame_origin, + const url::Origin& accessing_origin) { + return true; +} + +content::GeneratedCodeCacheSettings +IOSContentBrowserClient::GetGeneratedCodeCacheSettings( + content::BrowserContext* context) { + // If we pass 0 for size, disk_cache will pick a default size using the + // heuristics based on available disk size. These are implemented in + // disk_cache::PreferredCacheSize in net/disk_cache/cache_util.cc. + return content::GeneratedCodeCacheSettings(true, 0, context->GetPath()); +} + +std::unique_ptr +IOSContentBrowserClient::CreateDevToolsManagerDelegate() { + return std::make_unique(); +} + +} // namespace web diff --git a/ios/web/content/init/ios_content_browser_client.h b/ios/web/content/init/ios_content_browser_client.h new file mode 100644 index 0000000000000..939b53aadbb73 --- /dev/null +++ b/ios/web/content/init/ios_content_browser_client.h @@ -0,0 +1,47 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_CONTENT_INIT_IOS_CONTENT_BROWSER_CLIENT_H_ +#define IOS_WEB_CONTENT_INIT_IOS_CONTENT_BROWSER_CLIENT_H_ + +#import "build/blink_buildflags.h" +#include "content/public/browser/content_browser_client.h" + +#if !BUILDFLAG(USE_BLINK) +#error File can only be included when USE_BLINK is true +#endif + +namespace web { + +class IOSContentBrowserClient : public content::ContentBrowserClient { + public: + // ContentBrowserClient implementation: + bool IsHandledURL(const GURL& url) override; + std::unique_ptr CreateBrowserMainParts( + bool is_integration_test) override; + std::string GetAcceptLangs(content::BrowserContext* context) override; + std::string GetProduct() override; + std::string GetUserAgent() override; + std::string GetUserAgentBasedOnPolicy( + content::BrowserContext* context) override; + std::string GetFullUserAgent() override; + std::string GetReducedUserAgent() override; + blink::UserAgentMetadata GetUserAgentMetadata() override; + bool IsSharedStorageAllowed(content::BrowserContext* browser_context, + content::RenderFrameHost* rfh, + const url::Origin& top_frame_origin, + const url::Origin& accessing_origin) override; + bool IsSharedStorageSelectURLAllowed( + content::BrowserContext* browser_context, + const url::Origin& top_frame_origin, + const url::Origin& accessing_origin) override; + content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings( + content::BrowserContext* context) override; + std::unique_ptr + CreateDevToolsManagerDelegate() override; +}; + +} // namespace web + +#endif // IOS_WEB_CONTENT_INIT_IOS_CONTENT_BROWSER_CLIENT_H_ diff --git a/ios/web/content/init/ios_content_client.cc b/ios/web/content/init/ios_content_client.cc new file mode 100644 index 0000000000000..ef91f38d097af --- /dev/null +++ b/ios/web/content/init/ios_content_client.cc @@ -0,0 +1,51 @@ +// Copyright 2023 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/content/init/ios_content_client.h" + +#import "ui/base/l10n/l10n_util.h" +#import "ui/base/resource/resource_bundle.h" + +namespace web { + +IOSContentClient::IOSContentClient() {} +IOSContentClient::~IOSContentClient() {} + +blink::OriginTrialPolicy* IOSContentClient::GetOriginTrialPolicy() { + return &origin_trial_policy_; +} +std::u16string IOSContentClient::GetLocalizedString(int message_id) { + return l10n_util::GetStringUTF16(message_id); +} + +std::u16string IOSContentClient::GetLocalizedString( + int message_id, + const std::u16string& replacement) { + return l10n_util::GetStringFUTF16(message_id, replacement); +} + +base::StringPiece IOSContentClient::GetDataResource( + int resource_id, + ui::ResourceScaleFactor scale_factor) { + return ui::ResourceBundle::GetSharedInstance().GetRawDataResourceForScale( + resource_id, scale_factor); +} + +base::RefCountedMemory* IOSContentClient::GetDataResourceBytes( + int resource_id) { + return ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes( + resource_id); +} + +std::string IOSContentClient::GetDataResourceString(int resource_id) { + return ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( + resource_id); +} + +gfx::Image& IOSContentClient::GetNativeImageNamed(int resource_id) { + return ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( + resource_id); +} + +} // namespace web diff --git a/ios/web/content/init/ios_content_client.h b/ios/web/content/init/ios_content_client.h new file mode 100644 index 0000000000000..e189b29aa3ed0 --- /dev/null +++ b/ios/web/content/init/ios_content_client.h @@ -0,0 +1,43 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_CONTENT_INIT_IOS_CONTENT_CLIENT_H_ +#define IOS_WEB_CONTENT_INIT_IOS_CONTENT_CLIENT_H_ + +#import "build/blink_buildflags.h" +#import "components/embedder_support/origin_trials/origin_trial_policy_impl.h" +#import "content/public/common/content_client.h" + +#if !BUILDFLAG(USE_BLINK) +#error File can only be included when USE_BLINK is true +#endif + +namespace web { + +class IOSContentClient : public content::ContentClient { + public: + IOSContentClient(); + IOSContentClient(const IOSContentClient&) = delete; + IOSContentClient& operator=(const IOSContentClient&) = delete; + ~IOSContentClient() override; + + // ContentClient implementation: + blink::OriginTrialPolicy* GetOriginTrialPolicy() override; + std::u16string GetLocalizedString(int message_id) override; + std::u16string GetLocalizedString(int message_id, + const std::u16string& replacement) override; + base::StringPiece GetDataResource( + int resource_id, + ui::ResourceScaleFactor scale_factor) override; + base::RefCountedMemory* GetDataResourceBytes(int resource_id) override; + std::string GetDataResourceString(int resource_id) override; + gfx::Image& GetNativeImageNamed(int resource_id) override; + + private: + embedder_support::OriginTrialPolicyImpl origin_trial_policy_; +}; + +} // namespace web + +#endif // IOS_WEB_CONTENT_INIT_IOS_CONTENT_CLIENT_H_ diff --git a/ios/web/content/init/ios_content_main_runner.cc b/ios/web/content/init/ios_content_main_runner.cc new file mode 100644 index 0000000000000..24b2f8ff4318d --- /dev/null +++ b/ios/web/content/init/ios_content_main_runner.cc @@ -0,0 +1,31 @@ +// Copyright 2023 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/content/init/ios_content_main_runner.h" + +#import "content/public/app/content_main.h" +#import "content/public/app/content_main_runner.h" +#import "ios/web/content/init/ios_main_delegate.h" + +namespace web { + +IOSContentMainRunner::IOSContentMainRunner() {} + +IOSContentMainRunner::~IOSContentMainRunner() {} + +int IOSContentMainRunner::Initialize(WebMainParams params) { + content_main_delegate_ = std::make_unique(); + content::ContentMainParams content_params(content_main_delegate_.get()); + content_params.argc = params.argc; + content_params.argv = params.argv; + content_main_runner_ = content::ContentMainRunner::Create(); + return RunContentProcess(std::move(content_params), + content_main_runner_.get()); +} + +void IOSContentMainRunner::ShutDown() { + content_main_runner_->Shutdown(); +} + +} // namespace web diff --git a/ios/web/content/init/ios_content_main_runner.h b/ios/web/content/init/ios_content_main_runner.h new file mode 100644 index 0000000000000..31a9dd6638a7d --- /dev/null +++ b/ios/web/content/init/ios_content_main_runner.h @@ -0,0 +1,36 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_CONTENT_INIT_IOS_CONTENT_MAIN_RUNNER_H_ +#define IOS_WEB_CONTENT_INIT_IOS_CONTENT_MAIN_RUNNER_H_ + +#import "ios/web/public/init/web_main_runner.h" + +namespace content { +class ContentMainRunner; +class ContentMainDelegate; +} // namespace content + +namespace web { + +// This class is responsible for content initialization and shutdown. +class IOSContentMainRunner : public WebMainRunner { + public: + IOSContentMainRunner(); + IOSContentMainRunner(const IOSContentMainRunner&) = delete; + IOSContentMainRunner& operator=(const IOSContentMainRunner&) = delete; + ~IOSContentMainRunner() override; + + // WebMainRunner implementation: + int Initialize(WebMainParams params) override; + void ShutDown() override; + + private: + std::unique_ptr content_main_delegate_; + std::unique_ptr content_main_runner_; +}; + +} // namespace web + +#endif // IOS_WEB_CONTENT_INIT_IOS_CONTENT_MAIN_RUNNER_H_ diff --git a/ios/web/content/init/ios_main_delegate.cc b/ios/web/content/init/ios_main_delegate.cc new file mode 100644 index 0000000000000..3706dd17ced8c --- /dev/null +++ b/ios/web/content/init/ios_main_delegate.cc @@ -0,0 +1,42 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ios/web/content/init/ios_main_delegate.h" + +#include "content/public/renderer/content_renderer_client.h" +#include "ios/web/content/init/ios_content_browser_client.h" +#include "ios/web/content/init/ios_content_client.h" + +namespace web { + +IOSMainDelegate::IOSMainDelegate() {} +IOSMainDelegate::~IOSMainDelegate() {} + +content::ContentClient* IOSMainDelegate::CreateContentClient() { + content_client_ = std::make_unique(); + return content_client_.get(); +} +content::ContentBrowserClient* IOSMainDelegate::CreateContentBrowserClient() { + browser_client_ = std::make_unique(); + return browser_client_.get(); +} +content::ContentRendererClient* IOSMainDelegate::CreateContentRendererClient() { + renderer_client_ = std::make_unique(); + return renderer_client_.get(); +} + +absl::variant IOSMainDelegate::RunProcess( + const std::string& process_type, + content::MainFunctionParams main_function_params) { + CHECK_EQ(process_type, ""); + browser_runner_ = content::BrowserMainRunner::Create(); + + int exit_code = browser_runner_->Initialize(std::move(main_function_params)); + if (exit_code > 0) { + return exit_code; + } + return 0; +} + +} // namespace web diff --git a/ios/web/content/init/ios_main_delegate.h b/ios/web/content/init/ios_main_delegate.h new file mode 100644 index 0000000000000..aec674dcee7d2 --- /dev/null +++ b/ios/web/content/init/ios_main_delegate.h @@ -0,0 +1,50 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_WEB_CONTENT_INIT_IOS_MAIN_DELEGATE_H_ +#define IOS_WEB_CONTENT_INIT_IOS_MAIN_DELEGATE_H_ + +#import "build/blink_buildflags.h" +#import "content/public/app/content_main_delegate.h" +#import "content/public/browser/browser_main_runner.h" +#import "content/public/browser/content_browser_client.h" +#import "content/public/common/content_client.h" +#import "content/public/renderer/content_renderer_client.h" + +#if !BUILDFLAG(USE_BLINK) +#error File can only be included when USE_BLINK is true +#endif + +namespace content { +class BrowserMainRunner; +} + +namespace web { + +class IOSMainDelegate : public content::ContentMainDelegate { + public: + IOSMainDelegate(); + IOSMainDelegate(const IOSMainDelegate&) = delete; + IOSMainDelegate& operator=(const IOSMainDelegate&) = delete; + ~IOSMainDelegate() override; + + // ContentMainDelegate implementation: + content::ContentClient* CreateContentClient() override; + content::ContentBrowserClient* CreateContentBrowserClient() override; + content::ContentRendererClient* CreateContentRendererClient() override; + + absl::variant RunProcess( + const std::string& process_type, + content::MainFunctionParams main_function_params) override; + + private: + std::unique_ptr browser_runner_; + std::unique_ptr content_client_; + std::unique_ptr browser_client_; + std::unique_ptr renderer_client_; +}; + +} // namespace web + +#endif // IOS_WEB_CONTENT_INIT_IOS_MAIN_DELEGATE_H_ diff --git a/ios/web/init/BUILD.gn b/ios/web/init/BUILD.gn index 631160b3f521f..4d50b0e07f8bc 100644 --- a/ios/web/init/BUILD.gn +++ b/ios/web/init/BUILD.gn @@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/features.gni") + source_set("init") { sources = [ "web_main.mm", @@ -18,6 +20,7 @@ source_set("init") { ":global_state", "//base", "//base:i18n", + "//build:blink_buildflags", "//crypto", "//ios/web:threads", "//ios/web/net", @@ -31,6 +34,10 @@ source_set("init") { "//ui/gfx/geometry", ] + if (use_blink) { + deps += [ "//ios/web/content/init" ] + } + frameworks = [ "Foundation.framework", "UIKit.framework", diff --git a/ios/web/init/web_main_runner_factory.mm b/ios/web/init/web_main_runner_factory.mm index e7debf9735947..b595329d621f0 100644 --- a/ios/web/init/web_main_runner_factory.mm +++ b/ios/web/init/web_main_runner_factory.mm @@ -4,8 +4,13 @@ #import "ios/web/public/init/web_main_runner.h" +#import "build/blink_buildflags.h" #import "ios/web/init/web_main_runner_impl.h" +#if BUILDFLAG(USE_BLINK) +#import "ios/web/content/init/ios_content_main_runner.h" +#endif // USE_BLINK + #import #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -16,7 +21,11 @@ // static WebMainRunner* WebMainRunner::Create() { +#if BUILDFLAG(USE_BLINK) + return new IOSContentMainRunner(); +#else return new WebMainRunnerImpl(); +#endif // USE_BLINK } } // namespace web