关于 Chromium 的部分研究-2022年2月
本文为 Dimole 在2022年2月更新迪莫乐浏览器时对 Chromium 的部分研究
前情
这个月搞的内容这些其实在之前的版本就已经做了,但是买到的黑片固态不给力导致数据丢失,现在从头来过。(
使用非谷歌搜索引擎时启用新标签页的搜索框
通过调试及 Chromium Code Search 易知, Chromium 新标签页的谷歌版和非谷歌版的区别在 chrome/browser/search/search.cc
中的
const GURL local_url(DefaultSearchProviderIsGoogle(profile)
? chrome::kChromeUINewTabPageURL
: chrome::kChromeUINewTabPageThirdPartyURL);
进行了判断( kChromeUINewTabPageURL 为谷歌版)
事实上,只需要让 DefaultSearchProviderIsGoogle 永远返回 true 来“欺骗” Chromium 就可以做到永远显示谷歌版的带搜索框的新标签页了。也许会有 Bug ,不管了,又不是不能用.jpg
而 DefaultSearchProviderIsGoogle 的最终定义在 components/search/search.cc
中
bool DefaultSearchProviderIsGoogle(
const TemplateURLService* template_url_service) {
if (!template_url_service)
return false;
const TemplateURL* default_provider =
template_url_service->GetDefaultSearchProvider();
if (!default_provider)
return false;
return default_provider->GetEngineType(
template_url_service->search_terms_data()) ==
SearchEngineType::SEARCH_ENGINE_GOOGLE;
}
把这里的代码改掉即可。
为了防止没有搜索引擎等特殊情况时产生更多 Bug ,我只把最后对谷歌的判断改了,即
bool DefaultSearchProviderIsGoogle(
const TemplateURLService* template_url_service) {
if (!template_url_service)
return false;
const TemplateURL* default_provider =
template_url_service->GetDefaultSearchProvider();
if (!default_provider)
return false;
return true;
}
开启“下载前询问每个文件的保存位置”时让下载的 .crx 扩展能自动安装
这个实际上是 Chromium 代码有个判断,如果提示用户输入保存位置,那这个下载对象就作为普通文件,而不会作扩展程序。
可以很容易定位到相关的代码在 chrome/browser/download/download_crx_util.cc
中
bool IsExtensionDownload(const DownloadItem& download_item) {
if (download_item.GetTargetDisposition() ==
DownloadItem::TARGET_DISPOSITION_PROMPT)
return false;
这里直接把这第一个判断注释即可。
给刷新按钮增加开发者工具的高级菜单
这个菜单实际上开启开发者工具的时候就会自动启用,但是可以修改代码让其始终启用。
可以很容易定位到相关的代码在 chrome/browser/ui/views/toolbar/reload_button.cc
中
void ReloadButton::SetMenuEnabled(bool enable) {
menu_enabled_ = enable;
}
直接简单粗暴把 enable
改成 true
。
默认关闭谷歌登录功能
谷歌实在是作恶多端,把第三方 Chromium 对 API 的访问限制了,导致不能登录谷歌进行云同步。
这里不如直接把功能关了,眼不见心不烦。还是可以很容易定位到相关的代码在 chrome/browser/signin/account_consistency_mode_manager.cc
中
registry->RegisterBooleanPref(prefs::kSigninAllowedOnNextStartup, true);
经典的改法,true
改 false
默认开启滚动标签页及按钮
这个功能 Chromium 很早就已经做到了,不过是处于默认禁用的状态。
在 chrome/browser/ui/ui_features.cc
中
// Enables tabs to scroll in the tabstrip. https://crbug.com/951078
const base::Feature kScrollableTabStrip{"ScrollableTabStrip",
base::FEATURE_DISABLED_BY_DEFAULT};
const char kMinimumTabWidthFeatureParameterName[] = "minTabWidth";
// Enables buttons to permanently appear on the tabstrip when
// scrollable-tabstrip is enabled. https://crbug.com/1116118
const base::Feature kScrollableTabStripButtons{
"ScrollableTabStripButtons", base::FEATURE_DISABLED_BY_DEFAULT};
把 base::FEATURE_DISABLED_BY_DEFAULT
改成 base::FEATURE_ENABLED_BY_DEFAULT
光改这俩还不够,因为 feature 里面没有默认值,可以修改默认值,也可以直接在代码里改,我是直接动代码。
即 chrome/browser/ui/views/tabs/tab_style_views.cc
中活跃标签的
int TabStyleViews::GetMinimumActiveWidth() {
int min_active_width =
TabCloseButton::GetGlyphSize() + GetContentsHorizontalInsetSize() * 2;
if (base::FeatureList::IsEnabled(features::kScrollableTabStrip)) {
return std::max(
min_active_width,
base::GetFieldTrialParamByFeatureAsInt(
features::kScrollableTabStrip,
features::kMinimumTabWidthFeatureParameterName, min_active_width));
}
return min_active_width;
}
把 GetFieldTrialParamByFeatureAsInt
里的 min_active_width
改成想要的默认值,例如140。
还有非活跃标签的
int TabStyleViews::GetMinimumInactiveWidth() {
// Allow tabs to shrink until they appear to be 16 DIP wide excluding
// outer corners.
constexpr int kInteriorWidth = 16;
// The overlap contains the trailing separator that is part of the interior
// width; avoid double-counting it.
int min_inactive_width =
kInteriorWidth - GetSeparatorSize().width() + GetTabOverlap();
if (base::FeatureList::IsEnabled(features::kScrollableTabStrip)) {
return std::max(min_inactive_width,
base::GetFieldTrialParamByFeatureAsInt(
features::kScrollableTabStrip,
features::kMinimumTabWidthFeatureParameterName,
min_inactive_width));
}
return min_inactive_width;
}
min_inactive_width
同理。
设置默认搜索引擎为百度
由于众所周知的原因,Chromium 默认的谷歌在大陆是无法使用的,这里把它改成百度。components/search_engines/template_url_prepopulate_data.cc
中的
std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
PrefService* prefs,
size_t* default_search_provider_index) {
// If there is a set of search engines in the preferences file, it overrides
// the built-in set.
std::vector<std::unique_ptr<TemplateURLData>> t_urls =
GetPrepopulatedTemplateURLData(prefs);
if (t_urls.empty()) {
t_urls = GetPrepopulationSetFromCountryID(
country_codes::GetCountryIDFromPrefs(prefs));
}
if (default_search_provider_index) {
const auto itr = std::find_if(
t_urls.begin(), t_urls.end(),
[](const auto& t_url) { return t_url->prepopulate_id == google.id; });
*default_search_provider_index =
itr == t_urls.end() ? 0 : std::distance(t_urls.begin(), itr);
}
return t_urls;
}
把 google.id
改成 baidu.id
增加 H.265 的软解码支持
这个太多了,先放着,未完待续,咕咕咕(
最后宣传下我的浏览器不过分吧(
下载地址:https://llq.dml.ink