blob: bb8b5940490a3b94f9204d11fad2418b5261de59 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/chrome_content_browser_client_webui_part.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/webui_url_constants.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents.h"
#include "extensions/common/constants.h"
#include "third_party/blink/public/common/web_preferences/web_preferences.h"
namespace {
// Returns whether any prefs were changed.
bool CopyFontPrefs(const blink::web_pref::WebPreferences& source,
blink::web_pref::WebPreferences* destination) {
bool changed = false;
changed |= destination->default_font_size != source.default_font_size;
changed |=
destination->default_fixed_font_size != source.default_fixed_font_size;
changed |= destination->minimum_font_size != source.minimum_font_size;
changed |= destination->minimum_logical_font_size !=
source.minimum_logical_font_size;
if (!changed) {
return false;
}
destination->default_font_size = source.default_font_size;
destination->default_fixed_font_size = source.default_fixed_font_size;
destination->minimum_font_size = source.minimum_font_size;
destination->minimum_logical_font_size = source.minimum_logical_font_size;
return true;
}
// Returns the visible URL or GURL() if unavailable.
GURL GetVisibleURL(content::WebContents* web_contents) {
if (!web_contents) {
return GURL();
}
content::NavigationEntry* entry =
web_contents->GetController().GetVisibleEntry();
return entry ? entry->GetURL() : GURL();
}
} // namespace
ChromeContentBrowserClientWebUiPart::ChromeContentBrowserClientWebUiPart() =
default;
ChromeContentBrowserClientWebUiPart::~ChromeContentBrowserClientWebUiPart() =
default;
void ChromeContentBrowserClientWebUiPart::OverrideWebkitPrefs(
content::WebContents* web_contents,
blink::web_pref::WebPreferences* web_prefs) {
// This logic is invoked at startup, and anytime the default prefs change.
GURL url = GetVisibleURL(web_contents);
if (!url.SchemeIs(content::kChromeUIScheme)) {
return;
}
// Use default font sizes for WebUi.
blink::web_pref::WebPreferences default_prefs;
CopyFontPrefs(/*source=*/default_prefs, /*destination=*/web_prefs);
#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP)
// Set some non-font prefs for webui tabstrip. The tabstrip renderer is never
// navigated to or from, so we don't need to replicate this logic in
// OverrideWebPreferencesAfterNavigation.
if (url.host_piece() == chrome::kChromeUITabStripHost) {
web_prefs->touch_drag_drop_enabled = true;
web_prefs->touch_dragend_context_menu = true;
}
#endif
}
bool ChromeContentBrowserClientWebUiPart::OverrideWebPreferencesAfterNavigation(
content::WebContents* web_contents,
blink::web_pref::WebPreferences* web_prefs) {
// This logic is invoked once on each navigation.
GURL url = GetVisibleURL(web_contents);
if (!url.is_valid()) {
return false;
}
// Extensions are handled by ChromeContentBrowserClientExtensionsPart.
const GURL& site_url =
web_contents->GetPrimaryMainFrame()->GetSiteInstance()->GetSiteURL();
if (site_url.SchemeIs(extensions::kExtensionScheme)) {
return false;
}
blink::web_pref::WebPreferences web_prefs_source;
if (url.SchemeIs(content::kChromeUIScheme)) {
// Use default prefs for WebUi. Not further modifications necessary for
// web_prefs_source.
} else {
// Use profile prefs for normal websites.
Profile* profile =
Profile::FromBrowserContext(web_contents->GetBrowserContext());
PrefService* prefs = profile->GetPrefs();
web_prefs_source.default_font_size =
prefs->GetInteger(prefs::kWebKitDefaultFontSize);
web_prefs_source.default_fixed_font_size =
prefs->GetInteger(prefs::kWebKitDefaultFixedFontSize);
web_prefs_source.minimum_font_size =
prefs->GetInteger(prefs::kWebKitMinimumFontSize);
web_prefs_source.minimum_logical_font_size =
prefs->GetInteger(prefs::kWebKitMinimumLogicalFontSize);
}
return CopyFontPrefs(web_prefs_source, web_prefs);
}