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) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/content_settings/content_setting_image_model.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_observer.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_registrar.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_options.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Forward all NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED to the specified 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ContentSettingImageModel. 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NotificationForwarder : public content::NotificationObserver { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit NotificationForwarder(ContentSettingImageModel* model) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : model_(model) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationService::AllSources()); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~NotificationForwarder() {} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void clear() { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.RemoveAll(); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Observe(int type, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type == chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_->UpdateFromWebContents( 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<content::WebContents>(source).ptr()); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::NotificationRegistrar registrar_; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingImageModel* model_; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NotificationForwarder); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingImageModelTest : public ChromeRenderViewHostTestHarness { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingImageModelTest, UpdateFromWebContents) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings::CreateForWebContents(web_contents()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* content_settings = 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ContentSettingImageModel> content_setting_image_model( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingImageModel::CreateContentSettingImageModel( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_IMAGES)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_setting_image_model->is_visible()); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, content_setting_image_model->get_icon()); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_setting_image_model->get_tooltip().empty()); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_setting_image_model->UpdateFromWebContents(web_contents()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_setting_image_model->is_visible()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, content_setting_image_model->get_icon()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_setting_image_model->get_tooltip().empty()); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingImageModelTest, RPHUpdateFromWebContents) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings::CreateForWebContents(web_contents()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ContentSettingImageModel> content_setting_image_model( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingImageModel::CreateContentSettingImageModel( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS)); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_setting_image_model->UpdateFromWebContents(web_contents()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_setting_image_model->is_visible()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* content_settings = 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings->set_pending_protocol_handler( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProtocolHandler::CreateProtocolHandler( 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "mailto", GURL("http://www.google.com/"))); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_setting_image_model->UpdateFromWebContents(web_contents()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_setting_image_model->is_visible()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingImageModelTest, CookieAccessed) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings::CreateForWebContents(web_contents()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings* content_settings = 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile()->GetHostContentSettingsMap()->SetDefaultContentSetting( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_BLOCK); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ContentSettingImageModel> content_setting_image_model( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingImageModel::CreateContentSettingImageModel( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_COOKIES)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_setting_image_model->is_visible()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, content_setting_image_model->get_icon()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_setting_image_model->get_tooltip().empty()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions options; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings->OnCookieChanged(GURL("http://google.com"), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://google.com"), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "A=B", 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) options, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_setting_image_model->UpdateFromWebContents(web_contents()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(content_setting_image_model->is_visible()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, content_setting_image_model->get_icon()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(content_setting_image_model->get_tooltip().empty()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Regression test for http://crbug.com/161854. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ContentSettingImageModelTest, NULLTabSpecificContentSettings) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ContentSettingImageModel> content_setting_image_model( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingImageModel::CreateContentSettingImageModel( 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_IMAGES)); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationForwarder forwarder(content_setting_image_model.get()); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should not crash. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings::CreateForWebContents(web_contents()); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forwarder.clear(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 131