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(¶ms); 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