10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/command_line.h" 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/compiler_specific.h" 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/prefs/pref_service.h" 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/strings/string_number_conversions.h" 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/devtools/browser_list_tabcontents_provider.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/devtools/device/port_forwarding_controller.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/devtools/device/self_device_provider.h" 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/profiles/profile.h" 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/browser.h" 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h" 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/common/chrome_switches.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/common/pref_names.h" 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/in_process_browser_test.h" 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/test/base/ui_test_utils.h" 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/browser/web_contents.h" 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/browser_test_utils.h" 210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "content/public/test/test_utils.h" 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace { 240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char kPortForwardingTestPage[] = 250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "files/devtools/port_forwarding/main.html"; 260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kDefaultDebuggingPort = 9223; 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass PortForwardingTest: public InProcessBrowserTest { 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch InProcessBrowserTest::SetUpCommandLine(command_line); 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort, 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::IntToString(kDefaultDebuggingPort)); 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch protected: 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch class Listener : public PortForwardingController::Listener { 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public: 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch explicit Listener(Profile* profile) 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : profile_(profile) { 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PortForwardingController::Factory::GetForProfile(profile_)-> 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AddListener(this); 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~Listener() { 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PortForwardingController::Factory::GetForProfile(profile_)-> 480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RemoveListener(this); 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void PortStatusChanged(const DevicesStatus& status) OVERRIDE { 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (status.empty()) 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::MessageLoop::current()->PostTask( 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FROM_HERE, base::MessageLoop::QuitClosure()); 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private: 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* profile_; 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }; 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 630529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(PortForwardingTest, 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadPageWithStyleAnsScript) { 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Profile* profile = browser()->profile(); 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch AndroidDeviceManager::DeviceProviders device_providers; 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_providers.push_back(new SelfAsDeviceProvider(kDefaultDebuggingPort)); 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DevToolsAndroidBridge::Factory::GetForProfile(profile)-> 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch set_device_providers_for_test(device_providers); 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(test_server()->Start()); 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL original_url = test_server()->GetURL(kPortForwardingTestPage); 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string forwarding_port("8000"); 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL forwarding_url(original_url.scheme() + "://" + 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch original_url.host() + ":" + forwarding_port + original_url.path()); 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PrefService* prefs = profile->GetPrefs(); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch prefs->SetBoolean(prefs::kDevToolsPortForwardingEnabled, true); 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::DictionaryValue config; 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch config.SetString( 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch forwarding_port, original_url.host() + ":" + original_url.port()); 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch prefs->Set(prefs::kDevToolsPortForwardingConfig, config); 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Listener wait_for_port_forwarding(profile); 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::RunMessageLoop(); 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserListTabContentsProvider::EnableTethering(); 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ui_test_utils::NavigateToURL(browser(), forwarding_url); 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::RenderViewHost* rvh = browser()->tab_strip_model()-> 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetWebContentsAt(0)->GetRenderViewHost(); 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string result; 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE( 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::ExecuteScriptAndExtractString( 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rvh, 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "window.domAutomationController.send(document.title)", 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &result)); 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ("Port forwarding test", result) << "Document has not loaded."; 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE( 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::ExecuteScriptAndExtractString( 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rvh, 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "window.domAutomationController.send(getBodyTextContent())", 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &result)); 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ("content", result) << "Javascript has not loaded."; 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE( 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch content::ExecuteScriptAndExtractString( 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch rvh, 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "window.domAutomationController.send(getBodyMarginLeft())", 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch &result)); 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_EQ("100px", result) << "CSS has not loaded."; 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 119