| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/renderer/worker_content_settings_client.h" |
| |
| #include "chrome/common/render_messages.h" |
| #include "chrome/renderer/content_settings_observer.h" |
| #include "content/public/renderer/render_frame.h" |
| #include "content/public/renderer/render_thread.h" |
| #include "ipc/ipc_sync_message_filter.h" |
| #include "third_party/blink/public/platform/url_conversion.h" |
| #include "third_party/blink/public/platform/web_security_origin.h" |
| #include "third_party/blink/public/web/web_document.h" |
| #include "third_party/blink/public/web/web_local_frame.h" |
| #include "url/origin.h" |
| |
| WorkerContentSettingsClient::WorkerContentSettingsClient( |
| content::RenderFrame* render_frame) |
| : routing_id_(render_frame->GetRoutingID()), is_unique_origin_(false) { |
| blink::WebLocalFrame* frame = render_frame->GetWebFrame(); |
| if (frame->GetDocument().GetSecurityOrigin().IsUnique() || |
| frame->Top()->GetSecurityOrigin().IsUnique()) |
| is_unique_origin_ = true; |
| sync_message_filter_ = content::RenderThread::Get()->GetSyncMessageFilter(); |
| document_origin_url_ = |
| url::Origin(frame->GetDocument().GetSecurityOrigin()).GetURL(); |
| top_frame_origin_url_ = |
| url::Origin(frame->Top()->GetSecurityOrigin()).GetURL(); |
| allow_running_insecure_content_ = ContentSettingsObserver::Get(render_frame) |
| ->allow_running_insecure_content(); |
| content_setting_rules_ = |
| ContentSettingsObserver::Get(render_frame)->GetContentSettingRules(); |
| } |
| |
| WorkerContentSettingsClient::WorkerContentSettingsClient( |
| const WorkerContentSettingsClient& other) |
| : routing_id_(other.routing_id_), |
| is_unique_origin_(other.is_unique_origin_), |
| document_origin_url_(other.document_origin_url_), |
| top_frame_origin_url_(other.top_frame_origin_url_), |
| allow_running_insecure_content_(other.allow_running_insecure_content_), |
| sync_message_filter_(other.sync_message_filter_), |
| content_setting_rules_(other.content_setting_rules_) {} |
| |
| WorkerContentSettingsClient::~WorkerContentSettingsClient() {} |
| |
| std::unique_ptr<blink::WebContentSettingsClient> |
| WorkerContentSettingsClient::Clone() { |
| return base::WrapUnique(new WorkerContentSettingsClient(*this)); |
| } |
| |
| bool WorkerContentSettingsClient::RequestFileSystemAccessSync() { |
| if (is_unique_origin_) |
| return false; |
| |
| bool result = false; |
| sync_message_filter_->Send(new ChromeViewHostMsg_RequestFileSystemAccessSync( |
| routing_id_, document_origin_url_, top_frame_origin_url_, &result)); |
| return result; |
| } |
| |
| bool WorkerContentSettingsClient::AllowIndexedDB( |
| const blink::WebSecurityOrigin&) { |
| if (is_unique_origin_) |
| return false; |
| |
| bool result = false; |
| sync_message_filter_->Send(new ChromeViewHostMsg_AllowIndexedDB( |
| routing_id_, document_origin_url_, top_frame_origin_url_, &result)); |
| return result; |
| } |
| |
| bool WorkerContentSettingsClient::AllowRunningInsecureContent( |
| bool allowed_per_settings, |
| const blink::WebSecurityOrigin& context, |
| const blink::WebURL& url) { |
| if (!allow_running_insecure_content_ && !allowed_per_settings) { |
| sync_message_filter_->Send(new ChromeViewHostMsg_ContentBlocked( |
| routing_id_, CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, base::string16())); |
| return false; |
| } |
| |
| return true; |
| } |
| |
| bool WorkerContentSettingsClient::AllowScriptFromSource( |
| bool enabled_per_settings, |
| const blink::WebURL& script_url) { |
| bool allow = enabled_per_settings; |
| if (allow && content_setting_rules_) { |
| for (const auto& rule : content_setting_rules_->script_rules) { |
| if (rule.primary_pattern.Matches(top_frame_origin_url_) && |
| rule.secondary_pattern.Matches(script_url)) { |
| allow = rule.GetContentSetting() != CONTENT_SETTING_BLOCK; |
| break; |
| } |
| } |
| } |
| |
| if (!allow) { |
| sync_message_filter_->Send(new ChromeViewHostMsg_ContentBlocked( |
| routing_id_, CONTENT_SETTINGS_TYPE_JAVASCRIPT, base::string16())); |
| return false; |
| } |
| |
| return true; |
| } |