| Index: chrome/browser/media/webrtc_browsertest_base.cc
|
| diff --git a/chrome/browser/media/webrtc_browsertest_base.cc b/chrome/browser/media/webrtc_browsertest_base.cc
|
| index 52707ebe04de4348f6dd4b840977ad461d69447b..52b55dcd502d63930f828d9cddf85ecf17cba45a 100644
|
| --- a/chrome/browser/media/webrtc_browsertest_base.cc
|
| +++ b/chrome/browser/media/webrtc_browsertest_base.cc
|
| @@ -78,6 +78,41 @@ bool JavascriptErrorDetectingLogHandler(int severity,
|
| return false;
|
| }
|
|
|
| +// PermissionRequestObserver ---------------------------------------------------
|
| +
|
| +// Used to observe the creation of permission prompt without responding.
|
| +class PermissionRequestObserver : public PermissionBubbleManager::Observer {
|
| + public:
|
| + explicit PermissionRequestObserver(content::WebContents* web_contents)
|
| + : bubble_manager_(PermissionBubbleManager::FromWebContents(web_contents)),
|
| + request_shown_(false),
|
| + message_loop_runner_(new content::MessageLoopRunner) {
|
| + bubble_manager_->AddObserver(this);
|
| + }
|
| + ~PermissionRequestObserver() override {
|
| + // Safe to remove twice if it happens.
|
| + bubble_manager_->RemoveObserver(this);
|
| + }
|
| +
|
| + void Wait() { message_loop_runner_->Run(); }
|
| +
|
| + bool request_shown() { return request_shown_; }
|
| +
|
| + private:
|
| + // PermissionBubbleManager::Observer
|
| + void OnBubbleAdded() override {
|
| + request_shown_ = true;
|
| + bubble_manager_->RemoveObserver(this);
|
| + message_loop_runner_->Quit();
|
| + }
|
| +
|
| + PermissionBubbleManager* bubble_manager_;
|
| + bool request_shown_;
|
| + scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver);
|
| +};
|
| +
|
| } // namespace
|
|
|
| WebRtcTestBase::WebRtcTestBase(): detect_errors_in_javascript_(false) {
|
| @@ -109,7 +144,9 @@ bool WebRtcTestBase::GetUserMediaWithSpecificConstraintsAndAccept(
|
| std::string result;
|
| PermissionBubbleManager::FromWebContents(tab_contents)
|
| ->set_auto_response_for_test(PermissionBubbleManager::ACCEPT_ALL);
|
| + PermissionRequestObserver permissionRequestObserver(tab_contents);
|
| GetUserMedia(tab_contents, constraints);
|
| + EXPECT_TRUE(permissionRequestObserver.request_shown());
|
| EXPECT_TRUE(content::ExecuteScriptAndExtractString(
|
| tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
|
| return kOkGotStream == result;
|
| @@ -126,7 +163,9 @@ void WebRtcTestBase::GetUserMediaWithSpecificConstraintsAndDeny(
|
| std::string result;
|
| PermissionBubbleManager::FromWebContents(tab_contents)
|
| ->set_auto_response_for_test(PermissionBubbleManager::DENY_ALL);
|
| + PermissionRequestObserver permissionRequestObserver(tab_contents);
|
| GetUserMedia(tab_contents, constraints);
|
| + EXPECT_TRUE(permissionRequestObserver.request_shown());
|
| EXPECT_TRUE(content::ExecuteScriptAndExtractString(
|
| tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
|
| EXPECT_EQ(kFailedWithPermissionDeniedError, result);
|
| @@ -137,13 +176,57 @@ void WebRtcTestBase::GetUserMediaAndDismiss(
|
| std::string result;
|
| PermissionBubbleManager::FromWebContents(tab_contents)
|
| ->set_auto_response_for_test(PermissionBubbleManager::DISMISS);
|
| + PermissionRequestObserver permissionRequestObserver(tab_contents);
|
| GetUserMedia(tab_contents, kAudioVideoCallConstraints);
|
| + EXPECT_TRUE(permissionRequestObserver.request_shown());
|
| // A dismiss should be treated like a deny.
|
| EXPECT_TRUE(content::ExecuteScriptAndExtractString(
|
| tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
|
| EXPECT_EQ(kFailedWithPermissionDismissedError, result);
|
| }
|
|
|
| +void WebRtcTestBase::GetUserMediaAndExpectAutoAcceptWithoutPrompt(
|
| + content::WebContents* tab_contents) const {
|
| + std::string result;
|
| + // We issue a GetUserMedia() request. We expect that the origin already has a
|
| + // sticky "accept" permission (e.g. because the caller previously called
|
| + // GetUserMediaAndAccept()), and therefore the GetUserMedia() request
|
| + // automatically succeeds without a prompt.
|
| + // If the caller made a mistake, a prompt may show up instead. For this case,
|
| + // we set an auto-response to avoid leaving the prompt hanging. The choice of
|
| + // DENY_ALL makes sure that the response to the prompt doesn't accidentally
|
| + // result in a newly granted media stream permission.
|
| + PermissionBubbleManager::FromWebContents(tab_contents)
|
| + ->set_auto_response_for_test(PermissionBubbleManager::DENY_ALL);
|
| + PermissionRequestObserver permissionRequestObserver(tab_contents);
|
| + GetUserMedia(tab_contents, kAudioVideoCallConstraints);
|
| + EXPECT_FALSE(permissionRequestObserver.request_shown());
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractString(
|
| + tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
|
| + EXPECT_EQ(kOkGotStream, result);
|
| +}
|
| +
|
| +void WebRtcTestBase::GetUserMediaAndExpectAutoDenyWithoutPrompt(
|
| + content::WebContents* tab_contents) const {
|
| + std::string result;
|
| + // We issue a GetUserMedia() request. We expect that the origin already has a
|
| + // sticky "deny" permission (e.g. because the caller previously called
|
| + // GetUserMediaAndDeny()), and therefore the GetUserMedia() request
|
| + // automatically succeeds without a prompt.
|
| + // If the caller made a mistake, a prompt may show up instead. For this case,
|
| + // we set an auto-response to avoid leaving the prompt hanging. The choice of
|
| + // ACCEPT_ALL makes sure that the response to the prompt doesn't accidentally
|
| + // result in a newly granted media stream permission.
|
| + PermissionBubbleManager::FromWebContents(tab_contents)
|
| + ->set_auto_response_for_test(PermissionBubbleManager::ACCEPT_ALL);
|
| + PermissionRequestObserver permissionRequestObserver(tab_contents);
|
| + GetUserMedia(tab_contents, kAudioVideoCallConstraints);
|
| + EXPECT_FALSE(permissionRequestObserver.request_shown());
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractString(
|
| + tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
|
| + EXPECT_EQ(kFailedWithPermissionDeniedError, result);
|
| +}
|
| +
|
| void WebRtcTestBase::GetUserMedia(content::WebContents* tab_contents,
|
| const std::string& constraints) const {
|
| // Request user media: this will launch the media stream info bar or bubble.
|
| @@ -168,8 +251,15 @@ WebRtcTestBase::OpenPageAndGetUserMediaInNewTabWithConstraints(
|
| ui_test_utils::NavigateToURL(browser(), url);
|
| content::WebContents* new_tab =
|
| browser()->tab_strip_model()->GetActiveWebContents();
|
| - EXPECT_TRUE(GetUserMediaWithSpecificConstraintsAndAccept(
|
| - new_tab, constraints));
|
| + // Accept if necessary, but don't expect a prompt (because auto-accept is also
|
| + // okay).
|
| + PermissionBubbleManager::FromWebContents(new_tab)
|
| + ->set_auto_response_for_test(PermissionBubbleManager::ACCEPT_ALL);
|
| + GetUserMedia(new_tab, constraints);
|
| + std::string result;
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractString(
|
| + new_tab->GetMainFrame(), "obtainGetUserMediaResult();", &result));
|
| + EXPECT_EQ(kOkGotStream, result);
|
| return new_tab;
|
| }
|
|
|
|
|