Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / streams_private / streams_private_apitest.cc
index 5bc5790..333de0f 100644 (file)
@@ -7,7 +7,6 @@
 #include "base/prefs/pref_service.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/extensions/extension_system.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
@@ -22,6 +21,8 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/download_test_observer.h"
 #include "extensions/browser/event_router.h"
+#include "extensions/browser/extension_system.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -57,7 +58,7 @@ scoped_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
     return response.PassAs<HttpResponse>();
   }
 
-  // For relative path "/test_path_attch.txt", return success response with
+  // For relative path "/text_path_attch.txt", return success response with
   // MIME type "plain/text" and content "txt content". Also, set content
   // disposition to be attachment.
   if (request.relative_url == "/text_path_attch.txt") {
@@ -68,6 +69,7 @@ scoped_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
                               "attachment; filename=test_path.txt");
     return response.PassAs<HttpResponse>();
   }
+
   // For relative path "/test_path_attch.txt", return success response with
   // MIME type "plain/text" and content "txt content".
   if (request.relative_url == "/text_path.txt") {
@@ -77,6 +79,20 @@ scoped_ptr<HttpResponse> HandleRequest(const HttpRequest& request) {
     return response.PassAs<HttpResponse>();
   }
 
+  // A random HTML file to navigate to.
+  if (request.relative_url == "/index.html") {
+    response->set_code(net::HTTP_OK);
+    response->set_content("html content");
+    response->set_content_type("text/html");
+    return response.PassAs<HttpResponse>();
+  }
+
+  // Respond to /favicon.ico for navigating to the page.
+  if (request.relative_url == "/favicon.ico") {
+    response->set_code(net::HTTP_NOT_FOUND);
+    return response.PassAs<HttpResponse>();
+  }
+
   // No other requests should be handled in the tests.
   EXPECT_TRUE(false) << "NOTREACHED!";
   response->set_code(net::HTTP_NOT_FOUND);
@@ -228,6 +244,48 @@ IN_PROC_BROWSER_TEST_F(StreamsPrivateApiTest, Navigate) {
   EXPECT_TRUE(catcher.GetNextResult());
 }
 
+// Tests that navigating cross-site to a resource with a MIME type handleable by
+// an installed, white-listed extension invokes the extension's
+// onExecuteContentHandler event (and does not start a download).
+// Regression test for http://crbug.com/342999.
+IN_PROC_BROWSER_TEST_F(StreamsPrivateApiTest, NavigateCrossSite) {
+#if defined(OS_WIN) && defined(USE_ASH)
+  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
+  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
+    return;
+#endif
+
+  ASSERT_TRUE(LoadTestExtension()) << message_;
+
+  ResultCatcher catcher;
+
+  // Navigate to a URL on a different hostname.
+  std::string initial_host = "www.example.com";
+  host_resolver()->AddRule(initial_host, "127.0.0.1");
+  GURL::Replacements replacements;
+  replacements.SetHostStr(initial_host);
+  GURL initial_url =
+      test_server_->GetURL("/index.html").ReplaceComponents(replacements);
+  ui_test_utils::NavigateToURL(browser(), initial_url);
+
+  // Now navigate to the doc file; the extension should pick it up normally.
+  ui_test_utils::NavigateToURL(browser(),
+                               test_server_->GetURL("/doc_path.doc"));
+
+  // Wait for the response from the test server.
+  base::MessageLoop::current()->RunUntilIdle();
+
+  // There should be no downloads started by the navigation.
+  DownloadManager* download_manager = GetDownloadManager();
+  std::vector<DownloadItem*> downloads;
+  download_manager->GetAllDownloads(&downloads);
+  ASSERT_EQ(0u, downloads.size());
+
+  // The test extension should receive onExecuteContentHandler event with MIME
+  // type 'application/msword' (and call chrome.test.notifySuccess).
+  EXPECT_TRUE(catcher.GetNextResult());
+}
+
 // Tests that navigation to an attachment starts a download, even if there is an
 // extension with a file browser handler that can handle the attachment's MIME
 // type.
@@ -238,7 +296,7 @@ IN_PROC_BROWSER_TEST_F(StreamsPrivateApiTest, NavigateToAnAttachment) {
 
   ResultCatcher catcher;
 
-  // The test should start a downloadm.
+  // The test should start a download.
   DownloadManager* download_manager = GetDownloadManager();
   scoped_ptr<content::DownloadTestObserver> download_observer(
       new content::DownloadTestObserverInProgress(download_manager, 1));