Merge pull request #11798 from brave/shields_mojom

Added site data observer to shields panel v2
This commit is contained in:
Taher
2022-01-11 06:19:42 -08:00
committed by GitHub
13 changed files with 239 additions and 26 deletions
+2
View File
@@ -95,6 +95,8 @@ source_set("ui") {
"toolbar/brave_recent_tabs_sub_menu_model.h",
"webui/brave_settings_ui.cc",
"webui/brave_settings_ui.h",
"webui/brave_shields/shields_data_handler.cc",
"webui/brave_shields/shields_data_handler.h",
"webui/brave_shields/shields_panel_handler.cc",
"webui/brave_shields/shields_panel_handler.h",
"webui/brave_shields/shields_panel_ui.cc",
+9 -2
View File
@@ -25,6 +25,9 @@ void BraveShieldsDataController::ClearAllResourcesList() {
resource_list_http_redirects_.clear();
resource_list_blocked_js_.clear();
resource_list_blocked_fingerprints_.clear();
for (Observer& obs : observer_list_)
obs.OnResourcesChanged();
}
void BraveShieldsDataController::AddObserver(Observer* obs) {
@@ -49,7 +52,11 @@ int BraveShieldsDataController::GetTotalBlockedCount() {
bool BraveShieldsDataController::GetIsBraveShieldsEnabled() {
auto* map = HostContentSettingsMapFactory::GetForProfile(
web_contents()->GetBrowserContext());
return brave_shields::GetBraveShieldsEnabled(map, web_contents()->GetURL());
return brave_shields::GetBraveShieldsEnabled(map, GetCurrentSiteURL());
}
GURL BraveShieldsDataController::GetCurrentSiteURL() {
return web_contents()->GetURL();
}
void BraveShieldsDataController::HandleItemBlocked(
@@ -68,7 +75,7 @@ void BraveShieldsDataController::HandleItemBlocked(
}
for (Observer& obs : observer_list_)
obs.OnResourcesCountChange(GetTotalBlockedCount());
obs.OnResourcesChanged();
}
WEB_CONTENTS_USER_DATA_KEY_IMPL(BraveShieldsDataController);
+2 -1
View File
@@ -30,7 +30,7 @@ class BraveShieldsDataController
class Observer : public base::CheckedObserver {
public:
virtual void OnResourcesCountChange(const int count) = 0;
virtual void OnResourcesChanged() = 0;
};
void HandleItemBlocked(const std::string& block_type,
@@ -38,6 +38,7 @@ class BraveShieldsDataController
void ClearAllResourcesList();
int GetTotalBlockedCount();
bool GetIsBraveShieldsEnabled();
GURL GetCurrentSiteURL();
void AddObserver(Observer* obs);
void RemoveObserver(Observer* obs);
@@ -171,7 +171,7 @@ void BraveShieldsActionView::Update() {
UpdateIconState();
}
void BraveShieldsActionView::OnResourcesCountChange(const int count) {
void BraveShieldsActionView::OnResourcesChanged() {
UpdateIconState();
}
@@ -33,13 +33,6 @@ class BraveShieldsActionView
// views::LabelButton:
std::unique_ptr<views::LabelButtonBorder> CreateDefaultBorder()
const override;
// brave_shields::BraveShieldsDataController
void OnResourcesCountChange(const int count) override;
// TabStripModelObserver
void OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) override;
SkPath GetHighlightPath() const;
private:
@@ -47,6 +40,13 @@ class BraveShieldsActionView
void UpdateIconState();
gfx::ImageSkia GetIconImage(bool is_enabled);
std::unique_ptr<IconWithBadgeImageSource> GetImageSource();
// brave_shields::BraveShieldsDataController
void OnResourcesChanged() override;
// TabStripModelObserver
void OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) override;
std::unique_ptr<WebUIBubbleManagerT<ShieldsPanelUI>> webui_bubble_manager_;
Profile* profile_ = nullptr;
@@ -0,0 +1,105 @@
// Copyright (c) 2021 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// you can obtain one at http://mozilla.org/MPL/2.0/.
#include <utility>
#include "brave/browser/ui/webui/brave_shields/shields_data_handler.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "ui/webui/mojo_bubble_web_ui_controller.h"
ShieldsDataHandler::ShieldsDataHandler(
mojo::PendingReceiver<brave_shields_panel::mojom::DataHandler>
data_handler_receiver,
ui::MojoBubbleWebUIController* webui_controller)
: data_handler_receiver_(this, std::move(data_handler_receiver)),
webui_controller_(webui_controller) {
auto* profile = Profile::FromWebUI(webui_controller_->web_ui());
DCHECK(profile);
Browser* browser = chrome::FindLastActiveWithProfile(profile);
browser->tab_strip_model()->AddObserver(this);
auto* shields_data_ctrlr = GetActiveShieldsDataController();
if (!shields_data_ctrlr)
return;
UpdateSiteBlockInfo();
shields_data_ctrlr->AddObserver(this);
}
ShieldsDataHandler::~ShieldsDataHandler() {
/* The lifecycle of this class is similar to ShieldsPanelUI and
* ShieldsPanelUI's cache gets destryed after ~300ms of being idle.
*/
auto* shields_data_ctrlr = GetActiveShieldsDataController();
if (!shields_data_ctrlr)
return;
shields_data_ctrlr->RemoveObserver(this);
}
void ShieldsDataHandler::RegisterUIHandler(
mojo::PendingRemote<brave_shields_panel::mojom::UIHandler>
ui_handler_receiver) {
ui_handler_remote_.Bind(std::move(ui_handler_receiver));
UpdateSiteBlockInfo();
}
void ShieldsDataHandler::GetSiteBlockInfo(GetSiteBlockInfoCallback callback) {
std::move(callback).Run(site_block_info_.Clone());
}
BraveShieldsDataController*
ShieldsDataHandler::GetActiveShieldsDataController() {
auto* profile = Profile::FromWebUI(webui_controller_->web_ui());
DCHECK(profile);
Browser* browser = chrome::FindLastActiveWithProfile(profile);
auto* web_contents = browser->tab_strip_model()->GetActiveWebContents();
if (web_contents) {
return BraveShieldsDataController::FromWebContents(web_contents);
}
return nullptr;
}
void ShieldsDataHandler::UpdateSiteBlockInfo() {
auto* shields_data_ctrlr = GetActiveShieldsDataController();
if (!shields_data_ctrlr)
return;
site_block_info_.host = shields_data_ctrlr->GetCurrentSiteURL().host();
site_block_info_.total_blocked_resources =
shields_data_ctrlr->GetTotalBlockedCount();
// Notify remote that data changed
if (ui_handler_remote_) {
ui_handler_remote_.get()->OnSiteBlockInfoChanged(site_block_info_.Clone());
}
}
void ShieldsDataHandler::OnResourcesChanged() {
UpdateSiteBlockInfo();
}
void ShieldsDataHandler::OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) {
if (selection.active_tab_changed()) {
// OnResourcesChanged doesnt get triggered instantly on active tab change so
// trigger this explicitly
UpdateSiteBlockInfo();
if (selection.new_contents) {
BraveShieldsDataController::FromWebContents(selection.new_contents)
->AddObserver(this);
}
if (selection.old_contents) {
BraveShieldsDataController::FromWebContents(selection.old_contents)
->RemoveObserver(this);
}
}
}
@@ -0,0 +1,61 @@
// Copyright (c) 2021 The Brave Authors. All rights reserved.
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// you can obtain one at http://mozilla.org/MPL/2.0/.
#ifndef BRAVE_BROWSER_UI_WEBUI_BRAVE_SHIELDS_SHIELDS_DATA_HANDLER_H_
#define BRAVE_BROWSER_UI_WEBUI_BRAVE_SHIELDS_SHIELDS_DATA_HANDLER_H_
#include "brave/browser/ui/brave_shields_data_controller.h"
#include "brave/components/brave_shields/common/brave_shields_panel.mojom.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote_set.h"
namespace ui {
class MojoBubbleWebUIController;
} // namespace ui
using brave_shields::BraveShieldsDataController;
using brave_shields_panel::mojom::SiteBlockInfo;
class ShieldsDataHandler : public brave_shields_panel::mojom::DataHandler,
public BraveShieldsDataController::Observer,
public TabStripModelObserver {
public:
ShieldsDataHandler(
mojo::PendingReceiver<brave_shields_panel::mojom::DataHandler>
data_handler_receiver,
ui::MojoBubbleWebUIController* webui_controller);
ShieldsDataHandler(const ShieldsDataHandler&) = delete;
ShieldsDataHandler& operator=(const ShieldsDataHandler&) = delete;
~ShieldsDataHandler() override;
// mojom::DataHandler
void RegisterUIHandler(
mojo::PendingRemote<brave_shields_panel::mojom::UIHandler>
ui_handler_receiver) override;
void GetSiteBlockInfo(GetSiteBlockInfoCallback callback) override;
private:
BraveShieldsDataController* GetActiveShieldsDataController();
void UpdateSiteBlockInfo();
// brave_shields::BraveShieldsDataController
void OnResourcesChanged() override;
// TabStripModelObserver
void OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) override;
mojo::Receiver<brave_shields_panel::mojom::DataHandler>
data_handler_receiver_;
mojo::Remote<brave_shields_panel::mojom::UIHandler> ui_handler_remote_;
ui::MojoBubbleWebUIController* const webui_controller_;
SiteBlockInfo site_block_info_;
};
#endif // BRAVE_BROWSER_UI_WEBUI_BRAVE_SHIELDS_SHIELDS_DATA_HANDLER_H_
@@ -46,13 +46,16 @@ void ShieldsPanelUI::BindInterface(
}
void ShieldsPanelUI::CreatePanelHandler(
mojo::PendingRemote<brave_shields_panel::mojom::Page> page,
mojo::PendingReceiver<brave_shields_panel::mojom::PanelHandler>
panel_receiver) {
DCHECK(page);
panel_receiver,
mojo::PendingReceiver<brave_shields_panel::mojom::DataHandler>
data_handler_receiver) {
auto* profile = Profile::FromWebUI(web_ui());
DCHECK(profile);
panel_handler_ =
std::make_unique<ShieldsPanelHandler>(std::move(panel_receiver), this);
data_handler_ = std::make_unique<ShieldsDataHandler>(
std::move(data_handler_receiver), this);
}
@@ -8,10 +8,10 @@
#include <memory>
#include "brave/browser/ui/webui/brave_shields/shields_data_handler.h"
#include "brave/browser/ui/webui/brave_shields/shields_panel_handler.h"
#include "brave/components/brave_shields/common/brave_shields_panel.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "ui/webui/mojo_bubble_web_ui_controller.h"
@@ -31,11 +31,13 @@ class ShieldsPanelUI : public ui::MojoBubbleWebUIController,
private:
void CreatePanelHandler(
mojo::PendingRemote<brave_shields_panel::mojom::Page> page,
mojo::PendingReceiver<brave_shields_panel::mojom::PanelHandler>
panel_receiver) override;
panel_receiver,
mojo::PendingReceiver<brave_shields_panel::mojom::DataHandler>
data_handler_receiver) override;
std::unique_ptr<ShieldsPanelHandler> panel_handler_;
std::unique_ptr<ShieldsDataHandler> data_handler_;
mojo::Receiver<brave_shields_panel::mojom::PanelHandlerFactory>
panel_factory_receiver_{this};
@@ -10,8 +10,8 @@ import "url/mojom/url.mojom";
// Used by the WebUI page to bootstrap bidirectional communication.
interface PanelHandlerFactory {
// The WebUI calls this method when the page is first initialized.
CreatePanelHandler(pending_remote<Page> page,
pending_receiver<PanelHandler> panel_handler);
CreatePanelHandler(pending_receiver<PanelHandler> panel_handler,
pending_receiver<DataHandler> data_handler);
};
// Browser-side handler for requests from WebUI page.
@@ -26,5 +26,16 @@ interface PanelHandler {
};
// WebUI-side handler for requests from the browser.
interface Page {
interface UIHandler {
OnSiteBlockInfoChanged(SiteBlockInfo site_block_info);
};
interface DataHandler {
RegisterUIHandler(pending_remote<UIHandler> ui_handler);
GetSiteBlockInfo() => (SiteBlockInfo site_block_info);
};
struct SiteBlockInfo {
string host;
int32 total_blocked_resources;
};
@@ -8,20 +8,20 @@ import * as BraveShields from 'gen/brave/components/brave_shields/common/brave_s
export * from 'gen/brave/components/brave_shields/common/brave_shields_panel.mojom.m.js'
interface API {
pageCallbackRouter: BraveShields.PageCallbackRouter
panelHandler: BraveShields.PanelHandlerRemote
dataHandler: BraveShields.DataHandlerRemote
}
let panelBrowserAPIInstance: API
class PanelBrowserAPI implements API {
pageCallbackRouter = new BraveShields.PageCallbackRouter()
panelHandler = new BraveShields.PanelHandlerRemote()
dataHandler = new BraveShields.DataHandlerRemote()
constructor () {
const factory = BraveShields.PanelHandlerFactory.getRemote()
factory.createPanelHandler(
this.pageCallbackRouter.$.bindNewPipeAndPassRemote(),
this.panelHandler.$.bindNewPipeAndPassReceiver()
this.panelHandler.$.bindNewPipeAndPassReceiver(),
this.dataHandler.$.bindNewPipeAndPassReceiver()
)
}
}
@@ -0,0 +1,19 @@
import * as React from 'react'
import getPanelBrowserAPI, { UIHandlerReceiver, SiteBlockInfo } from '../../api/panel_browser_api'
export function useGetShieldsData () {
const [siteBlockInfo, setSiteBlockInfo] = React.useState<SiteBlockInfo>()
React.useEffect(() => {
const uiHandlerReceiver = new UIHandlerReceiver({
onSiteBlockInfoChanged: (siteBlockInfo) => {
setSiteBlockInfo(siteBlockInfo)
}
})
getPanelBrowserAPI().dataHandler.registerUIHandler(
uiHandlerReceiver.$.bindNewPipeAndPassRemote())
}, [])
return { siteBlockInfo }
}
@@ -4,16 +4,18 @@ import * as S from './style'
import { FabulouslyLargeToggle } from '../../../../../web-components/toggle'
import AdvancedControlsContent from '../advanced-controls-content'
import { getLocale, splitStringForTag } from '../../../../../common/locale'
import { useGetShieldsData } from './hooks'
function MainPanel () {
const [isExpanded, setIsExpanded] = React.useState(false)
const braveShieldsUp = splitStringForTag(getLocale('braveShieldsUp'))
const braveShieldsBlockedNote = splitStringForTag(getLocale('braveShieldsBlockedNote'))
const { siteBlockInfo } = useGetShieldsData()
return (
<S.Box>
<S.PanelHeader>
<S.SiteTitle>brave.com</S.SiteTitle>
<S.SiteTitle>{siteBlockInfo?.host}</S.SiteTitle>
</S.PanelHeader>
<S.ToggleBox>
<FabulouslyLargeToggle
@@ -26,7 +28,7 @@ function MainPanel () {
{braveShieldsUp.afterTag}
</S.StatusText>
<S.BlockCountBox>
<S.BlockCount>21</S.BlockCount>
<S.BlockCount>{siteBlockInfo?.totalBlockedResources}</S.BlockCount>
<S.BlockNote>
{braveShieldsBlockedNote.beforeTag}
<a href="#">{braveShieldsBlockedNote.duringTag}</a>