| // 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 "fuchsia_web/shell/shell_relauncher.h" |
| |
| #include <fuchsia/component/cpp/fidl.h> |
| #include <lib/sys/component/cpp/testing/realm_builder.h> |
| #include <zircon/types.h> |
| |
| #include <string> |
| #include <utility> |
| |
| #include "base/command_line.h" |
| #include "base/functional/callback.h" |
| #include "base/run_loop.h" |
| #include "fuchsia_web/common/test/test_realm_support.h" |
| |
| std::optional<int> RelaunchForWebInstanceHostIfParent( |
| base::StringPiece relative_component_url, |
| const base::CommandLine& command_line) { |
| // Nothing to do if running from the context of a relaunched process. |
| static constexpr char kNoRelaunch[] = "no-relaunch"; |
| if (command_line.HasSwitch(kNoRelaunch)) { |
| return std::nullopt; |
| } |
| |
| auto realm_builder = component_testing::RealmBuilder::CreateFromRelativeUrl( |
| {relative_component_url.data(), relative_component_url.length()}); |
| test::AppendCommandLineArgumentsForRealm(realm_builder, // IN-TEST |
| command_line); |
| |
| auto realm = realm_builder.Build(); |
| |
| fuchsia::component::BinderPtr binder_proxy = |
| realm.component().Connect<fuchsia::component::Binder>(); |
| |
| // Wait for binder_proxy to be closed. |
| base::RunLoop run_loop; |
| binder_proxy.set_error_handler( |
| [quit_closure = run_loop.QuitClosure()](zx_status_t status) { |
| std::move(quit_closure).Run(); |
| }); |
| run_loop.Run(); |
| |
| // Nothing depends on the process exit code of web_engine_shell today, so |
| // simply return success in all cases. |
| return 0; |
| } |