File: extensions_toolbar_controls.cc

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (128 lines) | stat: -rw-r--r-- 5,447 bytes parent folder | download
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2021 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/ui/views/extensions/extensions_toolbar_controls.h"

#include <memory>

#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/extensions/extension_action_view_controller.h"
#include "chrome/browser/ui/toolbar/toolbar_action_view_controller.h"
#include "chrome/browser/ui/views/extensions/extensions_request_access_button.h"
#include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h"
#include "content/public/browser/web_contents.h"
#include "extensions/browser/permissions_manager.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/views/background.h"

ExtensionsToolbarControls::ExtensionsToolbarControls(
    std::unique_ptr<ExtensionsToolbarButton> extensions_button,
    std::unique_ptr<ExtensionsRequestAccessButton> request_access_button)
    : ToolbarIconContainerView(/*uses_highlight=*/true),
      request_access_button_(AddChildView(std::move(request_access_button))),
      extensions_button_(extensions_button.get()) {
  request_access_button_->SetVisible(false);
  // TODO(emiliapaz): Consider changing AddMainItem() to receive a unique_ptr.
  AddMainItem(extensions_button.release());
}

ExtensionsToolbarControls::~ExtensionsToolbarControls() = default;

void ExtensionsToolbarControls::UpdateAllIcons() {}

void ExtensionsToolbarControls::UpdateControls(
    bool is_restricted_url,
    const std::vector<std::unique_ptr<ToolbarActionViewController>>& actions,
    extensions::PermissionsManager::UserSiteSetting site_setting,
    content::WebContents* current_web_contents,
    Browser* browser) {
  UpdateExtensionsButton(actions, site_setting, current_web_contents,
                         is_restricted_url);
  UpdateRequestAccessButton(actions, site_setting, current_web_contents);

  // Display background only when multiple buttons are visible. Since
  // the extensions button is always visible, check if the request access
  // button is too.
  SetBackground(request_access_button_->GetVisible()
                    ? views::CreateThemedRoundedRectBackground(
                          kColorExtensionsToolbarControlsBackground,
                          extensions_button_->GetPreferredSize().height())
                    : nullptr);

  // Resets the layout since layout animation does not handle host view
  // visibility changing. This should be called after any visibility changes.
  GetAnimatingLayoutManager()->ResetLayout();
}

void ExtensionsToolbarControls::UpdateExtensionsButton(
    const std::vector<std::unique_ptr<ToolbarActionViewController>>& actions,
    extensions::PermissionsManager::UserSiteSetting site_setting,
    content::WebContents* web_contents,
    bool is_restricted_url) {
  ExtensionsToolbarButton::State extensions_button_state =
      ExtensionsToolbarButton::State::kDefault;

  if (is_restricted_url || site_setting ==
                               extensions::PermissionsManager::UserSiteSetting::
                                   kBlockAllExtensions) {
    extensions_button_state =
        ExtensionsToolbarButton::State::kAllExtensionsBlocked;
  } else if (ExtensionActionViewController::AnyActionHasCurrentSiteAccess(
                 actions, web_contents)) {
    extensions_button_state =
        ExtensionsToolbarButton::State::kAnyExtensionHasAccess;
  }

  extensions_button_->UpdateState(extensions_button_state);
}

void ExtensionsToolbarControls::UpdateRequestAccessButton(
    const std::vector<std::unique_ptr<ToolbarActionViewController>>& actions,
    extensions::PermissionsManager::UserSiteSetting site_setting,
    content::WebContents* web_contents) {
  // Don't update the button if the confirmation message is currently showing;
  // it'll go away after a few seconds. Once the confirmation is collapsed,
  // button should be updated again.
  if (request_access_button_->IsShowingConfirmation()) {
    return;
  }

  // Extensions are included in the request access button only when the site
  // allows customizing site access by extension, and when the extension
  // itself can show access requests in the toolbar and hasn't been dismissed.
  std::vector<extensions::ExtensionId> extensions;
  if (site_setting ==
      extensions::PermissionsManager::UserSiteSetting::kCustomizeByExtension) {
    for (const auto& action : actions) {
      bool dismissed_requests =
          extensions::TabHelper::FromWebContents(web_contents)
              ->HasExtensionDismissedRequests(action->GetId());
      if (action->ShouldShowSiteAccessRequestInToolbar(web_contents) &&
          !dismissed_requests) {
        extensions.push_back(action->GetId());
      }
    }
  }

  request_access_button_->Update(extensions);
}

void ExtensionsToolbarControls::ResetConfirmation() {
  request_access_button_->ResetConfirmation();
}

bool ExtensionsToolbarControls::IsShowingConfirmation() const {
  return request_access_button_->IsShowingConfirmation();
}

bool ExtensionsToolbarControls::IsShowingConfirmationFor(
    const url::Origin& origin) const {
  return request_access_button_->IsShowingConfirmationFor(origin);
}

BEGIN_METADATA(ExtensionsToolbarControls, ToolbarIconContainerView)
END_METADATA