// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/command_line.h"
#include "base/path_service.h"
#include "base/stringprintf.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/content_settings/cookie_settings.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tab_contents/tab_contents.h"
#include "chrome/common/render_messages.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test_utils.h"
#include "net/test/test_server.h"
// Regression test for http://crbug.com/63649.
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, RedirectLoopCookies) {
ASSERT_TRUE(test_server()->Start());
GURL test_url = test_server()->GetURL("files/redirect-loop.html");
CookieSettings::Factory::GetForProfile(browser()->profile())->
SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
ui_test_utils::NavigateToURL(browser(), test_url);
TabContents* tab_contents = chrome::GetActiveTabContents(browser());
ASSERT_EQ(UTF8ToUTF16(test_url.spec() + " failed to load"),
tab_contents->web_contents()->GetTitle());
EXPECT_TRUE(tab_contents->content_settings()->IsContentBlocked(
CONTENT_SETTINGS_TYPE_COOKIES));
}
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, ContentSettingsBlockDataURLs) {
GURL url("data:text/html,
Data URL");
browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
ui_test_utils::NavigateToURL(browser(), url);
TabContents* tab_contents = chrome::GetActiveTabContents(browser());
ASSERT_EQ(UTF8ToUTF16("Data URL"), tab_contents->web_contents()->GetTitle());
EXPECT_TRUE(tab_contents->content_settings()->IsContentBlocked(
CONTENT_SETTINGS_TYPE_JAVASCRIPT));
}
// Tests that if redirect across origins occurs, the new process still gets the
// content settings before the resource headers.
IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, RedirectCrossOrigin) {
ASSERT_TRUE(test_server()->Start());
net::HostPortPair host_port = test_server()->host_port_pair();
DCHECK_EQ(host_port.host(), std::string("127.0.0.1"));
std::string redirect(base::StringPrintf(
"http://localhost:%d/files/redirect-cross-origin.html",
host_port.port()));
GURL test_url = test_server()->GetURL("server-redirect?" + redirect);
CookieSettings::Factory::GetForProfile(browser()->profile())->
SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
ui_test_utils::NavigateToURL(browser(), test_url);
TabContents* tab_contents = chrome::GetActiveTabContents(browser());
EXPECT_TRUE(tab_contents->content_settings()->IsContentBlocked(
CONTENT_SETTINGS_TYPE_COOKIES));
}
#if !defined(USE_AURA) // No NPAPI plugins with Aura.
class ClickToPlayPluginTest : public InProcessBrowserTest {
public:
ClickToPlayPluginTest() {}
#if defined(OS_MACOSX)
virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
FilePath plugin_dir;
PathService::Get(base::DIR_MODULE, &plugin_dir);
plugin_dir = plugin_dir.AppendASCII("plugins");
// The plugins directory isn't read by default on the Mac, so it needs to be
// explicitly registered.
command_line->AppendSwitchPath(switches::kExtraPluginDir, plugin_dir);
}
#endif
};
IN_PROC_BROWSER_TEST_F(ClickToPlayPluginTest, Basic) {
browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK);
GURL url = ui_test_utils::GetTestUrl(
FilePath(), FilePath().AppendASCII("clicktoplay.html"));
ui_test_utils::NavigateToURL(browser(), url);
string16 expected_title(ASCIIToUTF16("OK"));
content::TitleWatcher title_watcher(
chrome::GetActiveWebContents(browser()), expected_title);
content::RenderViewHost* host =
chrome::GetActiveWebContents(browser())->GetRenderViewHost();
host->Send(new ChromeViewMsg_LoadBlockedPlugins(
host->GetRoutingID(), std::string()));
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
}
IN_PROC_BROWSER_TEST_F(ClickToPlayPluginTest, LoadAllBlockedPlugins) {
browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK);
GURL url = ui_test_utils::GetTestUrl(
FilePath(), FilePath().AppendASCII("load_all_blocked_plugins.html"));
ui_test_utils::NavigateToURL(browser(), url);
string16 expected_title1(ASCIIToUTF16("1"));
content::TitleWatcher title_watcher1(
chrome::GetActiveWebContents(browser()), expected_title1);
content::RenderViewHost* host =
chrome::GetActiveWebContents(browser())->GetRenderViewHost();
host->Send(new ChromeViewMsg_LoadBlockedPlugins(
host->GetRoutingID(), std::string()));
EXPECT_EQ(expected_title1, title_watcher1.WaitAndGetTitle());
string16 expected_title2(ASCIIToUTF16("2"));
content::TitleWatcher title_watcher2(
chrome::GetActiveWebContents(browser()), expected_title2);
ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(
chrome::GetActiveWebContents(browser())->GetRenderViewHost(),
L"", L"window.inject()"));
EXPECT_EQ(expected_title2, title_watcher2.WaitAndGetTitle());
}
// If this flakes, use http://crbug.com/113057.
IN_PROC_BROWSER_TEST_F(ClickToPlayPluginTest, NoCallbackAtLoad) {
browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK);
GURL url("data:application/vnd.npapi-test,CallOnStartup();");
ui_test_utils::NavigateToURL(browser(), url);
// Inject the callback function into the HTML page generated by the browser.
ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(
chrome::GetActiveWebContents(browser())->GetRenderViewHost(),
L"", L"CallOnStartup = function() { document.title = \"OK\"; }"));
string16 expected_title(ASCIIToUTF16("OK"));
content::TitleWatcher title_watcher(
chrome::GetActiveWebContents(browser()), expected_title);
content::RenderViewHost* host =
chrome::GetActiveWebContents(browser())->GetRenderViewHost();
host->Send(new ChromeViewMsg_LoadBlockedPlugins(
host->GetRoutingID(), std::string()));
EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
}
#endif // !defined(USE_AURA)