| // Copyright 2011 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/first_run/upgrade_util.h" |
| |
| #include <utility> |
| |
| #include "base/command_line.h" |
| #include "base/functional/callback.h" |
| #include "base/logging.h" |
| #include "base/memory/ptr_util.h" |
| #include "build/build_config.h" |
| #include "content/public/browser/browser_thread.h" |
| |
| namespace { |
| |
| #if !BUILDFLAG(IS_MAC) |
| base::CommandLine* command_line = nullptr; |
| #endif |
| |
| // A test seam for whole-browser tests to override browser relaunch. |
| upgrade_util::RelaunchChromeBrowserCallback* |
| relaunch_chrome_browser_callback_for_testing = nullptr; |
| |
| } // namespace |
| |
| namespace upgrade_util { |
| |
| // Forward-declaration of the platform-specific implementation. |
| bool RelaunchChromeBrowserImpl(const base::CommandLine& command_line); |
| |
| bool RelaunchChromeBrowser(const base::CommandLine& command_line) { |
| if (relaunch_chrome_browser_callback_for_testing) |
| return relaunch_chrome_browser_callback_for_testing->Run(command_line); |
| |
| return RelaunchChromeBrowserImpl(command_line); |
| } |
| |
| #if !BUILDFLAG(IS_MAC) |
| |
| void SetNewCommandLine(std::unique_ptr<base::CommandLine> new_command_line) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| delete command_line; |
| command_line = new_command_line.release(); |
| } |
| |
| void RelaunchChromeBrowserWithNewCommandLineIfNeeded() { |
| if (command_line) { |
| if (!RelaunchChromeBrowser(*command_line)) { |
| DLOG(ERROR) << "Launching a new instance of the browser failed."; |
| } else { |
| DLOG(WARNING) << "Launched a new instance of the browser."; |
| } |
| delete command_line; |
| command_line = nullptr; |
| } |
| } |
| |
| #endif // !BUILDFLAG(IS_MAC) |
| |
| RelaunchChromeBrowserCallback SetRelaunchChromeBrowserCallbackForTesting( |
| RelaunchChromeBrowserCallback callback) { |
| // Take ownership of the current test callback so it can be returned. |
| RelaunchChromeBrowserCallback previous = |
| relaunch_chrome_browser_callback_for_testing |
| ? std::move(*relaunch_chrome_browser_callback_for_testing) |
| : RelaunchChromeBrowserCallback(); |
| |
| // Move the caller's callback into the global, alloc'ing or freeing as needed. |
| auto memory = base::WrapUnique(relaunch_chrome_browser_callback_for_testing); |
| if (callback) { |
| if (!memory) |
| memory = std::make_unique<RelaunchChromeBrowserCallback>(); |
| *memory = std::move(callback); |
| } else if (memory) { |
| memory.reset(); |
| } |
| relaunch_chrome_browser_callback_for_testing = memory.release(); |
| |
| // Return the previous callback. |
| return previous; |
| } |
| |
| } // namespace upgrade_util |