// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/lifetime/switch_utils.h"

#include <stddef.h>

#include "base/macros.h"
#include "build/build_config.h"
#include "chrome/common/chrome_switches.h"

#if defined(OS_WIN)
#include "base/strings/string_util.h"
#endif  // defined(OS_WIN)

namespace switches {

namespace {

// Switches enumerated here will be removed when a background instance of
// Chrome restarts itself. If your key is designed to only be used once,
// or if it does not make sense when restarting a background instance to
// pick up an automatic update, be sure to add it to this list.
constexpr const char* kSwitchesToRemoveOnAutorestart[] = {
    switches::kApp,
    switches::kAppId,
    switches::kForceFirstRun,
    switches::kMakeDefaultBrowser,
    switches::kNoStartupWindow,
    switches::kRestoreLastSession,
    switches::kShowAppList,
    switches::kWinJumplistAction};

}  // namespace

void RemoveSwitchesForAutostart(base::CommandLine::SwitchMap* switch_list) {
  for (const char* switch_to_remove : kSwitchesToRemoveOnAutorestart)
    switch_list->erase(switch_to_remove);

#if defined(OS_WIN)
  // The relaunched browser process shouldn't reuse the /prefetch:# switch of
  // the current process because the process type can change (e.g. a process
  // initially launched in background can be relaunched in foreground).
  static const char kPrefetchSwitchPrefix[] = "prefetch:";
  auto it = switch_list->lower_bound(kPrefetchSwitchPrefix);
  if (it != switch_list->end() &&
      base::StartsWith(it->first, kPrefetchSwitchPrefix,
                       base::CompareCase::SENSITIVE)) {
    switch_list->erase(it);
  }
#endif  // defined(OS_WIN)
}

}  // namespace switches
