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