Skip to content
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

Include component versions in webcompat reports #25688

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6805d6d
adding mojo interface
vadimstruts Sep 20, 2024
1fb1849
adding webcompat service
vadimstruts Sep 21, 2024
b58d7eb
added using of the same code for sending webcompat report
vadimstruts Sep 24, 2024
85453bc
changed to use just common c++ uploader for desktop + android, starte…
vadimstruts Sep 27, 2024
dadc485
adding tests for webcompat service
vadimstruts Sep 28, 2024
7211759
adding tests for webcompat service
vadimstruts Oct 1, 2024
d9f67b6
adding tests for webcompat service
vadimstruts Oct 1, 2024
9d0cdee
adding tests for webcompat service + fix format
vadimstruts Oct 2, 2024
9e91ef6
fix format
vadimstruts Oct 2, 2024
9624dbd
fix format
vadimstruts Oct 2, 2024
75c48be
deps
vadimstruts Oct 2, 2024
d111490
fix unittest
vadimstruts Oct 2, 2024
58897f2
removed unneded callback
vadimstruts Oct 2, 2024
b54f416
added iOS part
vadimstruts Oct 10, 2024
55200ad
added fix for deps
vadimstruts Oct 10, 2024
f9ab08f
fix for dep #2
Oct 10, 2024
d8e5396
fix unittest
vadimstruts Oct 10, 2024
90526f8
fix format
vadimstruts Oct 11, 2024
0cfdd5f
fix ios build
vadimstruts Oct 11, 2024
9fb7f27
fix android build
vadimstruts Oct 11, 2024
614e89e
removed unneeded comments
vadimstruts Oct 11, 2024
0572ce7
removed deps
vadimstruts Oct 11, 2024
af1c5a9
fixes according suggestions
vadimstruts Oct 16, 2024
fa97d03
fixes according suggestions
vadimstruts Oct 16, 2024
d5c79c8
fixes according suggestions
vadimstruts Oct 16, 2024
8ef9d2a
fixes according suggestions
vadimstruts Oct 16, 2024
23f12db
removed unneeded comment
vadimstruts Oct 16, 2024
a4125ba
fixed for review
vadimstruts Oct 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions android/brave_java_sources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,7 @@ brave_java_sources = [
"../../brave/android/java/org/chromium/chrome/browser/vpn/wireguard/WireguardConfigUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/vpn/wireguard/WireguardServiceImpl.java",
"../../brave/android/java/org/chromium/chrome/browser/vpn/wireguard/WireguardUtils.java",
"../../brave/android/java/org/chromium/chrome/browser/webcompat_reporter/WebcompatReporterServiceFactory.java",
"../../brave/android/java/org/chromium/chrome/browser/widget/quickactionsearchandbookmark/QuickActionSearchAndBookmarkWidgetProvider.java",
"../../brave/android/java/org/chromium/chrome/browser/widget/quickactionsearchandbookmark/promo/SearchWidgetPromoPanel.java",
"../../brave/android/java/org/chromium/chrome/browser/widget/quickactionsearchandbookmark/utils/BraveSearchWidgetUtils.java",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@
import org.chromium.base.BraveFeatureList;
import org.chromium.base.Log;
import org.chromium.base.SysUtils;
import org.chromium.base.task.AsyncTask;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.BraveRewardsHelper;
import org.chromium.chrome.browser.BraveRewardsNativeWorker;
Expand All @@ -52,24 +51,28 @@
import org.chromium.chrome.browser.customtabs.CustomTabActivity;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder;
import org.chromium.chrome.browser.ntp_background_images.NTPBackgroundImagesBridge;
import org.chromium.chrome.browser.onboarding.OnboardingPrefManager;
import org.chromium.chrome.browser.preferences.website.BraveShieldsContentSettings;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.util.ConfigurationUtils;
import org.chromium.chrome.browser.webcompat_reporter.WebcompatReporterServiceFactory;
import org.chromium.components.browser_ui.widget.ChromeDialog;
import org.chromium.components.version_info.BraveVersionConstants;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.system.MojoException;
import org.chromium.ui.widget.ChromeImageButton;
import org.chromium.webcompat_reporter.mojom.ReportInfo;
import org.chromium.webcompat_reporter.mojom.WebcompatReporterHandler;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
* Object responsible for handling the creation, showing, hiding of the BraveShields menu.
*/
public class BraveShieldsHandler implements BraveRewardsHelper.LargeIconReadyCallback {
/** Object responsible for handling the creation, showing, hiding of the BraveShields menu. */
public class BraveShieldsHandler
implements BraveRewardsHelper.LargeIconReadyCallback, ConnectionErrorHandler {
private static final String TAG = "BraveShieldsHandler";
private static final int URL_SPEC_MAX_LINES = 3;
private static final String CHROME_ERROR = "chrome-error://";
Expand Down Expand Up @@ -136,6 +139,8 @@ public BlockersInfo() {
private TextView mViewScreenshot;
private byte[] mScreenshotBytes;

private WebcompatReporterHandler mWebcompatReporterHandler;

private static Context scanForActivity(Context cont) {
if (cont == null) {
return null;
Expand Down Expand Up @@ -315,6 +320,16 @@ private PopupWindow showPopupMenu(View anchorView) {
return popupWindow;
}

@Override
public void onConnectionError(MojoException e) {
initWebcompatReporterService();
}

private void initWebcompatReporterService() {
mWebcompatReporterHandler =
WebcompatReporterServiceFactory.getInstance().getWebcompatReporterHandler(this);
}

public void updateUrlSpec(String urlSpec) {
mUrlSpec = urlSpec;
}
Expand Down Expand Up @@ -398,6 +413,9 @@ public void hideBraveShieldsMenu() {
if (isShowing()) {
mPopupWindow.dismiss();
}
if (null != mWebcompatReporterHandler) {
mWebcompatReporterHandler.close();
}
}

private void initViews() {
Expand Down Expand Up @@ -488,6 +506,8 @@ public void onClick(View view) {
setUpSecondaryLayout();

setupMainSwitchClick(mShieldMainSwitch);

initWebcompatReporterService();
}

private void shareStats() {
Expand Down Expand Up @@ -824,20 +844,22 @@ public void onClick(View view) {
public void onClick(View view) {
// Profile.getLastUsedRegularProfile requires to run in UI thread,
// so get api key here and pass it to IO worker task
String referralApiKey =
NTPBackgroundImagesBridge.getInstance(mProfile).getReferralApiKey();
BraveShieldsUtils.BraveShieldsWorkerTask mWorkerTask =
new BraveShieldsUtils.BraveShieldsWorkerTask(
siteUrl,
referralApiKey,
isScreenshotAvailable() ? mScreenshotBytes : null);
mWorkerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
mWebcompatReporterHandler.submitWebcompatReport(getReportInfo(siteUrl));
mReportBrokenSiteLayout.setVisibility(View.GONE);
mThankYouLayout.setVisibility(View.VISIBLE);
}
});
}

private ReportInfo getReportInfo(String siteUrl) {
ReportInfo reportInfo = new ReportInfo();
reportInfo.channel = BraveVersionConstants.CHANNEL;
reportInfo.braveVersion = BraveVersionConstants.VERSION;
reportInfo.reportUrl = siteUrl;
reportInfo.screenshotPng = isScreenshotAvailable() ? mScreenshotBytes : null;
return reportInfo;
}

private void setUpViewScreenshot(byte[] pngBytes) {
mViewScreenshot.setVisibility(View.VISIBLE);
mViewScreenshot.setText(getScreenshotSpinnableString(pngBytes));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* Copyright (c) 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/. */

package org.chromium.chrome.browser.webcompat_reporter;

import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;

import org.chromium.chrome.browser.crypto_wallet.util.Utils;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.mojo.bindings.ConnectionErrorHandler;
import org.chromium.mojo.bindings.Interface;
import org.chromium.mojo.bindings.Interface.Proxy.Handler;
import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojo.system.impl.CoreImpl;
import org.chromium.webcompat_reporter.mojom.WebcompatReporterHandler;

@JNINamespace("chrome::android")
public class WebcompatReporterServiceFactory {
private static final Object sLock = new Object();
private static WebcompatReporterServiceFactory sInstance;

public static WebcompatReporterServiceFactory getInstance() {
synchronized (sLock) {
if (sInstance == null) {
sInstance = new WebcompatReporterServiceFactory();
}
}
return sInstance;
}

private WebcompatReporterServiceFactory() {}

public WebcompatReporterHandler getWebcompatReporterHandler(
ConnectionErrorHandler connectionErrorHandler) {
Profile profile = Utils.getProfile(false); // Always use regular profile
long nativeHandle =
WebcompatReporterServiceFactoryJni.get()
.getInterfaceToWebcompatReporterService(profile);
if (nativeHandle == -1) {
return null;
}
MessagePipeHandle handle = wrapNativeHandle(nativeHandle);
WebcompatReporterHandler webcompatReporterHandler =
WebcompatReporterHandler.MANAGER.attachProxy(handle, 0);
Handler handler = ((Interface.Proxy) webcompatReporterHandler).getProxyHandler();
handler.setErrorHandler(connectionErrorHandler);

return webcompatReporterHandler;
}

private MessagePipeHandle wrapNativeHandle(long nativeHandle) {
return CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle();
}

@NativeMethods
interface Natives {
long getInterfaceToWebcompatReporterService(Profile profile);
}
}
3 changes: 3 additions & 0 deletions browser/browser_context_keyed_service_factories.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "brave/browser/search_engines/search_engine_tracker.h"
#include "brave/browser/sync/brave_sync_alerts_service_factory.h"
#include "brave/browser/url_sanitizer/url_sanitizer_service_factory.h"
#include "brave/browser/webcompat_reporter/webcompat_reporter_service_factory.h"
#include "brave/components/ai_chat/core/common/buildflags/buildflags.h"
#include "brave/components/brave_perf_predictor/browser/named_third_party_registry_factory.h"
#include "brave/components/brave_vpn/common/buildflags/buildflags.h"
Expand Down Expand Up @@ -133,6 +134,8 @@ void EnsureBrowserContextKeyedServiceFactoriesBuilt() {
ntp_background_images::NTPBackgroundImagesBridgeFactory::GetInstance();
#endif

webcompat_reporter::WebcompatReporterServiceFactory::GetInstance();

brave_news::BraveNewsControllerFactory::GetInstance();
brave_wallet::AssetRatioServiceFactory::GetInstance();
brave_wallet::MeldIntegrationServiceFactory::GetInstance();
Expand Down
3 changes: 3 additions & 0 deletions browser/sources.gni
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import("//brave/browser/sync/sources.gni")
import("//brave/browser/themes/sources.gni")
import("//brave/browser/url_sanitizer/sources.gni")
import("//brave/browser/web_discovery/sources.gni")
import("//brave/browser/webcompat_reporter/sources.gni")
import("//brave/build/config.gni")
import("//brave/chromium_src/chrome/browser/prefs/sources.gni")
import("//brave/chromium_src/chrome/browser/sources.gni")
Expand Down Expand Up @@ -552,6 +553,7 @@ brave_chrome_browser_sources += brave_browser_sync_sources
brave_chrome_browser_sources += brave_browser_themes_sources
brave_chrome_browser_sources += brave_browser_url_sanitizer_sources
brave_chrome_browser_sources += brave_browser_web_discovery_sources
brave_chrome_browser_sources += brave_browser_webcompat_reporter_sources

brave_chrome_browser_deps += brave_browser_autocomplete_deps
brave_chrome_browser_deps += brave_browser_brave_news_deps
Expand Down Expand Up @@ -584,6 +586,7 @@ brave_chrome_browser_deps += brave_browser_sync_deps
brave_chrome_browser_deps += brave_browser_themes_deps
brave_chrome_browser_deps += brave_browser_url_sanitizer_deps
brave_chrome_browser_deps += brave_browser_web_discovery_deps
brave_chrome_browser_deps += brave_browser_webcompat_reporter_deps
brave_chrome_browser_deps += brave_chromium_src_chrome_browser_deps
brave_chrome_browser_deps += brave_chromium_src_chrome_browser_prefs_deps

Expand Down
1 change: 1 addition & 0 deletions browser/ui/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ source_set("ui") {
"webui/webcompat_reporter/webcompat_reporter_ui.cc",
"webui/webcompat_reporter/webcompat_reporter_ui.h",
]
deps += [ "//brave/components/webcompat_reporter/common:mojom" ]
}

if (enable_ai_chat) {
Expand Down
69 changes: 30 additions & 39 deletions browser/ui/webui/webcompat_reporter/webcompat_reporter_ui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@
#include "brave/browser/brave_browser_process.h"
#include "brave/browser/ui/webui/brave_webui_source.h"
#include "brave/browser/ui/webui/webcompat_reporter/webcompat_reporter_dialog.h"
#include "brave/browser/webcompat_reporter/webcompat_reporter_service_factory.h"
#include "brave/common/brave_channel_info.h"
#include "brave/components/brave_shields/content/browser/ad_block_service.h"
#include "brave/components/brave_shields/core/browser/ad_block_component_service_manager.h"
#include "brave/components/brave_shields/core/browser/filter_list_catalog_entry.h"
#include "brave/components/brave_shields/core/common/pref_names.h"
#include "brave/components/brave_vpn/common/buildflags/buildflags.h"
#include "brave/components/webcompat_reporter/browser/fields.h"
#include "brave/components/webcompat_reporter/browser/webcompat_reporter_service.h"
#include "brave/components/webcompat_reporter/resources/grit/webcompat_reporter_generated_map.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
Expand All @@ -50,12 +52,15 @@ namespace {
constexpr char kUISourceHistogramName[] = "Brave.Webcompat.UISource";
constexpr int kMaxScreenshotPixelCount = 1280 * 720;

std::string BoolToString(bool value) {
return value ? "true" : "false";
}

} // namespace

WebcompatReporterDOMHandler::WebcompatReporterDOMHandler(Profile* profile)
: ui_task_runner_(base::SequencedTaskRunner::GetCurrentDefault()),
uploader_(std::make_unique<webcompat_reporter::WebcompatReportUploader>(
profile->GetURLLoaderFactory())) {
pending_report_(mojom::ReportInfo::New()) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);

InitAdditionalParameters(profile);
Expand All @@ -72,40 +77,21 @@ WebcompatReporterDOMHandler::WebcompatReporterDOMHandler(Profile* profile)
}

void WebcompatReporterDOMHandler::InitAdditionalParameters(Profile* profile) {
std::vector<std::string> ad_block_list_names;

// Collect all enabled adblock list names
brave_shields::AdBlockService* ad_block_service =
g_brave_browser_process->ad_block_service();
if (ad_block_service != nullptr) {
brave_shields::AdBlockComponentServiceManager* service_manager =
ad_block_service->component_service_manager();
CHECK(service_manager);
for (const brave_shields::FilterListCatalogEntry& entry :
service_manager->GetFilterListCatalog()) {
if (service_manager->IsFilterListEnabled(entry.uuid)) {
ad_block_list_names.push_back(entry.title);
}
}
}

pending_report_.ad_block_list_names =
base::JoinString(ad_block_list_names, ",");

#if BUILDFLAG(ENABLE_BRAVE_VPN)
brave_vpn::BraveVpnService* vpn_service =
brave_vpn::BraveVpnServiceFactory::GetForProfile(profile);
if (vpn_service != nullptr) {
pending_report_.brave_vpn_connected = vpn_service->IsConnected();
pending_report_->brave_vpn_connected =
BoolToString(vpn_service->IsConnected());
}
#endif

PrefService* profile_prefs = profile->GetPrefs();
pending_report_.languages =
pending_report_->languages =
profile_prefs->GetString(language::prefs::kAcceptLanguages);
pending_report_.language_farbling =
profile_prefs->GetBoolean(brave_shields::prefs::kReduceLanguageEnabled);
pending_report_.channel = brave::GetChannelName();
pending_report_->language_farbling = BoolToString(
profile_prefs->GetBoolean(brave_shields::prefs::kReduceLanguageEnabled));
pending_report_->channel = brave::GetChannelName();
}

WebcompatReporterDOMHandler::~WebcompatReporterDOMHandler() = default;
Expand Down Expand Up @@ -193,7 +179,7 @@ void WebcompatReporterDOMHandler::HandleEncodedScreenshotPNG(
RejectJavascriptCallback(callback_id, {});
return;
}
pending_report_.screenshot_png = encoded_png;
pending_report_->screenshot_png = encoded_png;
ResolveJavascriptCallback(callback_id, {});
}

Expand All @@ -203,18 +189,18 @@ void WebcompatReporterDOMHandler::HandleGetCapturedScreenshot(

AllowJavascript();

if (!pending_report_.screenshot_png) {
if (!pending_report_->screenshot_png) {
RejectJavascriptCallback(args[0], {});
return;
}

auto screenshot_b64 = base::Base64Encode(*pending_report_.screenshot_png);
auto screenshot_b64 = base::Base64Encode(*pending_report_->screenshot_png);
ResolveJavascriptCallback(args[0], screenshot_b64);
}

void WebcompatReporterDOMHandler::HandleClearScreenshot(
const base::Value::List& args) {
pending_report_.screenshot_png = std::nullopt;
pending_report_->screenshot_png = std::nullopt;
}

void WebcompatReporterDOMHandler::HandleSubmitReport(
Expand All @@ -233,8 +219,8 @@ void WebcompatReporterDOMHandler::HandleSubmitReport(
submission_args.FindString(kFPBlockSettingField);
const base::Value* details_arg = submission_args.Find(kDetailsField);
const base::Value* contact_arg = submission_args.Find(kContactField);
pending_report_.shields_enabled =
submission_args.FindBool(kShieldsEnabledField).value_or(false);
pending_report_->shields_enabled = BoolToString(
submission_args.FindBool(kShieldsEnabledField).value_or(false));

const auto ui_source_int = submission_args.FindInt(kUISourceField);
if (ui_source_int) {
Expand All @@ -243,22 +229,27 @@ void WebcompatReporterDOMHandler::HandleSubmitReport(
}

if (url_arg != nullptr) {
pending_report_.report_url = GURL(*url_arg);
pending_report_->report_url = *url_arg;
}
if (ad_block_setting_arg != nullptr) {
pending_report_.ad_block_setting = *ad_block_setting_arg;
pending_report_->ad_block_setting = *ad_block_setting_arg;
}
if (fp_block_setting_arg != nullptr) {
pending_report_.fp_block_setting = *fp_block_setting_arg;
pending_report_->fp_block_setting = *fp_block_setting_arg;
}
if (details_arg != nullptr) {
pending_report_.details = details_arg->Clone();
pending_report_->details = details_arg->GetString();
}
if (contact_arg != nullptr) {
pending_report_.contact = contact_arg->Clone();
pending_report_->contact = contact_arg->GetString();
}

uploader_->SubmitReport(pending_report_);
auto* reporter_service =
WebcompatReporterServiceFactory::GetServiceForContext(
Profile::FromWebUI(web_ui()));
if (reporter_service) {
reporter_service->SubmitWebcompatReport(pending_report_->Clone());
}
}

WebcompatReporterUI::WebcompatReporterUI(content::WebUI* web_ui)
Expand Down
Loading
Loading