tab_specific_content_settings.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_database_helper.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/cookies_tree_model.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_details.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host_observer.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/fileapi/file_system_types.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(TabSpecificContentSettings) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterstitialHostObserver : public content::RenderViewHostObserver { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit InterstitialHostObserver(RenderViewHost* rvh) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::RenderViewHostObserver(rvh) {} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::RenderViewHostObserver overrides. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RenderViewHostInitialized() OVERRIDE { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeViewMsg_SetAsInterstitial(routing_id())); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::SiteDataObserver::SiteDataObserver( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* tab_specific_content_settings) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : tab_specific_content_settings_(tab_specific_content_settings) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_specific_content_settings_->AddSiteDataObserver(this); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::SiteDataObserver::~SiteDataObserver() { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tab_specific_content_settings_) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_specific_content_settings_->RemoveSiteDataObserver(this); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::SiteDataObserver::ContentSettingsDestroyed() { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_specific_content_settings_ = NULL; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::TabSpecificContentSettings(WebContents* tab) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WebContentsObserver(tab), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_(Profile::FromBrowserContext(tab->GetBrowserContext())), 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_(profile_), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_(profile_), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_settings_state_(profile_), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_protocol_handler_(ProtocolHandler::EmptyProtocolHandler()), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_protocol_handler_(ProtocolHandler::EmptyProtocolHandler()), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_protocol_handler_setting_(CONTENT_SETTING_DEFAULT), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_plugins_link_enabled_(true) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearBlockedContentSettingsExceptForCookies(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCookieSpecificContentSettings(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<HostContentSettingsMap>( 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_->GetHostContentSettingsMap())); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::~TabSpecificContentSettings() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteDataObserver, observer_list_, ContentSettingsDestroyed()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings* TabSpecificContentSettings::Get( 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, int render_view_id) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* view = RenderViewHost::FromID(render_process_id, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TabSpecificContentSettings::FromWebContents( 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContents::FromRenderViewHost(view)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::CookiesRead(int render_process_id, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* settings = Get(render_process_id, render_view_id); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->OnCookiesRead(url, frame_url, cookie_list, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_by_policy); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::CookieChanged( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieOptions& options, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* settings = Get(render_process_id, render_view_id); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->OnCookieChanged(url, frame_url, cookie_line, options, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_by_policy); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::WebDatabaseAccessed( 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* settings = Get(render_process_id, render_view_id); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->OnWebDatabaseAccessed(url, name, display_name, blocked_by_policy); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::DOMStorageAccessed(int render_process_id, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool local, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* settings = Get(render_process_id, render_view_id); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->OnLocalStorageAccessed(url, local, blocked_by_policy); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::IndexedDBAccessed(int render_process_id, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* settings = Get(render_process_id, render_view_id); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->OnIndexedDBAccessed(url, description, blocked_by_policy); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::FileSystemAccessed(int render_process_id, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_view_id, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* settings = Get(render_process_id, render_view_id); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings->OnFileSystemAccessed(url, blocked_by_policy); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::IsContentBlocked( 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type) const { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Geolocation settings handled by ContentSettingGeolocationImageModel"; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Notifications settings handled by " 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "ContentSettingsNotificationsImageModel"; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_type == CONTENT_SETTINGS_TYPE_IMAGES || 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT || 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_type == CONTENT_SETTINGS_TYPE_PLUGINS || 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_type == CONTENT_SETTINGS_TYPE_COOKIES || 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_type == CONTENT_SETTINGS_TYPE_POPUPS || 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_type == CONTENT_SETTINGS_TYPE_MIXEDSCRIPT) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_blocked_[content_type]; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::IsBlockageIndicated( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type) const { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_blockage_indicated_to_user_[content_type]; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::SetBlockageHasBeenIndicated( 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blockage_indicated_to_user_[content_type] = true; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::IsContentAccessed( 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type) const { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method currently only returns meaningful values for cookies. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_type != CONTENT_SETTINGS_TYPE_COOKIES) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_accessed_[content_type]; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::set<std::string>& 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings::BlockedResourcesForType( 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type) const { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_resources_[content_type].get()) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *blocked_resources_[content_type]; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CR_DEFINE_STATIC_LOCAL(std::set<std::string>, empty_set, ()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return empty_set; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::AddBlockedResource( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType content_type, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& resource_identifier) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!blocked_resources_[content_type].get()) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_resources_[content_type].reset(new std::set<std::string>()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_resources_[content_type]->insert(resource_identifier); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnContentBlocked( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsType type, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& resource_identifier) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Geolocation settings handled by OnGeolocationPermissionSet"; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_accessed_[type] = true; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unless UI for resource content settings is enabled, ignore the resource 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // identifier. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(bauerb): The UI to unblock content should be disabled if the content 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // setting was not set by the user. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string identifier; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (CommandLine::ForCurrentProcess()->HasSwitch( 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switches::kEnableResourceContentSettings)) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) identifier = resource_identifier; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!identifier.empty()) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddBlockedResource(type, identifier); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined (OS_ANDROID) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type == CONTENT_SETTINGS_TYPE_POPUPS) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For Android we do not have a persistent button that will always be 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visible for blocked popups. Instead we have info bars which could be 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // dismissed. Have to clear the blocked state so we properly notify the 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relevant pieces again. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blocked_[type] = false; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blockage_indicated_to_user_[type] = false; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!content_blocked_[type]) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blocked_[type] = true; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO: it would be nice to have a way of mocking this in tests. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(web_contents()), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnContentAccessed(ContentSettingsType type) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "Geolocation settings handled by OnGeolocationPermissionSet"; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!content_accessed_[type]) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_accessed_[type] = true; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(web_contents()), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnCookiesRead( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cookie_list.empty()) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.cookies()->AddReadCookies( 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url, url, cookie_list); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.cookies()->AddReadCookies( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url, url, cookie_list); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySiteDataObservers(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnCookieChanged( 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& frame_url, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieOptions& options, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.cookies()->AddChangedCookie( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url, url, cookie_line, options); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.cookies()->AddChangedCookie( 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_url, url, cookie_line, options); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySiteDataObservers(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnIndexedDBAccessed( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& description, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.indexed_dbs()->AddIndexedDB( 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, description); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.indexed_dbs()->AddIndexedDB( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, description); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySiteDataObservers(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnLocalStorageAccessed( 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool local, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalSharedObjectsContainer& container = blocked_by_policy ? 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_ : allowed_local_shared_objects_; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CannedBrowsingDataLocalStorageHelper* helper = 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ? container.local_storages() : container.session_storages(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) helper->AddLocalStorage(url); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySiteDataObservers(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnWebDatabaseAccessed( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& name, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& display_name, 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.databases()->AddDatabase( 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, UTF16ToUTF8(name), UTF16ToUTF8(display_name)); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.databases()->AddDatabase( 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url, UTF16ToUTF8(name), UTF16ToUTF8(display_name)); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySiteDataObservers(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnFileSystemAccessed( 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.file_systems()->AddFileSystem(url, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileapi::kFileSystemTypeTemporary, 0); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.file_systems()->AddFileSystem(url, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fileapi::kFileSystemTypeTemporary, 0); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotifySiteDataObservers(); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnGeolocationPermissionSet( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& requesting_origin, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allowed) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_settings_state_.OnGeolocationPermissionSet(requesting_origin, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(web_contents()), 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::ClearBlockedContentSettingsExceptForCookies() { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(content_blocked_); ++i) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i == CONTENT_SETTINGS_TYPE_COOKIES) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_resources_[i].reset(); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blocked_[i] = false; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_accessed_[i] = false; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blockage_indicated_to_user_[i] = false; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_plugins_link_enabled_ = true; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(web_contents()), 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::ClearCookieSpecificContentSettings() { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.Reset(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.Reset(); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blocked_[CONTENT_SETTINGS_TYPE_COOKIES] = false; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_accessed_[CONTENT_SETTINGS_TYPE_COOKIES] = false; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blockage_indicated_to_user_[CONTENT_SETTINGS_TYPE_COOKIES] = false; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(web_contents()), 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::SetPopupsBlocked(bool blocked) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blocked_[CONTENT_SETTINGS_TYPE_POPUPS] = blocked; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_blockage_indicated_to_user_[CONTENT_SETTINGS_TYPE_POPUPS] = false; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::current()->Notify( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<WebContents>(web_contents()), 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::NoDetails()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::GeolocationDidNavigate( 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_settings_state_.DidNavigate(details); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::ClearGeolocationContentSettings() { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) geolocation_settings_state_.ClearStateMap(); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::RenderViewForInterstitialPageCreated( 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to tell the renderer-side code to ignore content settings for this 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page but we must wait until the RenderView is created. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new InterstitialHostObserver(render_view_host); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::OnMessageReceived( 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(TabSpecificContentSettings, message) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ContentBlocked, OnContentBlocked) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::DidNavigateMainFrame( 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::LoadCommittedDetails& details, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FrameNavigateParams& params) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!details.is_in_page) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear "blocked" flags. 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearBlockedContentSettingsExceptForCookies(); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GeolocationDidNavigate(details); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::DidStartProvisionalLoadForFrame( 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 parent_frame_id, 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_error_page, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_main_frame) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we're displaying a network error page do not reset the content 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // settings delegate's cookies so the user has a chance to modify cookie 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // settings. 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_error_page) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearCookieSpecificContentSettings(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearGeolocationContentSettings(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::AppCacheAccessed(const GURL& manifest_url, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool blocked_by_policy) { 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blocked_by_policy) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blocked_local_shared_objects_.appcaches()->AddAppCache(manifest_url); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) allowed_local_shared_objects_.appcaches()->AddAppCache(manifest_url); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::Observe( 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type == chrome::NOTIFICATION_CONTENT_SETTINGS_CHANGED); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Details<const ContentSettingsDetails> settings_details(details); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NavigationController& controller = web_contents()->GetController(); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationEntry* entry = controller.GetActiveEntry(); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL entry_url; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (entry) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entry_url = entry->GetURL(); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (settings_details.ptr()->update_all() || 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The active NavigationEntry is the URL in the URL field of a tab. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Currently this should be matched by the |primary_pattern|. 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings_details.ptr()->primary_pattern().Matches(entry_url)) { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RendererContentSettingRules rules; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRendererContentSettingRules(profile->GetHostContentSettingsMap(), 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &rules); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ChromeViewMsg_SetContentSettingRules(rules)); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::AddSiteDataObserver( 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteDataObserver* observer) { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_list_.AddObserver(observer); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::RemoveSiteDataObserver( 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SiteDataObserver* observer) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_list_.RemoveObserver(observer); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::NotifySiteDataObservers() { 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(SiteDataObserver, observer_list_, OnSiteDataAccessed()); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 559