Dimole
文章9
标签13
分类6
关于 Chromium 的部分研究-2022年2月

关于 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);

经典的改法,truefalse

默认开启滚动标签页及按钮

这个功能 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

本文作者:Dimole
本文链接:https://blog.dml.ink/2022/02/04/chromium-202202/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可