1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// Copyright 2022 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_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
#include <optional>
#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/views/toolbar/toolbar_chip_button.h"
#include "extensions/common/extension_id.h"
#include "ui/base/metadata/metadata_header_macros.h"
#include "url/origin.h"
namespace content {
class WebContents;
} // namespace content
class Browser;
class ExtensionsContainer;
class ExtensionsRequestAccessHoverCardCoordinator;
// Button in the toolbar bar that displays the extensions that requests
// access, and are allowed to do so, and grants them access.
class ExtensionsRequestAccessButton : public ToolbarChipButton,
public TabStripModelObserver {
METADATA_HEADER(ExtensionsRequestAccessButton, ToolbarChipButton)
public:
explicit ExtensionsRequestAccessButton(
Browser* browser,
ExtensionsContainer* extensions_container);
ExtensionsRequestAccessButton(const ExtensionsRequestAccessButton&) = delete;
const ExtensionsRequestAccessButton& operator=(
const ExtensionsRequestAccessButton&) = delete;
~ExtensionsRequestAccessButton() override;
// Updates the button visibility and content given `extension_ids`.
void Update(std::vector<extensions::ExtensionId>& extension_ids);
// Displays the button's hover card, if possible.
void MaybeShowHoverCard();
// Hides the button and resets the `confirmation_origin_` variable.
void ResetConfirmation();
// Returns whether the button is showing a confirmation message.
bool IsShowingConfirmation() const;
// Returns whether the button is showing a confirmation message for `origin`.
bool IsShowingConfirmationFor(const url::Origin& origin) const;
// Returns the number of extensions included in the button.
size_t GetExtensionsCount() const;
// ToolbarButton:
bool ShouldShowInkdropAfterIphInteraction() override;
// TabStripModelObserver:
void OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) override;
void TabChangedAt(content::WebContents* contents,
int index,
TabChangeType change_type) override;
// Accessors used by tests:
std::vector<extensions::ExtensionId> GetExtensionIdsForTesting() {
return extension_ids_;
}
ExtensionsRequestAccessHoverCardCoordinator*
GetHoverCardCoordinatorForTesting() {
return hover_card_coordinator_.get();
}
void remove_confirmation_for_testing(bool remove_confirmation) {
remove_confirmation_for_testing_ = remove_confirmation;
}
private:
void UpdateTooltipText();
// Grants one-time site access to `extension_ids` and shows a confirmation
// message on the button.
void OnButtonPressed();
content::WebContents* GetActiveWebContents() const;
raw_ptr<Browser> browser_;
raw_ptr<ExtensionsContainer> extensions_container_;
std::unique_ptr<ExtensionsRequestAccessHoverCardCoordinator>
hover_card_coordinator_;
// Extensions included in the request access button.
std::vector<extensions::ExtensionId> extension_ids_;
// The origin for which the button is displaying a confirmation message, if
// any.
std::optional<url::Origin> confirmation_origin_;
// A timer used to collapse the button after showing a confirmation message.
base::OneShotTimer collapse_timer_;
// Flag to not show confirmation message in tests.
bool remove_confirmation_for_testing_{false};
};
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
|