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"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kTestHtml[] = "/viewsource/test.html";
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestMedia[] = "files/media/pink_noise_140ms.wav";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef InProcessBrowserTest ViewSourceTest;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test renders a page in view-source and then checks to see if the title
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set in the html was set successfully (it shouldn't because we rendered the
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page in view source).
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky; see http://crbug.com/72201.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ViewSourceTest, DoesBrowserRenderInViewSource) {
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First we navigate to our view-source test page.
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url(content::kViewSourceScheme + std::string(":") +
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           embedded_test_server()->GetURL(kTestHtml).spec());
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the title didn't get set.  It should not be there (because we
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are in view-source mode).
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_NE(base::ASCIIToUTF16("foo"),
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test renders a page normally and then renders the same page in
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view-source mode. This is done since we had a problem at one point during
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementation of the view-source: prefix being consumed (removed from the
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL) if the URL was not changed (apart from adding the view-source prefix)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ViewSourceTest, DoesBrowserConsumeViewSourcePrefix) {
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First we navigate to google.html.
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL url(embedded_test_server()->GetURL(kTestHtml));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then we navigate to the same url but with the "view-source:" prefix.
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url_viewsource(content::kViewSourceScheme + std::string(":") +
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      url.spec());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_viewsource);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL should still be prefixed with "view-source:".
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url_viewsource.spec(),
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetURL().spec());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when looking at the actual page, we can select "View Source"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the menu.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ViewSourceTest, ViewSourceInMenuEnabledOnANormalPage) {
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL url(embedded_test_server()->GetURL(kTestHtml));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanViewSource(browser()));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For page that is media content, make sure that we cannot select "View Source"
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See http://crbug.com/83714
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ViewSourceTest, ViewSourceInMenuDisabledOnAMediaPage) {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(test_server()->GetURL(kTestMedia));
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* mime_type = browser()->tab_strip_model()->GetActiveWebContents()->
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentsMimeType().c_str();
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_STREQ("audio/wav", mime_type);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(chrome::CanViewSource(browser()));
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that when looking at the page source, we can't select "View Source"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the menu.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ViewSourceTest,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ViewSourceInMenuDisabledWhileViewingSource) {
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url_viewsource(content::kViewSourceScheme + std::string(":") +
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      embedded_test_server()->GetURL(kTestHtml).spec());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_viewsource);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanViewSource(browser()));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that reload initiated by the script on the view-source page leaves
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the page in view-source mode.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Times out on Mac, Windows, ChromeOS Linux: crbug.com/162080
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ViewSourceTest, DISABLED_TestViewSourceReload) {
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url_viewsource(content::kViewSourceScheme + std::string(":") +
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      embedded_test_server()->GetURL(kTestHtml).spec());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url_viewsource);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::ExecuteScript(browser()->tab_strip_model()->GetWebContentsAt(0),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             "window.location.reload();"));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer2(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer2.Wait();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(browser()->tab_strip_model()->GetWebContentsAt(0)->
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  GetController().GetActiveEntry()->IsViewSourceMode());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
134