1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/command_line.h"
6#include "base/compiler_specific.h"
7#include "base/prefs/pref_service.h"
8#include "base/strings/string_number_conversions.h"
9#include "chrome/browser/devtools/browser_list_tabcontents_provider.h"
10#include "chrome/browser/devtools/device/port_forwarding_controller.h"
11#include "chrome/browser/devtools/device/self_device_provider.h"
12#include "chrome/browser/profiles/profile.h"
13#include "chrome/browser/ui/browser.h"
14#include "chrome/browser/ui/tabs/tab_strip_model.h"
15#include "chrome/common/chrome_switches.h"
16#include "chrome/common/pref_names.h"
17#include "chrome/test/base/in_process_browser_test.h"
18#include "chrome/test/base/ui_test_utils.h"
19#include "content/public/browser/web_contents.h"
20#include "content/public/test/browser_test_utils.h"
21#include "content/public/test/test_utils.h"
22
23namespace {
24const char kPortForwardingTestPage[] =
25    "files/devtools/port_forwarding/main.html";
26
27const int kDefaultDebuggingPort = 9223;
28}
29
30class PortForwardingTest: public InProcessBrowserTest {
31  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
32    InProcessBrowserTest::SetUpCommandLine(command_line);
33    command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort,
34        base::IntToString(kDefaultDebuggingPort));
35  }
36
37 protected:
38  class Listener : public PortForwardingController::Listener {
39   public:
40    explicit Listener(Profile* profile)
41        : profile_(profile) {
42      PortForwardingController::Factory::GetForProfile(profile_)->
43          AddListener(this);
44    }
45
46    virtual ~Listener() {
47      PortForwardingController::Factory::GetForProfile(profile_)->
48          RemoveListener(this);
49    }
50
51    virtual void PortStatusChanged(const DevicesStatus& status) OVERRIDE {
52      if (status.empty())
53        return;
54      base::MessageLoop::current()->PostTask(
55          FROM_HERE, base::MessageLoop::QuitClosure());
56    }
57
58   private:
59    Profile* profile_;
60  };
61};
62
63IN_PROC_BROWSER_TEST_F(PortForwardingTest,
64                       LoadPageWithStyleAnsScript) {
65  Profile* profile = browser()->profile();
66
67  AndroidDeviceManager::DeviceProviders device_providers;
68  device_providers.push_back(new SelfAsDeviceProvider(kDefaultDebuggingPort));
69  DevToolsAndroidBridge::Factory::GetForProfile(profile)->
70      set_device_providers_for_test(device_providers);
71
72  ASSERT_TRUE(test_server()->Start());
73  GURL original_url = test_server()->GetURL(kPortForwardingTestPage);
74
75  std::string forwarding_port("8000");
76  GURL forwarding_url(original_url.scheme() + "://" +
77      original_url.host() + ":" + forwarding_port + original_url.path());
78
79  PrefService* prefs = profile->GetPrefs();
80  prefs->SetBoolean(prefs::kDevToolsPortForwardingEnabled, true);
81
82  base::DictionaryValue config;
83  config.SetString(
84      forwarding_port, original_url.host() + ":" + original_url.port());
85  prefs->Set(prefs::kDevToolsPortForwardingConfig, config);
86
87  Listener wait_for_port_forwarding(profile);
88  content::RunMessageLoop();
89
90  BrowserListTabContentsProvider::EnableTethering();
91
92  ui_test_utils::NavigateToURL(browser(), forwarding_url);
93
94  content::RenderViewHost* rvh = browser()->tab_strip_model()->
95      GetWebContentsAt(0)->GetRenderViewHost();
96
97  std::string result;
98  ASSERT_TRUE(
99      content::ExecuteScriptAndExtractString(
100          rvh,
101          "window.domAutomationController.send(document.title)",
102          &result));
103  ASSERT_EQ("Port forwarding test", result) << "Document has not loaded.";
104
105  ASSERT_TRUE(
106      content::ExecuteScriptAndExtractString(
107          rvh,
108          "window.domAutomationController.send(getBodyTextContent())",
109          &result));
110  ASSERT_EQ("content", result) << "Javascript has not loaded.";
111
112  ASSERT_TRUE(
113      content::ExecuteScriptAndExtractString(
114          rvh,
115          "window.domAutomationController.send(getBodyMarginLeft())",
116          &result));
117  ASSERT_EQ("100px", result) << "CSS has not loaded.";
118}
119