content_settings_utils.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/embedder_support/content_settings_utils.h"
  5. #include "components/content_settings/browser/page_specific_content_settings.h"
  6. #include "components/content_settings/core/browser/cookie_settings.h"
  7. #include "components/content_settings/core/common/content_settings.h"
  8. #include "components/content_settings/core/common/content_settings_utils.h"
  9. #include "content/public/browser/browser_thread.h"
  10. #include "net/cookies/site_for_cookies.h"
  11. #include "url/gurl.h"
  12. #include "url/origin.h"
  13. namespace embedder_support {
  14. using StorageType =
  15. content_settings::mojom::ContentSettingsManager::StorageType;
  16. using QueryReason = content_settings::CookieSettings::QueryReason;
  17. namespace {
  18. bool AllowWorkerStorageAccess(
  19. StorageType storage_type,
  20. const GURL& url,
  21. const std::vector<content::GlobalRenderFrameHostId>& render_frames,
  22. const content_settings::CookieSettings* cookie_settings) {
  23. bool allow = cookie_settings->IsFullCookieAccessAllowed(
  24. url, net::SiteForCookies::FromUrl(url), url::Origin::Create(url),
  25. QueryReason::kSiteStorage);
  26. for (const auto& it : render_frames) {
  27. content_settings::PageSpecificContentSettings::StorageAccessed(
  28. storage_type, it.child_id, it.frame_routing_id, url, !allow);
  29. }
  30. return allow;
  31. }
  32. } // namespace
  33. content::AllowServiceWorkerResult AllowServiceWorker(
  34. const GURL& scope,
  35. const net::SiteForCookies& site_for_cookies,
  36. const absl::optional<url::Origin>& top_frame_origin,
  37. const content_settings::CookieSettings* cookie_settings,
  38. const HostContentSettingsMap* settings_map) {
  39. DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  40. // TODO(crbug.com/1336617): Remove this check once we figure out what is
  41. // wrong.
  42. DCHECK(settings_map);
  43. GURL first_party_url = top_frame_origin ? top_frame_origin->GetURL() : GURL();
  44. // Check if JavaScript is allowed.
  45. content_settings::SettingInfo info;
  46. const base::Value value = settings_map->GetWebsiteSetting(
  47. first_party_url, first_party_url, ContentSettingsType::JAVASCRIPT, &info);
  48. ContentSetting setting = content_settings::ValueToContentSetting(value);
  49. bool allow_javascript = setting == CONTENT_SETTING_ALLOW;
  50. // Check if cookies are allowed.
  51. bool allow_cookies = cookie_settings->IsFullCookieAccessAllowed(
  52. scope, site_for_cookies, top_frame_origin, QueryReason::kSiteStorage);
  53. return content::AllowServiceWorkerResult::FromPolicy(!allow_javascript,
  54. !allow_cookies);
  55. }
  56. bool AllowSharedWorker(
  57. const GURL& worker_url,
  58. const net::SiteForCookies& site_for_cookies,
  59. const absl::optional<url::Origin>& top_frame_origin,
  60. const std::string& name,
  61. const blink::StorageKey& storage_key,
  62. int render_process_id,
  63. int render_frame_id,
  64. const content_settings::CookieSettings* cookie_settings) {
  65. bool allow = cookie_settings->IsFullCookieAccessAllowed(
  66. worker_url, site_for_cookies, top_frame_origin,
  67. QueryReason::kSiteStorage);
  68. content_settings::PageSpecificContentSettings::SharedWorkerAccessed(
  69. render_process_id, render_frame_id, worker_url, name, storage_key,
  70. !allow);
  71. return allow;
  72. }
  73. bool AllowWorkerFileSystem(
  74. const GURL& url,
  75. const std::vector<content::GlobalRenderFrameHostId>& render_frames,
  76. const content_settings::CookieSettings* cookie_settings) {
  77. return AllowWorkerStorageAccess(StorageType::FILE_SYSTEM, url, render_frames,
  78. cookie_settings);
  79. }
  80. bool AllowWorkerIndexedDB(
  81. const GURL& url,
  82. const std::vector<content::GlobalRenderFrameHostId>& render_frames,
  83. const content_settings::CookieSettings* cookie_settings) {
  84. return AllowWorkerStorageAccess(StorageType::INDEXED_DB, url, render_frames,
  85. cookie_settings);
  86. }
  87. bool AllowWorkerCacheStorage(
  88. const GURL& url,
  89. const std::vector<content::GlobalRenderFrameHostId>& render_frames,
  90. const content_settings::CookieSettings* cookie_settings) {
  91. return AllowWorkerStorageAccess(StorageType::CACHE, url, render_frames,
  92. cookie_settings);
  93. }
  94. bool AllowWorkerWebLocks(
  95. const GURL& url,
  96. const content_settings::CookieSettings* cookie_settings) {
  97. return AllowWorkerStorageAccess(StorageType::WEB_LOCKS, url, {},
  98. cookie_settings);
  99. }
  100. } // namespace embedder_support