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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_extra_parts.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/download/download_browsertest.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_controller.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_throttle.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/context_menu_params.h"
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "extensions/common/switches.h"
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebContextMenuData.h"
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing content::ResourceType;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class can defer requests for arbitrary URLs.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNavigationListener
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<TestNavigationListener> {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNavigationListener() {}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add |url| to the set of URLs we should delay.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DelayRequestsForURL(const GURL& url) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::PostTask(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::BrowserThread::IO,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&TestNavigationListener::DelayRequestsForURL, this, url));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urls_to_delay_.insert(url);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resume all deferred requests.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResumeAll() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::PostTask(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::BrowserThread::IO,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&TestNavigationListener::ResumeAll, this));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WeakThrottleList::const_iterator it;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (it = throttles_.begin(); it != throttles_.end(); ++it) {
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (it->get())
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*it)->Resume();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles_.clear();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a ResourceThrottle if the request for |url| should be held.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needs to be invoked on the IO thread.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ResourceThrottle* CreateResourceThrottle(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ResourceType resource_type) {
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (urls_to_delay_.find(url) == urls_to_delay_.end())
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Throttle* throttle = new Throttle();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles_.push_back(throttle->AsWeakPtr());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return throttle;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<TestNavigationListener>;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestNavigationListener() {}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores a throttle per URL request that we have delayed.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Throttle : public content::ResourceThrottle,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   public base::SupportsWeakPtr<Throttle> {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Resume() {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      controller()->Resume();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // content::ResourceThrottle implementation.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void WillStartRequest(bool* defer) OVERRIDE {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *defer = true;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    virtual const char* GetNameForLogging() const OVERRIDE {
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return "TestNavigationListener::Throttle";
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::WeakPtr<Throttle> WeakThrottle;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<WeakThrottle> WeakThrottleList;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WeakThrottleList throttles_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of URLs to be delayed.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> urls_to_delay_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestNavigationListener);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for a WC to be created. Once it starts loading |delay_url| (after at
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// least the first navigation has committed), it delays the load, executes
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |script| in the last committed RVH and resumes the load when a URL ending in
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |until_url_suffix| commits. This class expects |script| to trigger the load
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// of an URL ending in |until_url_suffix|.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DelayLoadStartAndExecuteJavascript
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::NotificationObserver,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::WebContentsObserver {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestNavigationListener* test_navigation_listener,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& delay_url,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& script,
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const std::string& until_url_suffix)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : content::WebContentsObserver(),
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_navigation_listener_(test_navigation_listener),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delay_url_(delay_url),
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        until_url_suffix_(until_url_suffix),
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        script_(script),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        script_was_executed_(false),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh_(NULL) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   chrome::NOTIFICATION_TAB_ADDED,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_navigation_listener_->DelayRequestsForURL(delay_url_);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DelayLoadStartAndExecuteJavascript() {}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type != chrome::NOTIFICATION_TAB_ADDED) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContentsObserver::Observe(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Details<content::WebContents>(details).ptr());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.RemoveAll();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStartProvisionalLoadForFrame(
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHost* render_frame_host,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_error_page,
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bool is_iframe_srcdoc) OVERRIDE {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validated_url != delay_url_ || !rvh_)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    rvh_->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16(script_));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script_was_executed_ = true;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidCommitProvisionalLoadForFrame(
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::RenderFrameHost* render_frame_host,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ui::PageTransition transition_type) OVERRIDE {
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (script_was_executed_ && EndsWith(url.spec(), until_url_suffix_, true)) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::WebContentsObserver::Observe(NULL);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener_->ResumeAll();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    rvh_ = render_frame_host->GetRenderViewHost();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL delay_url_;
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string until_url_suffix_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string script_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool script_was_executed_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DelayLoadStartAndExecuteJavascript);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ResourceDispatcherHostDelegate that adds a TestNavigationObserver.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestResourceDispatcherHostDelegate
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ChromeResourceDispatcherHostDelegate {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestResourceDispatcherHostDelegate(
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender::PrerenderTracker* prerender_tracker,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestNavigationListener* test_navigation_listener)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ChromeResourceDispatcherHostDelegate(prerender_tracker),
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_navigation_listener_(test_navigation_listener) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestResourceDispatcherHostDelegate() {}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RequestBeginning(
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::ResourceContext* resource_context,
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      content::AppCacheService* appcache_service,
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ResourceType resource_type,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScopedVector<content::ResourceThrottle>* throttles) OVERRIDE {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeResourceDispatcherHostDelegate::RequestBeginning(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_context,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        appcache_service,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_type,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        throttles);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceThrottle* throttle =
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_navigation_listener_->CreateResourceThrottle(request->url(),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          resource_type);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (throttle)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throttles->push_back(throttle);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebNavigationApiTest : public ExtensionApiTest {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebNavigationApiTest() {}
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebNavigationApiTest() {}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionApiTest::SetUpInProcessBrowserTestFixture();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FrameNavigationState::set_allow_extension_scheme(true);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kAllowLegacyExtensionManifests);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver()->AddRule("*", "127.0.0.1");
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
27323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ExtensionApiTest::SetUpOnMainThread();
27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    test_navigation_listener_ = new TestNavigationListener();
27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    resource_dispatcher_host_delegate_.reset(
27623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        new TestResourceDispatcherHostDelegate(
27723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            g_browser_process->prerender_tracker(),
27823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            test_navigation_listener_.get()));
27923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    content::ResourceDispatcherHost::Get()->SetDelegate(
28023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)        resource_dispatcher_host_delegate_.get());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNavigationListener* test_navigation_listener() {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_navigation_listener_.get();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<TestResourceDispatcherHostDelegate>
29023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      resource_dispatcher_host_delegate_;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebNavigationApiTest);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Api) {
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/api")) << message_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, GetFrame) {
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/getFrame")) << message_;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ClientRedirect) {
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/clientRedirect"))
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
311a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirect) {
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/serverRedirect"))
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Download) {
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir download_directory;
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(download_directory.CreateUniqueTempDir());
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DownloadPrefs* download_prefs =
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      DownloadPrefs::FromBrowserContext(browser()->profile());
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  download_prefs->SetDownloadPath(download_directory.path());
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DownloadTestObserverNotInProgress download_observer(
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::BrowserContext::GetDownloadManager(profile()), 1);
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  download_observer.StartObserving();
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(StartEmbeddedTestServer());
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/download"))
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  download_observer.WaitForFinished();
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirectSingleProcess) {
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set max renderers to 1 to force running out of processes.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost::SetMaxRendererProcessCount(1);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RunExtensionTest("webnavigation/serverRedirectSingleProcess"))
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(base::StringPrintf(
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.a.com:%d/"
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "extensions/api_test/webnavigation/serverRedirectSingleProcess/a.html",
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->port()));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL(base::StringPrintf(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.b.com:%d/server-redirect?http://www.b.com:%d/",
357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->port(),
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->port()));
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ForwardBack) {
366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/forwardBack")) << message_;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
370a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, IFrame) {
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/iframe")) << message_;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, SrcDoc) {
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/srcdoc")) << message_;
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, OpenTab) {
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/openTab")) << message_;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ReferenceFragment) {
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/referenceFragment"))
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
391a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, SimpleLoad) {
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/simpleLoad")) << message_;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Failures) {
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/failures")) << message_;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
401a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, FilteredTest) {
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/filtered")) << message_;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, UserAction) {
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/userAction")) << message_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id(), false);
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url = extension->GetResourceURL("a.html");
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This corresponds to "Open link in new tab".
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ContextMenuParams params;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.is_editable = false;
428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  params.media_type = blink::WebContextMenuData::MediaTypeNone;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.page_url = url;
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  params.link_url = extension->GetResourceURL("b.html");
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestRenderViewContextMenu menu(tab->GetMainFrame(), params);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu.Init();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  menu.ExecuteCommand(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB, 0);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, RequestOpenTab) {
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/requestOpenTab"))
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
4548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id(), false);
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url = extension->GetResourceURL("a.html");
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a link on a.html. Middle-click on it to open it in a new tab.
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent mouse_event;
461f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseDown;
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.button = blink::WebMouseEvent::ButtonMiddle;
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 7;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 7;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseUp;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlank) {
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/targetBlank")) << message_;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL url = embedded_test_server()->GetURL(
485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "/extensions/api_test/webnavigation/targetBlank/a.html");
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome::NavigateParams params(browser(), url, ui::PAGE_TRANSITION_LINK);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&params);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a link with target=_blank on a.html. Click on it to open it in a
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new tab.
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent mouse_event;
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseDown;
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.button = blink::WebMouseEvent::ButtonLeft;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 7;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 7;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseUp;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlankIncognito) {
506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTestIncognito("webnavigation/targetBlank"))
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL url = embedded_test_server()->GetURL(
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "/extensions/api_test/webnavigation/targetBlank/a.html");
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* otr_browser = ui_test_utils::OpenURLOffTheRecord(
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile(), url);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = otr_browser->tab_strip_model()->GetActiveWebContents();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a link with target=_blank on a.html. Click on it to open it in a
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new tab.
523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent mouse_event;
524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseDown;
525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.button = blink::WebMouseEvent::ButtonLeft;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 7;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 7;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  mouse_event.type = blink::WebInputEvent::MouseUp;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
536a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, History) {
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/history")) << message_;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
541a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcess) {
542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension(test_data_dir_.AppendASCII("webnavigation").AppendASCII("app"));
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/d.html.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL("/test1"),
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "navigate2()",
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "empty.html");
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/crossProcess")) << message_;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
556a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcessFragment) {
557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See crossProcessFragment/f.html.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script3(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL("/test3"),
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateFragment()",
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::StringPrintf("f.html?%d#foo", embedded_test_server()->port()));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See crossProcessFragment/g.html.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script4(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL("/test4"),
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateFragment()",
5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::StringPrintf("g.html?%d#foo", embedded_test_server()->port()));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/crossProcessFragment"))
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcessHistory) {
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See crossProcessHistory/e.html.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script2(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL("/test2"),
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateHistory()",
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "empty.html");
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See crossProcessHistory/h.html.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script5(
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL("/test5"),
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateHistory()",
5925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "empty.html");
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See crossProcessHistory/i.html.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script6(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->GetURL("/test6"),
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateHistory()",
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "empty.html");
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/crossProcessHistory"))
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      << message_;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// TODO(jam): http://crbug.com/350550
60623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#if !(defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER))
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Crash) {
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(StartEmbeddedTestServer());
609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunExtensionTest("webnavigation/crash")) << message_;
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WaitForLoadStop(tab);
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResultCatcher catcher;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(base::StringPrintf(
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "http://www.a.com:%d/"
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          "extensions/api_test/webnavigation/crash/a.html",
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->port()));
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL));
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = GURL(base::StringPrintf(
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "http://www.a.com:%d/"
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          "extensions/api_test/webnavigation/crash/b.html",
629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      embedded_test_server()->port()));
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
63623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
638