910e62b5创建于 1月15日历史提交
// 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.

#ifndef CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UI_CONTEXT_MENU_H_
#define CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UI_CONTEXT_MENU_H_

#include <memory>
#include <string>

#include "base/gtest_prod_util.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "chrome/browser/download/download_commands.h"
#include "chrome/browser/download/download_ui_model.h"
#include "components/download/public/common/download_item.h"
#include "ui/menus/simple_menu_model.h"

// This class is responsible for the download UI context menu. Platform
// specific subclasses are responsible for creating and running the menu. It may
// be triggered e.g. by right-clicking on the download entry within the Download
// bubble.
//
// The DownloadItem corresponding to the context menu is observed for removal or
// destruction.
class DownloadUiContextMenu : public ui::SimpleMenuModel::Delegate {
 public:
  DownloadUiContextMenu(const DownloadUiContextMenu&) = delete;
  DownloadUiContextMenu& operator=(const DownloadUiContextMenu&) = delete;

  ~DownloadUiContextMenu() override;

  // Called when download is destroyed.
  void OnDownloadDestroyed();

 protected:
  explicit DownloadUiContextMenu(base::WeakPtr<DownloadUIModel> download);

  // Returns the correct menu model depending on the state of the download item.
  // Returns nullptr if the download was destroyed.
  ui::SimpleMenuModel* GetMenuModel();

  // ui::SimpleMenuModel::Delegate:
  bool IsCommandIdEnabled(int command_id) const override;
  bool IsCommandIdChecked(int command_id) const override;
  bool IsCommandIdVisible(int command_id) const override;
  void ExecuteCommand(int command_id, int event_flags) override;
  bool IsItemForCommandIdDynamic(int command_id) const override;
  std::u16string GetLabelForCommandId(int command_id) const override;

  DownloadUIModel* GetDownload() { return download_.get(); }

 private:
  friend class DownloadUiContextMenuTest;
  FRIEND_TEST_ALL_PREFIXES(DownloadUiContextMenuTest,
                           InvalidDownloadWontCrashContextMenu);
  FRIEND_TEST_ALL_PREFIXES(DownloadUiContextMenuTest, RecordCommandsEnabled);

  // Detaches self from |download_item_|. Called when the DownloadItem is
  // destroyed or when this object is being destroyed.
  void DetachFromDownloadItem();

  ui::SimpleMenuModel* GetInProgressMenuModel(bool is_download);
  ui::SimpleMenuModel* GetInProgressPausedMenuModel(bool is_download);
  ui::SimpleMenuModel* GetFinishedMenuModel(bool is_download);
  ui::SimpleMenuModel* GetInterruptedMenuModel(bool is_download);
  ui::SimpleMenuModel* GetMaybeMaliciousMenuModel(bool is_download);
  ui::SimpleMenuModel* GetMaliciousMenuModel(bool is_download);
  ui::SimpleMenuModel* GetDeepScanningMenuModel(bool is_download);
  ui::SimpleMenuModel* GetInsecureDownloadMenuModel();

  void AddAutoOpenToMenu(ui::SimpleMenuModel* model);

  void RecordCommandsEnabled(ui::SimpleMenuModel* model);

  // We show slightly different menus if the download is in progress vs. if the
  // download has finished.
  std::unique_ptr<ui::SimpleMenuModel> in_progress_download_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> in_progress_download_paused_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> finished_download_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> interrupted_download_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> maybe_malicious_download_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> malicious_download_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> deep_scanning_menu_model_;
  std::unique_ptr<ui::SimpleMenuModel> insecure_download_menu_model_;

  // Whether or not a histogram has been emitted recording which
  // Download commands were enabled
  bool download_commands_enabled_recorded_ = false;

  // Information source.
  // Use WeakPtr because the context menu may outlive |download_|.
  base::WeakPtr<DownloadUIModel> download_;
  std::unique_ptr<DownloadCommands> download_commands_;
};

#endif  // CHROME_BROWSER_DOWNLOAD_DOWNLOAD_UI_CONTEXT_MENU_H_