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"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/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"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.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"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_details.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_details.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(TabSpecificContentSettings);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::SiteDataObserver::SiteDataObserver(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TabSpecificContentSettings* tab_specific_content_settings)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : tab_specific_content_settings_(tab_specific_content_settings) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab_specific_content_settings_->AddSiteDataObserver(this);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::SiteDataObserver::~SiteDataObserver() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tab_specific_content_settings_)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab_specific_content_settings_->RemoveSiteDataObserver(this);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::SiteDataObserver::ContentSettingsDestroyed() {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab_specific_content_settings_ = NULL;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::TabSpecificContentSettings(WebContents* tab)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : content::WebContentsObserver(tab),
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_(Profile::FromBrowserContext(tab->GetBrowserContext())),
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allowed_local_shared_objects_(profile_),
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blocked_local_shared_objects_(profile_),
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      geolocation_usages_state_(profile_, CONTENT_SETTINGS_TYPE_GEOLOCATION),
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      midi_usages_state_(profile_, CONTENT_SETTINGS_TYPE_MIDI_SYSEX),
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_protocol_handler_(ProtocolHandler::EmptyProtocolHandler()),
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      previous_protocol_handler_(ProtocolHandler::EmptyProtocolHandler()),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_protocol_handler_setting_(CONTENT_SETTING_DEFAULT),
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      load_plugins_link_enabled_(true),
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      observer_(this) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearBlockedContentSettingsExceptForCookies();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearCookieSpecificContentSettings();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  observer_.Add(profile_->GetHostContentSettingsMap());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings::~TabSpecificContentSettings() {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteDataObserver, observer_list_, ContentSettingsDestroyed());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TabSpecificContentSettings* TabSpecificContentSettings::Get(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_id, int render_view_id) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* view = RenderViewHost::FromID(render_process_id,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                render_view_id);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents = WebContents::FromRenderViewHost(view);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return TabSpecificContentSettings::FromWebContents(web_contents);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TabSpecificContentSettings* TabSpecificContentSettings::GetForFrame(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_process_id, int render_frame_id) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderFrameHost* frame = content::RenderFrameHost::FromID(
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id, render_frame_id);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContents* web_contents = WebContents::FromRenderFrameHost(frame);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!web_contents)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return NULL;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return TabSpecificContentSettings::FromWebContents(web_contents);
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::CookiesRead(int render_process_id,
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             int render_frame_id,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const GURL& url,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const GURL& frame_url,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             const net::CookieList& cookie_list,
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                             bool blocked_by_policy,
12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                             bool is_for_blocking_resource) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TabSpecificContentSettings* settings =
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetForFrame(render_process_id, render_frame_id);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->OnCookiesRead(url, frame_url, cookie_list,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            blocked_by_policy);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender::PrerenderManager::RecordCookieEvent(
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_frame_id,
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      url,
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      frame_url,
13523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      is_for_blocking_resource,
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerender::PrerenderContents::COOKIE_EVENT_SEND,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      &cookie_list);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::CookieChanged(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_id,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_frame_id,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& cookie_line,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieOptions& options,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TabSpecificContentSettings* settings =
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetForFrame(render_process_id, render_frame_id);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->OnCookieChanged(url, frame_url, cookie_line, options,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              blocked_by_policy);
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  prerender::PrerenderManager::RecordCookieEvent(
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id,
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_frame_id,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      url,
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      frame_url,
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      false /*is_critical_request*/,
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prerender::PrerenderContents::COOKIE_EVENT_CHANGE,
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      NULL);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::WebDatabaseAccessed(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_id,
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_frame_id,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& name,
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_name,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TabSpecificContentSettings* settings = GetForFrame(
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id, render_frame_id);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->OnWebDatabaseAccessed(url, name, display_name, blocked_by_policy);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::DOMStorageAccessed(int render_process_id,
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    int render_frame_id,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    const GURL& url,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool local,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool blocked_by_policy) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TabSpecificContentSettings* settings = GetForFrame(
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id, render_frame_id);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->OnLocalStorageAccessed(url, local, blocked_by_policy);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabSpecificContentSettings::IndexedDBAccessed(
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_process_id,
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int render_frame_id,
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const GURL& url,
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::string16& description,
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool blocked_by_policy) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TabSpecificContentSettings* settings = GetForFrame(
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id, render_frame_id);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->OnIndexedDBAccessed(url, description, blocked_by_policy);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::FileSystemAccessed(int render_process_id,
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    int render_frame_id,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    const GURL& url,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    bool blocked_by_policy) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TabSpecificContentSettings* settings = GetForFrame(
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id, render_frame_id);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings->OnFileSystemAccessed(url, blocked_by_policy);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::IsContentBlocked(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) const {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content_type != CONTENT_SETTINGS_TYPE_GEOLOCATION)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Geolocation settings handled by ContentSettingGeolocationImageModel";
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Notifications settings handled by "
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "ContentSettingsNotificationsImageModel";
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_IMAGES ||
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT ||
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_PLUGINS ||
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_COOKIES ||
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_POPUPS ||
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_MIXEDSCRIPT ||
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM ||
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA ||
2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content_type == CONTENT_SETTINGS_TYPE_PPAPI_BROKER ||
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS ||
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return content_blocked_[content_type];
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::IsBlockageIndicated(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) const {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_blockage_indicated_to_user_[content_type];
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::SetBlockageHasBeenIndicated(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_blockage_indicated_to_user_[content_type] = true;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool TabSpecificContentSettings::IsContentAllowed(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type) const {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This method currently only returns meaningful values for the content type
2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // cookies, mediastream, PPAPI broker, and downloads.
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (content_type != CONTENT_SETTINGS_TYPE_COOKIES &&
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_type != CONTENT_SETTINGS_TYPE_MEDIASTREAM &&
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_type != CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC &&
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_type != CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA &&
2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content_type != CONTENT_SETTINGS_TYPE_PPAPI_BROKER &&
264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      content_type != CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS &&
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content_type != CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return content_allowed_[content_type];
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void TabSpecificContentSettings::OnContentBlocked(ContentSettingsType type) {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Geolocation settings handled by OnGeolocationPermissionSet";
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type < 0 || type >= CONTENT_SETTINGS_NUM_TYPES)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Media is different from other content setting types since it allows new
27934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // setting to kick in without reloading the page, and the UI for media is
28034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // always reflecting the newest permission setting.
28134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  switch (type) {
28234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
28334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
28434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#if defined(OS_ANDROID)
28534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
28634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif
28734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      content_allowed_[type] = false;
28834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      break;
28934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    default:
29034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      content_allowed_[type] = true;
29134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      break;
29234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_ANDROID)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == CONTENT_SETTINGS_TYPE_POPUPS) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For Android we do not have a persistent button that will always be
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // visible for blocked popups.  Instead we have info bars which could be
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // dismissed.  Have to clear the blocked state so we properly notify the
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // relevant pieces again.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blocked_[type] = false;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blockage_indicated_to_user_[type] = false;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!content_blocked_[type]) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blocked_[type] = true;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO: it would be nice to have a way of mocking this in tests.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<WebContents>(web_contents()),
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabSpecificContentSettings::OnContentAllowed(ContentSettingsType type) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type != CONTENT_SETTINGS_TYPE_GEOLOCATION)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Geolocation settings handled by OnGeolocationPermissionSet";
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool access_changed = false;
31934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  switch (type) {
32034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
32134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_ANDROID)
32334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
32534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      // The setting for media is overwritten here because media does not need
32634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      // to reload the page to have the new setting kick in. See issue/175993.
32734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      if (content_blocked_[type]) {
32834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        content_blocked_[type] = false;
32934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        access_changed = true;
33034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      }
33134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      break;
33234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    default:
33334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      break;
33434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!content_allowed_[type]) {
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_allowed_[type] = true;
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    access_changed = true;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (access_changed) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::NotificationService::current()->Notify(
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Source<WebContents>(web_contents()),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::NoDetails());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnCookiesRead(
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieList& cookie_list,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cookie_list.empty())
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocked_local_shared_objects_.cookies()->AddReadCookies(
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame_url, url, cookie_list);
359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allowed_local_shared_objects_.cookies()->AddReadCookies(
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame_url, url, cookie_list);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifySiteDataObservers();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnCookieChanged(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& frame_url,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& cookie_line,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieOptions& options,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy) {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocked_local_shared_objects_.cookies()->AddChangedCookie(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame_url, url, cookie_line, options);
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allowed_local_shared_objects_.cookies()->AddChangedCookie(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        frame_url, url, cookie_line, options);
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifySiteDataObservers();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnIndexedDBAccessed(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& description,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocked_local_shared_objects_.indexed_dbs()->AddIndexedDB(
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, description);
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allowed_local_shared_objects_.indexed_dbs()->AddIndexedDB(
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        url, description);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifySiteDataObservers();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnLocalStorageAccessed(
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool local,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocalSharedObjectsContainer& container = blocked_by_policy ?
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blocked_local_shared_objects_ : allowed_local_shared_objects_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CannedBrowsingDataLocalStorageHelper* helper =
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      local ? container.local_storages() : container.session_storages();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper->AddLocalStorage(url);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy)
416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifySiteDataObservers();
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnWebDatabaseAccessed(
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& name,
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& display_name,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocked_local_shared_objects_.databases()->AddDatabase(
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        url, base::UTF16ToUTF8(name), base::UTF16ToUTF8(display_name));
431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allowed_local_shared_objects_.databases()->AddDatabase(
4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        url, base::UTF16ToUTF8(name), base::UTF16ToUTF8(display_name));
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifySiteDataObservers();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnFileSystemAccessed(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool blocked_by_policy) {
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy) {
44503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    blocked_local_shared_objects_.file_systems()->AddFileSystem(
44603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        url, storage::kFileSystemTypeTemporary, 0);
447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
44903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    allowed_local_shared_objects_.file_systems()->AddFileSystem(
45003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        url, storage::kFileSystemTypeTemporary, 0);
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifySiteDataObservers();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::OnGeolocationPermissionSet(
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& requesting_origin,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool allowed) {
460ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  geolocation_usages_state_.OnPermissionSet(requesting_origin, allowed);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<WebContents>(web_contents()),
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_ANDROID)
46868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void TabSpecificContentSettings::OnProtectedMediaIdentifierPermissionSet(
46968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const GURL& requesting_origin,
47068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bool allowed) {
47168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (allowed) {
47268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
47368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else {
474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
47568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
47668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
47768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
47868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TabSpecificContentSettings::MicrophoneCameraState
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TabSpecificContentSettings::GetMicrophoneCameraState() const {
48134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (IsContentAllowed(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) &&
48234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      IsContentAllowed(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)) {
48334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return MICROPHONE_CAMERA_ACCESSED;
48434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  } else if (IsContentAllowed(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)) {
48534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return MICROPHONE_ACCESSED;
48634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  } else if (IsContentAllowed(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)) {
48734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return CAMERA_ACCESSED;
48834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
49034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  if (IsContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) &&
49134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      IsContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)) {
49234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return MICROPHONE_CAMERA_BLOCKED;
49334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  } else if (IsContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)) {
49434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return MICROPHONE_BLOCKED;
49534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  } else if (IsContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)) {
49634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    return CAMERA_BLOCKED;
49734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  }
49834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
49934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  return MICROPHONE_CAMERA_NOT_ACCESSED;
5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void TabSpecificContentSettings::OnMediaStreamPermissionSet(
5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const GURL& request_origin,
50468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const MediaStreamDevicesController::MediaStreamTypeSettingsMap&
5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        request_permissions) {
5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  media_stream_access_origin_ = request_origin;
5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
50868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaStreamDevicesController::MediaStreamTypeSettingsMap::const_iterator it =
50968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      request_permissions.find(content::MEDIA_DEVICE_AUDIO_CAPTURE);
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (it != request_permissions.end()) {
51168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    media_stream_requested_audio_device_ = it->second.requested_device_id;
51234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    switch (it->second.permission) {
51334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_NONE:
51434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        NOTREACHED();
51534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        break;
51634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_ALLOWED:
51734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        OnContentAllowed(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
51834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        break;
51934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      // TODO(grunell): UI should show for what reason access has been blocked.
52034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_BLOCKED_BY_POLICY:
52134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER_SETTING:
52234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER:
52334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
52434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        break;
52534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    }
5263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  it = request_permissions.find(content::MEDIA_DEVICE_VIDEO_CAPTURE);
5293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (it != request_permissions.end()) {
53068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    media_stream_requested_video_device_ = it->second.requested_device_id;
53134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    switch (it->second.permission) {
53234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_NONE:
53334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        NOTREACHED();
53434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        break;
53534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_ALLOWED:
53634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        OnContentAllowed(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
53734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        break;
53834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      // TODO(grunell): UI should show for what reason access has been blocked.
53934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_BLOCKED_BY_POLICY:
54034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER_SETTING:
54134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      case MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER:
54234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
54334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        break;
54434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    }
5453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabSpecificContentSettings::OnMidiSysExAccessed(
549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& requesting_origin) {
550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  midi_usages_state_.OnPermissionSet(requesting_origin, true);
551ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  OnContentAllowed(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabSpecificContentSettings::OnMidiSysExAccessBlocked(
555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& requesting_origin) {
556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  midi_usages_state_.OnPermissionSet(requesting_origin, false);
557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  OnContentBlocked(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::ClearBlockedContentSettingsExceptForCookies() {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(content_blocked_); ++i) {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i == CONTENT_SETTINGS_TYPE_COOKIES)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blocked_[i] = false;
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_allowed_[i] = false;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_blockage_indicated_to_user_[i] = false;
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load_plugins_link_enabled_ = true;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<WebContents>(web_contents()),
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::ClearCookieSpecificContentSettings() {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_local_shared_objects_.Reset();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_local_shared_objects_.Reset();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_blocked_[CONTENT_SETTINGS_TYPE_COOKIES] = false;
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_allowed_[CONTENT_SETTINGS_TYPE_COOKIES] = false;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_blockage_indicated_to_user_[CONTENT_SETTINGS_TYPE_COOKIES] = false;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<WebContents>(web_contents()),
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TabSpecificContentSettings::SetDownloadsBlocked(bool blocked) {
5887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content_blocked_[CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS] = blocked;
5897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content_allowed_[CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS] = !blocked;
5907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content_blockage_indicated_to_user_[
5917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS] = false;
5927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content::NotificationService::current()->Notify(
5937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::Source<WebContents>(web_contents()),
5957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::NotificationService::NoDetails());
5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
5977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::SetPopupsBlocked(bool blocked) {
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_blocked_[CONTENT_SETTINGS_TYPE_POPUPS] = blocked;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_blockage_indicated_to_user_[CONTENT_SETTINGS_TYPE_POPUPS] = false;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<WebContents>(web_contents()),
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::GeolocationDidNavigate(
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details) {
609ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  geolocation_usages_state_.DidNavigate(details);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabSpecificContentSettings::MidiDidNavigate(
613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const content::LoadCommittedDetails& details) {
614a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  midi_usages_state_.DidNavigate(details);
615a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::ClearGeolocationContentSettings() {
618ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  geolocation_usages_state_.ClearStateMap();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabSpecificContentSettings::ClearMidiContentSettings() {
622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  midi_usages_state_.ClearStateMap();
623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TabSpecificContentSettings::SetPepperBrokerAllowed(bool allowed) {
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (allowed) {
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_PPAPI_BROKER);
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_PPAPI_BROKER);
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void TabSpecificContentSettings::RenderFrameForInterstitialPageCreated(
6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::RenderFrameHost* render_frame_host) {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We want to tell the renderer-side code to ignore content settings for this
6368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // page.
6375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  render_frame_host->Send(new ChromeViewMsg_SetAsInterstitial(
6385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_frame_host->GetRoutingID()));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TabSpecificContentSettings::OnMessageReceived(
642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const IPC::Message& message,
643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    content::RenderFrameHost* render_frame_host) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(TabSpecificContentSettings, message)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ContentBlocked, OnContentBlocked)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::DidNavigateMainFrame(
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::LoadCommittedDetails& details,
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::FrameNavigateParams& params) {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!details.is_in_page) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear "blocked" flags.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearBlockedContentSettingsExceptForCookies();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GeolocationDidNavigate(details);
6595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MidiDidNavigate(details);
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::DidStartProvisionalLoadForFrame(
664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::RenderFrameHost* render_frame_host,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& validated_url,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_error_page,
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool is_iframe_srcdoc) {
668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (render_frame_host->GetParent())
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're displaying a network error page do not reset the content
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // settings delegate's cookies so the user has a chance to modify cookie
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // settings.
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!is_error_page)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClearCookieSpecificContentSettings();
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearGeolocationContentSettings();
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ClearMidiContentSettings();
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ClearPendingProtocolHandler();
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::AppCacheAccessed(const GURL& manifest_url,
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  bool blocked_by_policy) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (blocked_by_policy) {
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    blocked_local_shared_objects_.appcaches()->AddAppCache(manifest_url);
685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    allowed_local_shared_objects_.appcaches()->AddAppCache(manifest_url);
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void TabSpecificContentSettings::OnContentSettingChanged(
69303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ContentSettingsPattern& primary_pattern,
69403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const ContentSettingsPattern& secondary_pattern,
69503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ContentSettingsType content_type,
69603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string resource_identifier) {
69703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ContentSettingsDetails details(
69803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      primary_pattern, secondary_pattern, content_type, resource_identifier);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const NavigationController& controller = web_contents()->GetController();
7003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NavigationEntry* entry = controller.GetVisibleEntry();
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL entry_url;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (entry)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_url = entry->GetURL();
70403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (details.update_all() ||
7053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      // The visible NavigationEntry is the URL in the URL field of a tab.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Currently this should be matched by the |primary_pattern|.
70703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      details.primary_pattern().Matches(entry_url)) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile =
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Profile::FromBrowserContext(web_contents()->GetBrowserContext());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RendererContentSettingRules rules;
71134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    GetRendererContentSettingRules(profile->GetHostContentSettingsMap(),
71234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                   &rules);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Send(new ChromeViewMsg_SetContentSettingRules(rules));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::AddSiteDataObserver(
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteDataObserver* observer) {
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.AddObserver(observer);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::RemoveSiteDataObserver(
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SiteDataObserver* observer) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TabSpecificContentSettings::NotifySiteDataObservers() {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(SiteDataObserver, observer_list_, OnSiteDataAccessed());
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
730