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)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/content_settings_observer.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_test.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/render_view.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DeleteArg;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockContentSettingsObserver : public ContentSettingsObserver {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit MockContentSettingsObserver(content::RenderFrame* render_frame);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* message);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD1(OnContentBlocked,
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               void(ContentSettingsType));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD5(OnAllowDOMStorage,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(int, const GURL&, const GURL&, bool, IPC::Message*));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL image_url_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string image_origin_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MockContentSettingsObserver::MockContentSettingsObserver(
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::RenderFrame* render_frame)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : ContentSettingsObserver(render_frame, NULL),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_url_("http://www.foo.com/image.jpg"),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_origin_("http://www.foo.com") {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MockContentSettingsObserver::Send(IPC::Message* message) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(MockContentSettingsObserver, *message)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ContentBlocked, OnContentBlocked)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_AllowDOMStorage,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    OnAllowDOMStorage)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(ADD_FAILURE())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our super class deletes the message.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return RenderFrameObserver::Send(message);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, DidBlockContentType) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockContentSettingsObserver observer(view_->GetMainRenderFrame());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer,
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  observer.DidBlockContentType(CONTENT_SETTINGS_TYPE_COOKIES);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blocking the same content type a second time shouldn't send a notification.
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  observer.DidBlockContentType(CONTENT_SETTINGS_TYPE_COOKIES);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that multiple invokations of AllowDOMStorage result in a single IPC.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails due to http://crbug.com/104300
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, DISABLED_AllowDOMStorage) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load some HTML, so we have a valid security origin.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML("<html></html>");
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockContentSettingsObserver observer(view_->GetMainRenderFrame());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ON_CALL(observer,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          OnAllowDOMStorage(_, _, _, _, _)).WillByDefault(DeleteArg<4>());
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              OnAllowDOMStorage(_, _, _, _, _));
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  observer.allowStorage(true);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accessing localStorage from the same origin again shouldn't result in a
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new IPC.
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  observer.allowStorage(true);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Regression test for http://crbug.com/35011
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, JSBlockSentAfterPageLoad) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Load page with JS.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string html = "<html>"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<head>"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<script>document.createElement('div');</script>"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</head>"
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<body>"
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</body>"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</html>";
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_thread_->sink().ClearMessages();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(html.c_str());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Block JavaScript.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererContentSettingRules content_setting_rules;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& script_setting_rules =
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.script_rules;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_setting_rules.push_back(
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  CONTENT_SETTING_BLOCK,
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  false));
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer = ContentSettingsObserver::Get(
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      view_->GetMainRenderFrame());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->SetContentSettingRules(&content_setting_rules);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure no pending messages are in the queue.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPendingMessages();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  render_thread_->sink().ClearMessages();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. Reload page.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_str = "data:text/html;charset=utf-8,";
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_str.append(html);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(url_str);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reload(url);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProcessPendingMessages();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 4. Verify that the notification that javascript was blocked is sent after
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  //    the navigation notification is sent.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int navigation_index = -1;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int block_index = -1;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg->type() == GetNavigationIPCType())
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      navigation_index = i;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_index = i;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(-1, navigation_index);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(-1, block_index);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LT(navigation_index, block_index);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, PluginsTemporarilyAllowed) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load some HTML.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML("<html>Foo</html>");
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string foo_plugin = "foo";
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string bar_plugin = "bar";
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer =
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ContentSettingsObserver::Get(view_->GetMainRenderFrame());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer->IsPluginTemporarilyAllowed(foo_plugin));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily allow the "foo" plugin.
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer->OnLoadBlockedPlugins(foo_plugin);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer->IsPluginTemporarilyAllowed(foo_plugin));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer->IsPluginTemporarilyAllowed(bar_plugin));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a navigation within the page.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DidNavigateWithinPage(GetMainFrame(), true);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer->IsPluginTemporarilyAllowed(foo_plugin));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer->IsPluginTemporarilyAllowed(bar_plugin));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a different page.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML("<html>Bar</html>");
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer->IsPluginTemporarilyAllowed(foo_plugin));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer->IsPluginTemporarilyAllowed(bar_plugin));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporarily allow all plugins.
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  observer->OnLoadBlockedPlugins(std::string());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer->IsPluginTemporarilyAllowed(foo_plugin));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer->IsPluginTemporarilyAllowed(bar_plugin));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, ImagesBlockedByDefault) {
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockContentSettingsObserver mock_observer(view_->GetMainRenderFrame());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load some HTML.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML("<html>Foo</html>");
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the default image blocking setting.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererContentSettingRules content_setting_rules;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& image_setting_rules =
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.image_rules;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_setting_rules.push_back(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  CONTENT_SETTING_BLOCK,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  false));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer = ContentSettingsObserver::Get(
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      view_->GetMainRenderFrame());
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->SetContentSettingRules(&content_setting_rules);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_observer,
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(observer->allowImage(true, mock_observer.image_url_));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an exception which allows the image.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_setting_rules.insert(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_setting_rules.begin(),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingPatternSource(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ContentSettingsPattern::Wildcard(),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ContentSettingsPattern::FromString(mock_observer.image_origin_),
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTING_ALLOW,
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string(),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false));
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_observer,
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)).Times(0);
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(observer->allowImage(true, mock_observer.image_url_));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, ImagesAllowedByDefault) {
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockContentSettingsObserver mock_observer(view_->GetMainRenderFrame());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load some HTML.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML("<html>Foo</html>");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the default image blocking setting.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererContentSettingRules content_setting_rules;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& image_setting_rules =
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.image_rules;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_setting_rules.push_back(
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  CONTENT_SETTING_ALLOW,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  false));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer =
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ContentSettingsObserver::Get(view_->GetMainRenderFrame());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->SetContentSettingRules(&content_setting_rules);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_observer,
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)).Times(0);
236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(observer->allowImage(true, mock_observer.image_url_));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an exception which blocks the image.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_setting_rules.insert(
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      image_setting_rules.begin(),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingPatternSource(
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ContentSettingsPattern::Wildcard(),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ContentSettingsPattern::FromString(mock_observer.image_origin_),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTING_BLOCK,
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string(),
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_observer,
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(observer->allowImage(true, mock_observer.image_url_));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, ContentSettingsBlockScripts) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the content settings for scripts.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererContentSettingRules content_setting_rules;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& script_setting_rules =
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.script_rules;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_setting_rules.push_back(
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  CONTENT_SETTING_BLOCK,
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  false));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer =
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ContentSettingsObserver::Get(view_->GetMainRenderFrame());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->SetContentSettingRules(&content_setting_rules);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page which contains a script.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string html = "<html>"
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<head>"
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<script src='data:foo'></script>"
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</head>"
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<body>"
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</body>"
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</html>";
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(html.c_str());
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the script was blocked.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_blocked = false;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_blocked = true;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(was_blocked);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, ContentSettingsAllowScripts) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the content settings for scripts.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererContentSettingRules content_setting_rules;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& script_setting_rules =
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.script_rules;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_setting_rules.push_back(
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  CONTENT_SETTING_ALLOW,
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  false));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer =
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ContentSettingsObserver::Get(view_->GetMainRenderFrame());
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->SetContentSettingRules(&content_setting_rules);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page which contains a script.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string html = "<html>"
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<head>"
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<script src='data:foo'></script>"
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</head>"
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<body>"
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</body>"
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</html>";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(html.c_str());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the script was not blocked.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_blocked = false;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_blocked = true;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(was_blocked);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ChromeRenderViewTest, ContentSettingsInterstitialPages) {
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockContentSettingsObserver mock_observer(view_->GetMainRenderFrame());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block scripts.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererContentSettingRules content_setting_rules;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& script_setting_rules =
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.script_rules;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  script_setting_rules.push_back(
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  CONTENT_SETTING_BLOCK,
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  false));
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Block images.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsForOneType& image_setting_rules =
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_rules.image_rules;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  image_setting_rules.push_back(
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  ContentSettingsPattern::Wildcard(),
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  CONTENT_SETTING_BLOCK,
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  std::string(),
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  false));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ContentSettingsObserver* observer =
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ContentSettingsObserver::Get(view_->GetMainRenderFrame());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->SetContentSettingRules(&content_setting_rules);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->OnSetAsInterstitial();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page which contains a script.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string html = "<html>"
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<head>"
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<script src='data:foo'></script>"
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</head>"
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "<body>"
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</body>"
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     "</html>";
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(html.c_str());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the script was allowed.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool was_blocked = false;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < render_thread_->sink().message_count(); ++i) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message* msg = render_thread_->sink().GetMessageAt(i);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (msg->type() == ChromeViewHostMsg_ContentBlocked::ID)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      was_blocked = true;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(was_blocked);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that images are allowed.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mock_observer,
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES)).Times(0);
376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(observer->allowImage(true, mock_observer.image_url_));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::Mock::VerifyAndClearExpectations(&observer);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
379