web_navigation_apitest.cc revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
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)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stringprintf.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/utf_string_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_extra_parts.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/tab_contents/render_view_context_menu.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_controller.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_dispatcher_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_throttle.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/context_menu_params.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/url_constants.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/resource_type.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An UI-less RenderViewContextMenu.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestRenderViewContextMenu : public RenderViewContextMenu {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRenderViewContextMenu(WebContents* web_contents,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const content::ContextMenuParams& params)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : RenderViewContextMenu(web_contents, params) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestRenderViewContextMenu() {}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void PlatformInit() OVERRIDE {}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void PlatformCancel() OVERRIDE {}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool GetAcceleratorForCommandId(int, ui::Accelerator*) OVERRIDE {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestRenderViewContextMenu);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class can defer requests for arbitrary URLs.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNavigationListener
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public base::RefCountedThreadSafe<TestNavigationListener> {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNavigationListener() {}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add |url| to the set of URLs we should delay.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DelayRequestsForURL(const GURL& url) {
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::DelayRequestsForURL, this, url));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urls_to_delay_.insert(url);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resume all deferred requests.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResumeAll() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::PostTask(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::BrowserThread::IO,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          FROM_HERE,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&TestNavigationListener::ResumeAll, this));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WeakThrottleList::const_iterator it;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (it = throttles_.begin(); it != throttles_.end(); ++it) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (*it)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (*it)->Resume();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles_.clear();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a ResourceThrottle if the request for |url| should be held.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needs to be invoked on the IO thread.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ResourceThrottle* CreateResourceThrottle(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceType::Type resource_type) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (urls_to_delay_.find(url) == urls_to_delay_.end())
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Throttle* throttle = new Throttle();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles_.push_back(throttle->AsWeakPtr());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return throttle;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<TestNavigationListener>;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestNavigationListener() {}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stores a throttle per URL request that we have delayed.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Throttle : public content::ResourceThrottle,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   public base::SupportsWeakPtr<Throttle> {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void Resume() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      controller()->Resume();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // content::ResourceThrottle implementation.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void WillStartRequest(bool* defer) OVERRIDE {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *defer = true;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::WeakPtr<Throttle> WeakThrottle;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<WeakThrottle> WeakThrottleList;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WeakThrottleList throttles_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of URLs to be delayed.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<GURL> urls_to_delay_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestNavigationListener);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Waits for a WC to be created. Once it starts loading |delay_url| (after at
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// least the first navigation has committed), it delays the load, executes
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |script| in the last committed RVH and resumes the load when |until_url|
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commits. This class expects |script| to trigger the load of |until_url|.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DelayLoadStartAndExecuteJavascript
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public content::NotificationObserver,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public content::WebContentsObserver {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript(
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestNavigationListener* test_navigation_listener,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& delay_url,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& script,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& until_url)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : content::WebContentsObserver(),
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_navigation_listener_(test_navigation_listener),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delay_url_(delay_url),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        until_url_(until_url),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        script_(script),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        script_was_executed_(false),
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh_(NULL) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   chrome::NOTIFICATION_TAB_ADDED,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   content::NotificationService::AllSources());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_navigation_listener_->DelayRequestsForURL(delay_url_);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DelayLoadStartAndExecuteJavascript() {}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type != chrome::NOTIFICATION_TAB_ADDED) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WebContentsObserver::Observe(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Details<content::WebContents>(details).ptr());
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.RemoveAll();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidStartProvisionalLoadForFrame(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 frame_id,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 parent_frame_id,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_main_frame,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& validated_url,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_error_page,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool is_iframe_srcdoc,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (validated_url != delay_url_ || !rvh_)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh_->ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(script_));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    script_was_executed_ = true;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidCommitProvisionalLoadForFrame(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int64 frame_id,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_main_frame,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PageTransition transition_type,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (script_was_executed_ && url == until_url_) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::WebContentsObserver::Observe(NULL);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener_->ResumeAll();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rvh_ = render_view_host;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL delay_url_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL until_url_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string script_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool script_was_executed_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* rvh_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DelayLoadStartAndExecuteJavascript);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ResourceDispatcherHostDelegate that adds a TestNavigationObserver.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestResourceDispatcherHostDelegate
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ChromeResourceDispatcherHostDelegate {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestResourceDispatcherHostDelegate(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prerender::PrerenderTracker* prerender_tracker,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestNavigationListener* test_navigation_listener)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ChromeResourceDispatcherHostDelegate(prerender_tracker),
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_navigation_listener_(test_navigation_listener) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestResourceDispatcherHostDelegate() {}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RequestBeginning(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequest* request,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::ResourceContext* resource_context,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      appcache::AppCacheService* appcache_service,
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResourceType::Type resource_type,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int child_id,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int route_id,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_continuation_of_transferred_request,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScopedVector<content::ResourceThrottle>* throttles) OVERRIDE {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeResourceDispatcherHostDelegate::RequestBeginning(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_context,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        appcache_service,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_type,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        child_id,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        route_id,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_continuation_of_transferred_request,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        throttles);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceThrottle* throttle =
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        test_navigation_listener_->CreateResourceThrottle(request->url(),
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          resource_type);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (throttle)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throttles->push_back(throttle);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcherHostDelegate);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used to manage the lifetime of the TestResourceDispatcherHostDelegate which
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// needs to be deleted before the threads are stopped.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestBrowserMainExtraParts : public ChromeBrowserMainExtraParts {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestBrowserMainExtraParts(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestNavigationListener* test_navigation_listener)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : test_navigation_listener_(test_navigation_listener) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestBrowserMainExtraParts() {}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestResourceDispatcherHostDelegate* resource_dispatcher_host_delegate() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!resource_dispatcher_host_delegate_.get()) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_dispatcher_host_delegate_.reset(
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          new TestResourceDispatcherHostDelegate(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              g_browser_process->prerender_tracker(),
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              test_navigation_listener_.get()));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return resource_dispatcher_host_delegate_.get();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChromeBrowserMainExtraParts implementation.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void PostMainMessageLoopRun() OVERRIDE {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    resource_dispatcher_host_delegate_.reset();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestResourceDispatcherHostDelegate>
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resource_dispatcher_host_delegate_;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestBrowserMainExtraParts);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A ContentBrowserClient that doesn't forward the RDH created signal.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestContentBrowserClient : public chrome::ChromeContentBrowserClient {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestContentBrowserClient(
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestNavigationListener* test_navigation_listener)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : test_navigation_listener_(test_navigation_listener) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestContentBrowserClient() {}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResourceDispatcherHostCreated() OVERRIDE {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't invoke ChromeContentBrowserClient::ResourceDispatcherHostCreated.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // It would notify BrowserProcessImpl which would create a
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ChromeResourceDispatcherHostDelegate and other objects. Not creating
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // other objects might turn out to be a problem in the future.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::ResourceDispatcherHost::Get()->SetDelegate(
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        browser_main_extra_parts_->resource_dispatcher_host_delegate());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual content::BrowserMainParts* CreateBrowserMainParts(
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::MainFunctionParams& parameters) OVERRIDE {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeBrowserMainParts* main_parts = static_cast<ChromeBrowserMainParts*>(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ChromeContentBrowserClient::CreateBrowserMainParts(parameters));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_main_extra_parts_ =
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestBrowserMainExtraParts(test_navigation_listener_.get());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    main_parts->AddParts(browser_main_extra_parts_);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return main_parts;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserMainExtraParts* browser_main_extra_parts_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestContentBrowserClient);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebNavigationApiTest : public ExtensionApiTest {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebNavigationApiTest() {}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebNavigationApiTest() {}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionApiTest::SetUpInProcessBrowserTestFixture();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_navigation_listener_ = new TestNavigationListener();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_browser_client_.reset(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestContentBrowserClient(test_navigation_listener_.get()));
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    original_content_browser_client_ = content::SetBrowserClientForTesting(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content_browser_client_.get());
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FrameNavigationState::set_allow_extension_scheme(true);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kAllowLegacyExtensionManifests);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver()->AddRule("*", "127.0.0.1");
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(StartTestServer());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionApiTest::TearDownInProcessBrowserTestFixture();
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::SetBrowserClientForTesting(original_content_browser_client_);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNavigationListener* test_navigation_listener() {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return test_navigation_listener_.get();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TestNavigationListener> test_navigation_listener_;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestContentBrowserClient> content_browser_client_;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ContentBrowserClient* original_content_browser_client_;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebNavigationApiTest);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Api) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_api.html")) << message_;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
388a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, GetFrame) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_getFrame.html")) << message_;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
393a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ClientRedirect) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_clientRedirect.html"))
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
399a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirect) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_serverRedirect.html"))
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// http://crbug.com/235171
406a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#if defined(OS_CHROMEOS) || (defined(OS_LINUX) && defined(USE_AURA))
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_ServerRedirectSingleProcess DISABLED_ServerRedirectSingleProcess
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define MAYBE_ServerRedirectSingleProcess ServerRedirectSingleProcess
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest,
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       MAYBE_ServerRedirectSingleProcess) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set max renderers to 1 to force running out of processes.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost::SetMaxRendererProcessCount(1);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "webnavigation", "test_serverRedirectSingleProcess.html"))
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(base::StringPrintf(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.a.com:%d/"
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "files/extensions/api_test/webnavigation/serverRedirect/a.html",
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair().port()));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL(base::StringPrintf(
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.b.com:%d/server-redirect?http://www.b.com:%d/",
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair().port(),
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->host_port_pair().port()));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ForwardBack) {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_forwardBack.html"))
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
448a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, IFrame) {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_iframe.html")) << message_;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, SrcDoc) {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_srcdoc.html")) << message_;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, OpenTab) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_openTab.html")) << message_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
463a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ReferenceFragment) {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_referenceFragment.html"))
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
469a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, SimpleLoad) {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_simpleLoad.html")) << message_;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
474a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Failures) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_failures.html")) << message_;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
479a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, FilteredTest) {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_filtered.html")) << message_;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
484a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, UserAction) {
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_userAction.html")) << message_;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id_, false);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = extension->GetResourceURL("userAction/a.html");
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This corresponds to "Open link in new tab".
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::ContextMenuParams params;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.is_editable = false;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.media_type = WebKit::WebContextMenuData::MediaTypeNone;
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.page_url = url;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.frame_id = WebNavigationTabObserver::Get(tab)->
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frame_navigation_state().GetMainFrameID().frame_num;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.link_url = extension->GetResourceURL("userAction/b.html");
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestRenderViewContextMenu menu(tab, params);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu.Init();
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  menu.ExecuteCommand(IDC_CONTENT_CONTEXT_OPENLINKNEWTAB, 0);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
518a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, RequestOpenTab) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("webnavigation", "test_requestOpenTab.html"))
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id_, false);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = extension->GetResourceURL("requestOpenTab/a.html");
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a link on a.html. Middle-click on it to open it in a new tab.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonMiddle;
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 7;
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 7;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
550a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlank) {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("webnavigation", "test_targetBlank.html"))
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WaitForLoadStop(tab);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = test_server()->GetURL(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/extensions/api_test/webnavigation/targetBlank/a.html");
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_LINK);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&params);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a link with target=_blank on a.html. Click on it to open it in a
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new tab.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 7;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 7;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
581a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, TargetBlankIncognito) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest(
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "webnavigation", "test_targetBlank.html",
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionApiTest::kFlagEnableIncognito)) << message_;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResultCatcher catcher;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = test_server()->GetURL(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/extensions/api_test/webnavigation/targetBlank/a.html");
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* otr_browser = ui_test_utils::OpenURLOffTheRecord(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile(), url);
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = otr_browser->tab_strip_model()->GetActiveWebContents();
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There's a link with target=_blank on a.html. Click on it to open it in a
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new tab.
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent mouse_event;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseDown;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.button = WebKit::WebMouseEvent::ButtonLeft;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.x = 7;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.y = 7;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.clickCount = 1;
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_event.type = WebKit::WebInputEvent::MouseUp;
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab->GetRenderViewHost()->ForwardMouseEvent(mouse_event);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
611a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, History) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RunExtensionSubtest("webnavigation", "test_history.html"))
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
617a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcess) {
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension(test_data_dir_.AppendASCII("webnavigation").AppendASCII("app"));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension(test_data_dir_.AppendASCII("webnavigation"));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id_, false);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/d.html.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script(
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("test1"),
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "navigate2()",
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("crossProcess/empty.html"));
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPageTest(
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("test_crossProcess.html").spec()))
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
638a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcessFragment) {
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension(test_data_dir_.AppendASCII("webnavigation"));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id_, false);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/f.html.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script3(
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("test3"),
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateFragment()",
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL(base::StringPrintf(
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "crossProcess/f.html?%d#foo",
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          test_server()->host_port_pair().port())));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/g.html.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script4(
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("test4"),
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateFragment()",
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL(base::StringPrintf(
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "crossProcess/g.html?%d#foo",
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          test_server()->host_port_pair().port())));
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPageTest(
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("test_crossProcessFragment.html").spec()))
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, CrossProcessHistory) {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadExtension(test_data_dir_.AppendASCII("webnavigation"));
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* extension =
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service->GetExtensionById(last_loaded_extension_id_, false);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/e.html.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script2(
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("test2"),
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateHistory()",
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("crossProcess/empty.html"));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/h.html.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script5(
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("test5"),
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateHistory()",
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("crossProcess/empty.html"));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See crossProcess/i.html.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelayLoadStartAndExecuteJavascript call_script6(
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_navigation_listener(),
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_server()->GetURL("test6"),
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "updateHistory()",
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("crossProcess/empty.html"));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(RunPageTest(
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension->GetResourceURL("test_crossProcessHistory.html").spec()))
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << message_;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, Crash) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the extension to set itself up and return control to us.
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(RunExtensionSubtest("webnavigation", "test_crash.html"))
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << message_;
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WaitForLoadStop(tab);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResultCatcher catcher;
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(base::StringPrintf(
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "http://www.a.com:%d/"
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "files/extensions/api_test/webnavigation/crash/a.html",
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_server()->host_port_pair().port()));
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kChromeUICrashURL));
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  url = GURL(base::StringPrintf(
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "http://www.a.com:%d/"
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "files/extensions/api_test/webnavigation/crash/b.html",
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test_server()->host_port_pair().port()));
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(catcher.GetNextResult()) << catcher.message();
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
731