-
Notifications
You must be signed in to change notification settings - Fork 894
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feature(privacy): Add debug view to iOS to display blocked requests per-tab #26987
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// Copyright 2024 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 https://mozilla.org/MPL/2.0/. | ||
|
||
import BraveShields | ||
import Strings | ||
import SwiftUI | ||
|
||
struct AdblockBlockedRequestsView: View { | ||
|
||
let url: String | ||
@ObservedObject var contentBlockerHelper: ContentBlockerHelper | ||
|
||
@State private var filterText: String = "" | ||
|
||
private var blockedRequests: [BlockedRequestInfo] { | ||
let blockedRequests = Array(contentBlockerHelper.blockedRequests) | ||
guard !filterText.isEmpty else { | ||
return blockedRequests | ||
} | ||
return blockedRequests.filter { | ||
$0.requestURL.absoluteString.localizedCaseInsensitiveContains(filterText) | ||
|| $0.sourceURL.absoluteString.localizedCaseInsensitiveContains(filterText) | ||
|| $0.resourceType.rawValue.localizedCaseInsensitiveContains(filterText) | ||
|| $0.location.display.localizedCaseInsensitiveContains(filterText) | ||
} | ||
} | ||
|
||
public var body: some View { | ||
List { | ||
Section(header: Text(url)) { | ||
ForEach(blockedRequests) { request in | ||
VStack { | ||
row( | ||
title: String.localizedStringWithFormat("%@:", Strings.Shields.requestURLLabel), | ||
detail: request.requestURL.absoluteString | ||
) | ||
row( | ||
title: String.localizedStringWithFormat("%@:", Strings.Shields.sourceURLLabel), | ||
detail: request.sourceURL.absoluteString | ||
) | ||
row( | ||
title: String.localizedStringWithFormat("%@:", Strings.Shields.resourceTypeLabel), | ||
detail: request.resourceType.rawValue | ||
) | ||
row( | ||
title: String.localizedStringWithFormat("%@:", Strings.Shields.aggressiveLabel), | ||
detail: "\(request.isAggressive)" | ||
) | ||
row( | ||
title: String.localizedStringWithFormat("%@:", Strings.Shields.blockedByLabel), | ||
detail: request.location.display | ||
) | ||
} | ||
} | ||
} | ||
} | ||
.navigationTitle(Strings.Shields.blockedRequestsTitle) | ||
.toolbar(.visible) | ||
.searchable(text: $filterText) | ||
} | ||
|
||
@ViewBuilder private func row(title: String, detail: String) -> some View { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can drop |
||
Group { | ||
Text(title) | ||
Text(detail) | ||
.font(.system(.caption, design: .monospaced)) | ||
.textSelection(.enabled) | ||
} | ||
.font(.body) | ||
.frame(maxWidth: .infinity, alignment: .leading) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,13 +27,15 @@ struct ShieldsPanelView: View { | |
} | ||
|
||
private let url: URL | ||
private weak var tab: Tab? | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Probably doesn't need to be |
||
private let displayHost: String | ||
@AppStorage("advancedShieldsExpanded") private var advancedShieldsExpanded = false | ||
@ObservedObject private var viewModel: ShieldsSettingsViewModel | ||
private var actionCallback: (Action) -> Void | ||
|
||
@MainActor init(url: URL, tab: Tab, domain: Domain, callback: @escaping (Action) -> Void) { | ||
self.url = url | ||
self.tab = tab | ||
self.viewModel = ShieldsSettingsViewModel(tab: tab, domain: domain) | ||
self.actionCallback = callback | ||
self.displayHost = | ||
|
@@ -251,6 +253,25 @@ struct ShieldsPanelView: View { | |
.padding(.vertical, 4) | ||
} | ||
} | ||
if FeatureList.kBraveIOSDebugAdblock.enabled, let contentBlocker = tab?.contentBlocker { | ||
ShieldSettingRow { | ||
NavigationLink { | ||
AdblockBlockedRequestsView( | ||
url: url.baseDomain ?? url.absoluteDisplayString, | ||
contentBlockerHelper: contentBlocker | ||
) | ||
} label: { | ||
ShieldSettingsNavigationWrapper { | ||
Text(Strings.Shields.blockedRequestsTitle) | ||
.frame(maxWidth: .infinity, alignment: .leading) | ||
.multilineTextAlignment(.leading) | ||
} | ||
} | ||
.foregroundStyle(Color(.bravePrimary)) | ||
.frame(maxWidth: .infinity, alignment: .leading) | ||
.padding(.vertical, 4) | ||
} | ||
} | ||
} | ||
|
||
@ViewBuilder private var globalSettingsSectionView: some View { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -31,7 +31,7 @@ window.__firefox__.execute(function($) { | |
|
||
sendInfo.push({ | ||
resourceURL: resourceURL.href, | ||
sourceURL: document.location.href, | ||
sourceURL: $.windowOrigin, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this intended? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah this was missed in the local frames fix, just for our tracking protection stats. But this debug view feature piggy-backs on that script to catch requests blocked by the content blocker (as opposed to blocked by our request blocking scripts). Some additional info w/ examples. |
||
resourceType: resourceType | ||
}); | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -113,6 +113,75 @@ extension Strings.Shields { | |
) | ||
} | ||
|
||
// MARK: - Adblock Debugging | ||
|
||
extension Strings.Shields { | ||
public static let blockedRequestsTitle = NSLocalizedString( | ||
"blockedRequestsTitle", | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You may want to prefix these strings with |
||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Blocked Requests", | ||
comment: | ||
"The title displayed in the navigation bar of Blocked Requests view." | ||
) | ||
public static let requestURLLabel = NSLocalizedString( | ||
"requestURLLabel", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Request URL", | ||
comment: | ||
"A label displayed above the request url that was blocked in Blocked Requests view." | ||
) | ||
public static let sourceURLLabel = NSLocalizedString( | ||
"sourceURLLabel", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Source URL", | ||
comment: | ||
"A label displayed above the source url of a request that was blocked in Blocked Requests view." | ||
) | ||
public static let resourceTypeLabel = NSLocalizedString( | ||
"resourceTypeLabel", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Resource Type", | ||
comment: | ||
"A label displayed above the resource type of a request that was blocked in Blocked Requests view." | ||
) | ||
public static let aggressiveLabel = NSLocalizedString( | ||
"aggressiveLabel", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Aggressive", | ||
comment: | ||
"A label displayed above a value indicating if the site is in aggressive mode in Blocked Requests view." | ||
) | ||
public static let blockedByLabel = NSLocalizedString( | ||
"blockedByLabel", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Blocked By", | ||
comment: | ||
"A label displayed above the location a request was blocked in Blocked Requests view." | ||
) | ||
public static let contentBlocker = NSLocalizedString( | ||
"contentBlocker", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Content Blocker", | ||
comment: | ||
"Used to describe when a request was blocked by the Content Blocker in Blocked Requests view." | ||
) | ||
public static let requestBlocking = NSLocalizedString( | ||
"requestBlocking", | ||
tableName: "BraveShared", | ||
bundle: .module, | ||
value: "Request Blocking", | ||
comment: | ||
"Used to describe when a request was blocked by our request blocking scripts in Blocked Requests view." | ||
) | ||
} | ||
|
||
// MARK: - Anti Ad-Block Warning | ||
|
||
extension Strings.Shields { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if filterText.isEmpty
would be easier to parse