From: uazo Date: Tue, 5 Oct 2021 08:38:52 +0000 Subject: Site setting for images Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html Require: Content-settings-infrastructure.patch --- .../res/drawable-hdpi/permission_images.png | Bin 0 -> 257 bytes .../res/drawable-mdpi/permission_images.png | Bin 0 -> 186 bytes .../res/drawable-xhdpi/permission_images.png | Bin 0 -> 316 bytes .../res/drawable-xxhdpi/permission_images.png | Bin 0 -> 449 bytes .../drawable-xxxhdpi/permission_images.png | Bin 0 -> 532 bytes .../impl/BromiteImagesContentSetting.java | 93 ++++++++++++++++++ .../bromite_content_settings/images.grdp | 23 +++++ .../bromite_content_settings/images.inc | 6 ++ .../core/browser/content_settings_registry.cc | 3 +- .../renderer/content_settings_agent_impl.cc | 15 +++ .../renderer/content_settings_agent_impl.h | 2 + .../platform/web_content_settings_client.h | 5 + .../blink/renderer/core/frame/local_frame.cc | 13 --- .../blink/renderer/core/frame/local_frame.h | 6 -- .../renderer/core/html/image_document.cc | 9 +- .../core/loader/frame_fetch_context.cc | 14 ++- .../core/loader/frame_fetch_context.h | 2 +- third_party/blink/renderer/core/page/page.cc | 5 +- .../platform/loader/fetch/fetch_context.h | 2 +- .../platform/loader/fetch/resource_fetcher.cc | 17 +++- .../platform/loader/fetch/resource_fetcher.h | 2 + 21 files changed, 180 insertions(+), 37 deletions(-) create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-hdpi/permission_images.png create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-mdpi/permission_images.png create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-xhdpi/permission_images.png create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-xxhdpi/permission_images.png create mode 100644 components/browser_ui/site_settings/android/java/res/drawable-xxxhdpi/permission_images.png create mode 100644 components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteImagesContentSetting.java create mode 100644 components/browser_ui/strings/bromite_content_settings/images.grdp create mode 100644 components/content_settings/core/browser/bromite_content_settings/images.inc diff --git a/components/browser_ui/site_settings/android/java/res/drawable-hdpi/permission_images.png b/components/browser_ui/site_settings/android/java/res/drawable-hdpi/permission_images.png new file mode 100644 index 0000000000000000000000000000000000000000..cafee5acf2299e534676a15fb029192e066551c9 GIT binary patch literal 257 zcmV+c0sj7pP)B>S3zFJ)`~-FbLEB zAW2Bk5_vR~8KEwso}fXP_D5Pq{*3w0DQX)*gD~xnN{fodD3paF?-Mi#Y(GH| zZWQ&MkU`N5M1hFpL7hb?uSFuCQmA700000NkvXX Hu0mjfaQkDG literal 0 HcmV?d00001 diff --git a/components/browser_ui/site_settings/android/java/res/drawable-mdpi/permission_images.png b/components/browser_ui/site_settings/android/java/res/drawable-mdpi/permission_images.png new file mode 100644 index 0000000000000000000000000000000000000000..52435094e69ea5278e5c2a60238c7c374961ef08 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iMo$;VkP60Ri7g6uj9(RAslQ|J zDR75+7h6ZspQr%SKk7Uy7bS)`KY4!Q!HV@QrgIuMJ4s3?32|iJ5IZHaQ|QdA<`XV@ z2No-Ss#_tz?5vUgmdKI;Vst089i%5C8xG literal 0 HcmV?d00001 diff --git a/components/browser_ui/site_settings/android/java/res/drawable-xhdpi/permission_images.png b/components/browser_ui/site_settings/android/java/res/drawable-xhdpi/permission_images.png new file mode 100644 index 0000000000000000000000000000000000000000..cf3b7d0e10cd0e660db9b2532c54a317c7ea4c6c GIT binary patch literal 316 zcmV-C0mJ@@P)Azp{U()nEK1|&NKBkysSq;cA4gBBN7g$J>!_JSCeAA(yrc_l zumk&deC;*l3{ApVAXgFg@$^(4g07sPNoWexRp1z|cnOE!aw0MoP!$Bs#Y~li#6Un* z=s=S&5Kt95&?K}4RD}s5`k&X-@#hyZwIFr*eRscr*soBS(+b5f^_@FBh3KYE{OnEu O0000YU6vy#j)Ir6`sdRGHQCx+t4o-6IId=*)FW?jO3G@jZvg!kL>E_acI_m1An@ca% zLHq+j4wj_lLUKbY=X)QZAIixkYa|WJi7=R~LvKd=fwnXDL7mQjmfaq#y+;NI?oxkb>CpiJdkG zWDP)ZV?cb4EKVB%;+xJIvW_?HLp`9o1)vwxf@JpWG(2cvR{5%!!yj~rnJ5kn;wQ5W zm<_%y0?`?AaT*fz-rYwQwfQ**x<)RUq%a`rL81eG`^(`+vxQtTNkKrDn2AsMOE|8( zi@8x80(9S5&;3weum%g`v|CFrwzgrc(NO|C-8W0J~&sE@f( z+xPP>#Z`d@SV1LmS`s8zVfkc|N`mAnET2qLDG>EgaTNdmS6BtHs|_@1`0}Os>#6z| rcuTqBlqE2a!;CjO|0S@dX_|%~l|w?sH+N5m00000NkvXXu0mjfPvFC^ literal 0 HcmV?d00001 diff --git a/components/browser_ui/site_settings/android/java/res/drawable-xxxhdpi/permission_images.png b/components/browser_ui/site_settings/android/java/res/drawable-xxxhdpi/permission_images.png new file mode 100644 index 0000000000000000000000000000000000000000..cca41100e76e81974b4c22d1d9a1fdffabe9cf60 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z4urJLS>(KvDJM1I5sSeVC!Qr--l?HpO;{)S8Tk~J#v^^72Y!=i?d{cQE)Ag;b*t31_vH9nV zHE+q!GY^>%($(j4E91N6`!0s(yqgp{MPz5Sl(mY-3OzXbj%l?Y=bDW0B`>bE=rS;J zI502?G%&CzU@&c->ZCM25B&cuB92+~LH~=K&+k8LyEK}{Uu@Ih3sBg#T-SozH^Gg4 zORL(#T*i5ynspDne;jWMK{8MQcJJ6zdmUy znIZIt^-b7CyHznp%AEI@%2rSLmEqQ&vKXj-L$vGf6?;<3penTVXY!_lRAk79>d&0Z z;?9^WDsRH+$8<~UoXf_^4coe`=U8%Ntp2gcvp~Qg>Zmp6Z*GaTkLIwgb>bq=Zve-^0sWl|`X($0(Fg}|Jzf1=);T3K F0RV{K+KvDK literal 0 HcmV?d00001 diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteImagesContentSetting.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteImagesContentSetting.java new file mode 100644 --- /dev/null +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/impl/BromiteImagesContentSetting.java @@ -0,0 +1,93 @@ +/* + This file is part of Bromite. + + Bromite is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Bromite is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bromite. If not, see . +*/ + +package org.chromium.components.browser_ui.site_settings.impl; + +import org.chromium.components.browser_ui.site_settings.R; + +import org.chromium.components.browser_ui.site_settings.BromiteCustomContentSetting; +import org.chromium.components.browser_ui.site_settings.ContentSettingsResources; +import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory; +import org.chromium.components.content_settings.ContentSetting; +import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.content_public.browser.BrowserContextHandle; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import java.util.ArrayList; + +public class BromiteImagesContentSetting extends BromiteCustomContentSetting { + public BromiteImagesContentSetting() { + super(/*contentSettingsType*/ ContentSettingsType.IMAGES, + /*defaultEnabledValue*/ ContentSetting.ALLOW, + /*defaultDisabledValue*/ ContentSetting.BLOCK, + /*allowException*/ true, + /*preferenceKey*/ "images", + /*profilePrefKey*/ "images"); + } + + @Override + public ContentSettingsResources.ResourceItem getResourceItem() { + return new ContentSettingsResources.ResourceItem( + /*icon*/ R.drawable.permission_images, + /*title*/ R.string.images_permission_title, + /*defaultEnabledValue*/ getDefaultEnabledValue(), + /*defaultDisabledValue*/ getDefaultDisabledValue(), + /*enabledSummary*/ R.string.website_settings_category_images_enabled, + /*disabledSummary*/ R.string.website_settings_category_images_disabled, + /*summaryOverrideForScreenReader*/ 0); + } + + @Override + public int getCategorySummary(@Nullable @ContentSetting int value) { + switch (value) { + case ContentSetting.ALLOW: + return R.string.website_settings_category_images_enabled; + case ContentSetting.BLOCK: + return R.string.website_settings_category_images_disabled; + default: + return 0; + } + } + + @Override + public int getCategoryDescription() { + return 0; + } + + @Override + public boolean requiresTriStateContentSetting() { + return false; + } + + @Override + public boolean showOnlyDescriptions() { + return true; + } + + @Override + public int getAddExceptionDialogMessage() { + return R.string.website_settings_category_images_enabled; + } + + @Override + public @Nullable Boolean considerException(SiteSettingsCategory category, @ContentSetting int value) { + return value != ContentSetting.BLOCK; + } +} diff --git a/components/browser_ui/strings/bromite_content_settings/images.grdp b/components/browser_ui/strings/bromite_content_settings/images.grdp new file mode 100644 --- /dev/null +++ b/components/browser_ui/strings/bromite_content_settings/images.grdp @@ -0,0 +1,23 @@ + + + + + Images + + + Images + + + + Images + + + Allow images on websites you specify while blocking them for the rest of the web + + + Allow sites to load images + + + Disallow sites to load images + + diff --git a/components/content_settings/core/browser/bromite_content_settings/images.inc b/components/content_settings/core/browser/bromite_content_settings/images.inc new file mode 100644 --- /dev/null +++ b/components/content_settings/core/browser/bromite_content_settings/images.inc @@ -0,0 +1,6 @@ + content_settings::WebsiteSettingsRegistry::GetInstance() + ->GetMutable(ContentSettingsType::IMAGES) + ->set_show_into_info_page() + .set_is_renderer_content_setting() + .set_title_ui(IDS_SITE_SETTINGS_TYPE_IMAGES) + .set_mid_sentence_ui(IDS_SITE_SETTINGS_TYPE_IMAGES_MID_SENTENCE); diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc @@ -106,8 +106,7 @@ void ContentSettingsRegistry::Init() { kChromeUIUntrustedScheme}, /*valid_settings=*/{CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK}, WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, - WebsiteSettingsRegistry::DESKTOP | - WebsiteSettingsRegistry::PLATFORM_ANDROID, + WebsiteSettingsRegistry::DESKTOP | WebsiteSettingsRegistry::PLATFORM_ANDROID, ContentSettingsInfo::INHERIT_IN_INCOGNITO, PermissionSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS); diff --git a/components/content_settings/renderer/content_settings_agent_impl.cc b/components/content_settings/renderer/content_settings_agent_impl.cc --- a/components/content_settings/renderer/content_settings_agent_impl.cc +++ b/components/content_settings/renderer/content_settings_agent_impl.cc @@ -358,6 +358,21 @@ bool ContentSettingsAgentImpl::AllowStorageAccessSync( return result; } +bool ContentSettingsAgentImpl::AllowImage(bool enabled_per_settings, + const WebURL& image_url) { + bool allow = enabled_per_settings; + if (enabled_per_settings) { + allow = allow || IsAllowlistedForContentSettings(); + if (content_setting_rules_) { + allow = AllowContentSetting(ContentSettingsType::IMAGES, + image_url, enabled_per_settings); + } + } + if (!allow) + DidBlockContentType(ContentSettingsType::IMAGES); + return allow; +} + bool ContentSettingsAgentImpl::AllowReadFromClipboard() { return delegate_->AllowReadFromClipboard(); } diff --git a/components/content_settings/renderer/content_settings_agent_impl.h b/components/content_settings/renderer/content_settings_agent_impl.h --- a/components/content_settings/renderer/content_settings_agent_impl.h +++ b/components/content_settings/renderer/content_settings_agent_impl.h @@ -83,6 +83,8 @@ class ContentSettingsAgentImpl void AllowStorageAccess(StorageType storage_type, base::OnceCallback callback) override; bool AllowStorageAccessSync(StorageType type) override; + bool AllowImage(bool enabled_per_settings, + const blink::WebURL& image_url) override; bool AllowReadFromClipboard() override; bool AllowWriteToClipboard() override; void DidNotAllowImage() override; diff --git a/third_party/blink/public/platform/web_content_settings_client.h b/third_party/blink/public/platform/web_content_settings_client.h --- a/third_party/blink/public/platform/web_content_settings_client.h +++ b/third_party/blink/public/platform/web_content_settings_client.h @@ -55,6 +55,11 @@ class WebContentSettingsClient { return enabled_per_settings; } + // Controls whether images are allowed for this frame. + virtual bool AllowImage(bool enabled_per_settings, const WebURL& image_url) { + return enabled_per_settings; + } + // Controls whether insecure scripts are allowed to execute for this frame. virtual bool AllowRunningInsecureContent(bool enabled_per_settings, const WebURL&) { diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc @@ -4148,19 +4148,6 @@ bool LocalFrame::IsSameOrigin() { return security_origin->IsSameOriginWith(top_security_origin); } -bool LocalFrame::ImagesEnabled() { - DCHECK(!IsDetached()); - // If this is called in the middle of detach, GetDocumentLoader() might - // already be nullptr. - if (!loader_.GetDocumentLoader()) { - return false; - } - bool allow_image_renderer = GetSettings()->GetImagesEnabled(); - bool allow_image_content_setting = - loader_.GetDocumentLoader()->GetContentSettings()->allow_image; - return allow_image_renderer && allow_image_content_setting; -} - bool LocalFrame::ScriptEnabled() { DCHECK(!IsDetached()); // If this is called in the middle of detach, GetDocumentLoader() might diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h @@ -935,12 +935,6 @@ class CORE_EXPORT LocalFrame final return *v8_local_compile_hints_producer_; } - // Returns whether images are allowed to load for the current frame. This is a - // convenience method that checks both renderer content settings and frame - // settings. - // Can only be called while the frame is not detached. - bool ImagesEnabled(); - // Returns whether script is allowed to run for the current frame. This is a // convenience method that checks both renderer content settings and frame // settings. diff --git a/third_party/blink/renderer/core/html/image_document.cc b/third_party/blink/renderer/core/html/image_document.cc --- a/third_party/blink/renderer/core/html/image_document.cc +++ b/third_party/blink/renderer/core/html/image_document.cc @@ -141,7 +141,14 @@ void ImageDocumentParser::AppendBytes(base::span data) { return; LocalFrame* frame = GetDocument()->GetFrame(); - bool allow_image = frame->ImagesEnabled(); + Settings* settings = frame->GetSettings(); + bool allow_image_renderer = !settings || settings->GetImagesEnabled(); + bool allow_image_content_setting = false; + if (auto* client = frame->GetContentSettingsClient()) { + allow_image_content_setting = client->AllowImage(allow_image_renderer, + GetDocument()->Url()); + } + bool allow_image = allow_image_renderer && allow_image_content_setting; if (!allow_image) { auto* client = frame->GetContentSettingsClient(); if (client) { diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc --- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc +++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc @@ -321,6 +321,7 @@ ResourceFetcher* FrameFetchContext::CreateFetcherForCommittedDocument( fetcher->SetResourceLoadObserver( MakeGarbageCollected( loader, document, fetcher->GetProperties())); + fetcher->SetImagesEnabled(frame->GetSettings()->GetImagesEnabled()); fetcher->SetAutoLoadImages( frame->GetSettings()->GetLoadsImagesAutomatically()); fetcher->SetEarlyHintsPreloadedResources( @@ -512,16 +513,13 @@ void FrameFetchContext::AddResourceTiming( ->AddResourceTiming(std::move(info), initiator_type); } -bool FrameFetchContext::AllowImage() const { +bool FrameFetchContext::AllowImage(bool images_enabled, const KURL& url) const { if (GetResourceFetcherProperties().IsDetached()) { - return true; + return images_enabled; } - - bool images_enabled = GetFrame()->ImagesEnabled(); - if (!images_enabled) { - if (auto* settings_client = GetContentSettingsClient()) { - settings_client->DidNotAllowImage(); - } + if (auto* settings_client = GetContentSettingsClient()) { + images_enabled = settings_client->AllowImage(images_enabled, url); + if (!images_enabled) settings_client->DidNotAllowImage(); } return images_enabled; } diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.h b/third_party/blink/renderer/core/loader/frame_fetch_context.h --- a/third_party/blink/renderer/core/loader/frame_fetch_context.h +++ b/third_party/blink/renderer/core/loader/frame_fetch_context.h @@ -96,7 +96,7 @@ class CORE_EXPORT FrameFetchContext final : public BaseFetchContext, void AddResourceTiming(mojom::blink::ResourceTimingInfoPtr, const AtomicString& initiator_type) override; - bool AllowImage() const override; + bool AllowImage(bool images_enabled, const KURL&) const override; void CheckGuardrailsPolicyForAssetSize(GuardrailPolicyAssetType asset_type, size_t bytes, diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc @@ -1048,9 +1048,8 @@ void Page::SettingsChanged(ChangeType change_type) { for (Frame* frame = MainFrame(); frame; frame = frame->Tree().TraverseNext()) { if (auto* local_frame = DynamicTo(frame)) { - // Notify the fetcher that the image loading setting has changed, - // which may cause previously deferred requests to load. - local_frame->GetDocument()->Fetcher()->ReloadImagesIfNotDeferred(); + local_frame->GetDocument()->Fetcher()->SetImagesEnabled( + GetSettings().GetImagesEnabled()); local_frame->GetDocument()->Fetcher()->SetAutoLoadImages( GetSettings().GetLoadsImagesAutomatically()); } diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h --- a/third_party/blink/renderer/platform/loader/fetch/fetch_context.h +++ b/third_party/blink/renderer/platform/loader/fetch/fetch_context.h @@ -116,7 +116,7 @@ class PLATFORM_EXPORT FetchContext : public GarbageCollected { virtual void AddResourceTiming(mojom::blink::ResourceTimingInfoPtr, const AtomicString& initiator_type); - virtual bool AllowImage() const { return false; } + virtual bool AllowImage(bool, const KURL&) const { return false; } virtual std::optional CanRequest( ResourceType, const ResourceRequest&, diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc @@ -822,6 +822,7 @@ ResourceFetcher::ResourceFetcher(const ResourceFetcherInit& init) blob_registry_remote_(init.context_lifecycle_notifier), context_lifecycle_notifier_(init.context_lifecycle_notifier), auto_load_images_(true), + images_enabled_(true), allow_stale_resources_(false), image_fetched_(false) { InstanceCounters::IncrementCounter(InstanceCounters::kResourceFetcherCounter); @@ -1998,7 +1999,7 @@ bool ResourceFetcher::IsImageResourceDisallowedToBeReused( return false; } - return !Context().AllowImage(); + return !Context().AllowImage(images_enabled_, existing_resource.Url()); } ResourceFetcher::RevalidationPolicy @@ -2252,8 +2253,20 @@ void ResourceFetcher::SetAutoLoadImages(bool enable) { ReloadImagesIfNotDeferred(); } +void ResourceFetcher::SetImagesEnabled(bool enable) { + if (enable == images_enabled_) + return; + + images_enabled_ = enable; + + if (!images_enabled_) + return; + + ReloadImagesIfNotDeferred(); +} + bool ResourceFetcher::ShouldDeferImageLoad(const KURL& url) const { - return !Context().AllowImage() || + return !Context().AllowImage(images_enabled_, url) || (!auto_load_images_ && !url.ProtocolIsData()); } diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h @@ -231,6 +231,7 @@ class PLATFORM_EXPORT ResourceFetcher bool StartLoad(Resource*, bool is_potentially_unused_preload = false); void SetAutoLoadImages(bool); + void SetImagesEnabled(bool); FetchContext& Context() const; void ClearContext(); @@ -705,6 +706,7 @@ class PLATFORM_EXPORT ResourceFetcher bool is_in_request_resource_ = false; bool auto_load_images_ : 1; + bool images_enabled_ : 1; bool allow_stale_resources_ : 1; bool image_fetched_ : 1; bool stale_while_revalidate_enabled_ : 1; --