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