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