Chromium Code Reviews| Index: chrome/browser/apps/guest_view/web_view_browsertest.cc |
| diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc |
| index d5676863461c262ea31a1b988c515783d6c5cc9f..acf960164eac66af0edeaea626f136675870caf1 100644 |
| --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc |
| +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc |
| @@ -806,6 +806,83 @@ class WebContentsAudioMutedObserver : public content::WebContentsObserver { |
| DISALLOW_COPY_AND_ASSIGN(WebContentsAudioMutedObserver); |
| }; |
| +class MockWasAudibleWebContentsDelegate : public content::WebContentsDelegate { |
|
Avi (use Gerrit)
2016/05/13 21:54:26
This isn't a "mock", this is a legitimate delegate
wjmaclean
2016/05/13 22:17:23
Done.
|
| + public: |
| + MockWasAudibleWebContentsDelegate() : invalidate_type_tab_seen_(false) {} |
| + |
| + void NavigationStateChanged(content::WebContents* contents, |
| + content::InvalidateTypes changed_flags) override { |
| + if (changed_flags == content::INVALIDATE_TYPE_TAB) { |
| + invalidate_type_tab_seen_ = true; |
| + if (message_loop_runner_.get()) |
| + message_loop_runner_->Quit(); |
| + } |
| + } |
| + |
| + void WaitForInvalidateTypeTab() { |
| + if (!invalidate_type_tab_seen_) { |
| + message_loop_runner_ = new content::MessageLoopRunner; |
| + message_loop_runner_->Run(); |
| + } |
| + invalidate_type_tab_seen_ = false; |
| + } |
| + |
| + private: |
| + bool invalidate_type_tab_seen_; |
| + scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(MockWasAudibleWebContentsDelegate); |
| +}; |
| + |
| +IN_PROC_BROWSER_TEST_P(WebViewTest, AudibilityStatePropagates) { |
| + ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest audio. |
| + |
| + LoadAppWithGuest("web_view/simple"); |
| + |
| + content::WebContents* embedder = GetEmbedderWebContents(); |
| + content::WebContents* guest = GetGuestWebContents(); |
| + |
| + EXPECT_FALSE(embedder->WasRecentlyAudible()); |
| + EXPECT_FALSE(guest->WasRecentlyAudible()); |
| + |
| + std::unique_ptr<MockWasAudibleWebContentsDelegate> mock_delegate( |
|
Avi (use Gerrit)
2016/05/13 21:54:25
Same "mock" naming issue here.
wjmaclean
2016/05/13 22:17:23
Done.
|
| + new MockWasAudibleWebContentsDelegate); |
| + embedder->SetDelegate(mock_delegate.get()); |
| + |
| + // Just in case we get console error messages from the guest, we should |
| + // surface them in the test output. |
| + EXPECT_TRUE(content::ExecuteScript( |
| + embedder, |
| + "wv = document.getElementsByTagName('webview')[0];" |
| + "wv.addEventListener('consolemessage', function (e) {" |
| + " console.log('WebViewTest Guest: ' + e.message);" |
| + "});")); |
| + |
| + // Inject JS to start audio. |
| + GURL audio_url = embedded_test_server()->GetURL( |
| + "/extensions/platform_apps/web_view/simple/ping.mp3"); |
| + std::string setup_audio_script = base::StringPrintf( |
| + "ae = document.createElement('audio');" |
| + "ae.src='%s';" |
| + "document.body.appendChild(ae);" |
| + "ae.play();", |
| + audio_url.spec().c_str()); |
| + EXPECT_TRUE(content::ExecuteScript(guest, setup_audio_script)); |
| + |
| + mock_delegate->WaitForInvalidateTypeTab(); |
| + EXPECT_TRUE(embedder->WasRecentlyAudible()); |
| + EXPECT_TRUE(guest->WasRecentlyAudible()); |
| + |
| + // Wait for audio to stop (the .mp3 is shorter than the audio stream |
|
Avi (use Gerrit)
2016/05/13 21:54:26
unmatched ( in the comment
wjmaclean
2016/05/13 22:17:23
Done.
|
| + // monitor's timeout, so no need to explicitly stop it. Other callers may |
| + // call NotifyNavigationStateChanged() on the embedder web contents, so |
| + // we may have to wait several times. |
| + while (embedder->WasRecentlyAudible()) |
| + mock_delegate->WaitForInvalidateTypeTab(); |
| + EXPECT_FALSE(embedder->WasRecentlyAudible()); |
| + EXPECT_FALSE(guest->WasRecentlyAudible()); |
| +} |
| + |
| IN_PROC_BROWSER_TEST_P(WebViewTest, AudioMutesWhileAttached) { |
| LoadAppWithGuest("web_view/simple"); |