chromium/chrome/browser/shortcuts/chrome_webloc_file.h

// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_SHORTCUTS_CHROME_WEBLOC_FILE_H_
#define CHROME_BROWSER_SHORTCUTS_CHROME_WEBLOC_FILE_H_

#include <optional>

#include "base/files/file_path.h"
#include "base/files/safe_base_name.h"
#include "url/gurl.h"

namespace shortcuts {

// This class can be used to save and load .crwebloc files, a variant of regular
// .webloc files that also includes profile information when opened by Chrome.
// There's not really any reason these files follow the .webloc file format,
// other than that it is a relatively easy file format to deal with. The fact
// that these files extend the .webloc file format does not give them any of
// the OS behavior that .webloc files have.
//
// Note that this file does not store the specific Chrome binary/channel that
// created a shortcut. If shortcuts needs to be associated with a specific
// Chrome channel or binary, the created file needs to be explicitly associated
// with the current Chrome binary using the available macOS APIs.
//
// This file format is only used (and supported) on macOS.
class ChromeWeblocFile {
 public:
  static constexpr base::FilePath::StringPieceType kFileExtension = ".crwebloc";

  ChromeWeblocFile(GURL target_url, base::SafeBaseName profile_path_name);
  ~ChromeWeblocFile();

  static std::optional<ChromeWeblocFile> LoadFromFile(
      const base::FilePath& file_path);
  bool SaveToFile(const base::FilePath& file_path);

  const GURL& target_url() const { return target_url_; }
  const base::SafeBaseName& profile_path_name() const {
    return profile_path_name_;
  }

 private:
  GURL target_url_;
  base::SafeBaseName profile_path_name_;
};

}  // namespace shortcuts

#endif  // CHROME_BROWSER_SHORTCUTS_CHROME_WEBLOC_FILE_H_