// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_MEDIA_WEBRTC_BROWSERTEST_BASE_H_ #define CHROME_BROWSER_MEDIA_WEBRTC_BROWSERTEST_BASE_H_ #include #include "chrome/test/base/in_process_browser_test.h" namespace infobars { class InfoBar; } namespace content { class WebContents; } // Base class for WebRTC browser tests with useful primitives for interacting // getUserMedia. We use inheritance here because it makes the test code look // as clean as it can be. class WebRtcTestBase : public InProcessBrowserTest { public: // Typical constraints. static const char kAudioVideoCallConstraints[]; static const char kAudioOnlyCallConstraints[]; static const char kVideoOnlyCallConstraints[]; static const char kVideoCallConstraintsQVGA[]; static const char kVideoCallConstraints360p[]; static const char kVideoCallConstraintsVGA[]; static const char kVideoCallConstraints720p[]; static const char kVideoCallConstraints1080p[]; static const char kAudioVideoCallConstraints360p[]; static const char kAudioVideoCallConstraints720p[]; static const char kOkGotStream[]; static const char kFailedWithPermissionDeniedError[]; static const char kFailedWithPermissionDismissedError[]; protected: WebRtcTestBase(); ~WebRtcTestBase() override; // These all require that the loaded page fulfills the public interface in // chrome/test/data/webrtc/getusermedia.js. // If an error is reported back from the getUserMedia call, these functions // will return false. bool GetUserMediaAndAccept(content::WebContents* tab_contents) const; bool GetUserMediaWithSpecificConstraintsAndAccept( content::WebContents* tab_contents, const std::string& constraints) const; void GetUserMediaAndDeny(content::WebContents* tab_contents); void GetUserMediaWithSpecificConstraintsAndDeny( content::WebContents* tab_contents, const std::string& constraints) const; void GetUserMediaAndDismiss(content::WebContents* tab_contents) const; void GetUserMedia(content::WebContents* tab_contents, const std::string& constraints) const; // Convenience method which opens the page at url, calls GetUserMediaAndAccept // and returns the new tab. content::WebContents* OpenPageAndGetUserMediaInNewTab(const GURL& url) const; // Convenience method which opens the page at url, calls // GetUserMediaAndAcceptWithSpecificConstraints and returns the new tab. content::WebContents* OpenPageAndGetUserMediaInNewTabWithConstraints( const GURL& url, const std::string& constraints) const; // Convenience method which gets the URL for |test_page| and calls // OpenPageAndGetUserMediaInNewTab(). content::WebContents* OpenTestPageAndGetUserMediaInNewTab( const std::string& test_page) const; // Opens the page at |url| where getUserMedia has been invoked through other // means and accepts the user media request. content::WebContents* OpenPageAndAcceptUserMedia(const GURL& url) const; // Closes the last local stream acquired by the GetUserMedia* methods. void CloseLastLocalStream(content::WebContents* tab_contents) const; std::string ExecuteJavascript(const std::string& javascript, content::WebContents* tab_contents) const; // Sets up a peer connection in the tab and adds the current local stream // (which you can prepare by calling one of the GetUserMedia* methods above). void SetupPeerconnectionWithLocalStream(content::WebContents* tab) const; // Same as above but does not add the local stream. void SetupPeerconnectionWithoutLocalStream(content::WebContents* tab) const; // Exchanges offers and answers between the peer connections in the // respective tabs. Before calling this, you must have prepared peer // connections in both tabs and configured them as you like (for instance by // calling SetupPeerconnectionWithLocalStream). void NegotiateCall(content::WebContents* from_tab, content::WebContents* to_tab) const; // Hangs up a negotiated call. void HangUp(content::WebContents* from_tab) const; // Call this to enable monitoring of javascript errors for this test method. // This will only work if the tests are run sequentially by the test runner // (i.e. with --test-launcher-developer-mode or --test-launcher-jobs=1). void DetectErrorsInJavaScript(); // Methods for detecting if video is playing (the loaded page must have // chrome/test/data/webrtc/video_detector.js and its dependencies loaded to // make that work). Looks at a 320x240 area of the target video tag. void StartDetectingVideo(content::WebContents* tab_contents, const std::string& video_element) const; bool WaitForVideoToPlay(content::WebContents* tab_contents) const; // Returns the stream size as a string on the format x. std::string GetStreamSize(content::WebContents* tab_contents, const std::string& video_element) const; // Methods to check what devices we have on the system. bool HasWebcamAvailableOnSystem(content::WebContents* tab_contents) const; // Returns true if we're on WinXP, that lovely operating system of bliss. bool OnWinXp() const; // Returns true if we're on win 8. bool OnWin8() const; private: void CloseInfoBarInTab(content::WebContents* tab_contents, infobars::InfoBar* infobar) const; std::string CreateLocalOffer(content::WebContents* from_tab) const; std::string CreateAnswer(std::string local_offer, content::WebContents* to_tab) const; void ReceiveAnswer(std::string answer, content::WebContents* from_tab) const; void GatherAndSendIceCandidates(content::WebContents* from_tab, content::WebContents* to_tab) const; infobars::InfoBar* GetUserMediaAndWaitForInfoBar( content::WebContents* tab_contents, const std::string& constraints) const; bool detect_errors_in_javascript_; DISALLOW_COPY_AND_ASSIGN(WebRtcTestBase); }; #endif // CHROME_BROWSER_MEDIA_WEBRTC_BROWSERTEST_BASE_H_