desktop_capture_apitest.cc revision 3551c9c881056c480085172ff9840cab31610854
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <queue> 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h" 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/path_service.h" 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/thread_task_runner_handle.h" 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/api/desktop_capture/desktop_capture_api.h" 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/media/desktop_media_picker.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/dns/mock_host_resolver.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/screen_capturer.h" 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "third_party/webrtc/modules/desktop_capture/window_capturer.h" 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions { 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace { 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPicker : public DesktopMediaPicker { 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit FakeDesktopMediaPicker(const content::DesktopMediaID& source) 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) : source_(source), 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) weak_factory_(this) { 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~FakeDesktopMediaPicker() {} 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // DesktopMediaPicker interface. 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void Show(gfx::NativeWindow context, 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gfx::NativeWindow parent, 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const string16& app_name, 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<DesktopMediaPickerModel> model, 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const DoneCallback& done_callback) OVERRIDE { 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Post a task to call the callback asynchronously. 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::ThreadTaskRunnerHandle::Get()->PostTask( 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FROM_HERE, base::Bind(&FakeDesktopMediaPicker::CallCallback, 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) weak_factory_.GetWeakPtr(), done_callback)); 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void CallCallback(DoneCallback done_callback) { 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) done_callback.Run(source_); 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID source_; 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::WeakPtrFactory<FakeDesktopMediaPicker> weak_factory_; 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPicker); 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class FakeDesktopMediaPickerFactory : 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public DesktopCaptureChooseDesktopMediaFunction::PickerFactory { 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) struct Expectation { 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool screens; 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool windows; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID selected_source; 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FakeDesktopMediaPickerFactory() {} 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~FakeDesktopMediaPickerFactory() {} 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SetExpectations(const Expectation* expectation_array, int size) { 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (int i = 0; i < size; ++i) { 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expectations_.push(expectation_array[i]); 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // DesktopCaptureChooseDesktopMediaFunction::PickerFactory interface. 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual scoped_ptr<DesktopMediaPickerModel> CreateModel( 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<webrtc::ScreenCapturer> screen_capturer, 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<webrtc::WindowCapturer> window_capturer) OVERRIDE { 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(!expectations_.empty()); 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!expectations_.empty()) { 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expectations_.front().screens, !!screen_capturer.get()); 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(expectations_.front().windows, !!window_capturer.get()); 853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return scoped_ptr<DesktopMediaPickerModel>( 873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new DesktopMediaPickerModel(screen_capturer.Pass(), 883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) window_capturer.Pass())); 893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual scoped_ptr<DesktopMediaPicker> CreatePicker() OVERRIDE { 913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID next_source; 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!expectations_.empty()) { 933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) next_source = expectations_.front().selected_source; 943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) expectations_.pop(); 953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return scoped_ptr<DesktopMediaPicker>( 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) new FakeDesktopMediaPicker(next_source)); 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::queue<Expectation> expectations_; 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FakeDesktopMediaPickerFactory); 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class DesktopCaptureApiTest : public ExtensionApiTest { 1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DesktopCaptureApiTest() { 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DesktopCaptureChooseDesktopMediaFunction:: 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetPickerFactoryForTests(&picker_factory_); 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~DesktopCaptureApiTest() { 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DesktopCaptureChooseDesktopMediaFunction:: 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SetPickerFactoryForTests(NULL); 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) protected: 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GURL GetURLForPath(const std::string& host, const std::string& path) { 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string port = base::IntToString(embedded_test_server()->port()); 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) GURL::Replacements replacements; 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) replacements.SetHostStr(host); 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) replacements.SetPortStr(port); 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return embedded_test_server()->GetURL(path).ReplaceComponents(replacements); 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FakeDesktopMediaPickerFactory picker_factory_; 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, ChooseDesktopMedia) { 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Each of the following expectations corresponds to one test in 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // chrome/test/data/extensions/api_test/desktop_capture/test.js . 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FakeDesktopMediaPickerFactory::Expectation picker_expectations[] = { 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // pickerUiCanceled() 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, true, 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID() }, 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // chooseMedia() 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, true, 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) }, 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // screensOnly() 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, false, 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID() }, 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // WindowsOnly() 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { false, true, 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID() }, 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // chooseMediaAndGetStream() 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, true, 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) }, 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // chooseMediaAndTryGetStreamWithInvalidId() 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, true, 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) }, 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) picker_factory_.SetExpectations(picker_expectations, 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) arraysize(picker_expectations)); 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(RunExtensionTest("desktop_capture")) << message_; 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(DesktopCaptureApiTest, Delegation) { 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Initialize test server. 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::FilePath test_data; 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data)); 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) embedded_test_server()->ServeFilesFromDirectory(test_data.AppendASCII( 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "extensions/api_test/desktop_capture_delegate")); 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_resolver()->AddRule("*", embedded_test_server()->base_url().host()); 1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Load extension. 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::FilePath extension_path = 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) test_data_dir_.AppendASCII("desktop_capture_delegate"); 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const Extension* extension = LoadExtensionWithFlags( 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) extension_path, ExtensionBrowserTest::kFlagNone); 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(extension); 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ui_test_utils::NavigateToURL( 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) browser(), GetURLForPath("example.com", "/example.com.html")); 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) FakeDesktopMediaPickerFactory::Expectation picker_expectations[] = { 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, true, 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) }, 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { true, true, 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content::DesktopMediaID(content::DesktopMediaID::TYPE_SCREEN, 0) }, 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) picker_factory_.SetExpectations(picker_expectations, 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) arraysize(picker_expectations)); 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool result; 1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "getStream()", &result)); 1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(result); 1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "getStreamWithInvalidId()", &result)); 1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_TRUE(result); 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace extensions 201