Home | History | Annotate | Download | only in device
      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 
     23 namespace {
     24 const char kPortForwardingTestPage[] =
     25     "files/devtools/port_forwarding/main.html";
     26 
     27 const int kDefaultDebuggingPort = 9223;
     28 }
     29 
     30 class 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 
     63 IN_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