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