| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/json/json_writer.h" | 5 #include "base/json/json_writer.h" |
| 6 #include "base/strings/string_util.h" | 6 #include "base/strings/string_util.h" |
| 7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "base/synchronization/waitable_event.h" | 9 #include "base/synchronization/waitable_event.h" |
| 10 #include "base/threading/platform_thread.h" | 10 #include "base/threading/platform_thread.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "content/public/browser/web_contents.h" | 25 #include "content/public/browser/web_contents.h" |
| 26 #include "content/public/test/browser_test_utils.h" | 26 #include "content/public/test/browser_test_utils.h" |
| 27 #include "extensions/common/permissions/permission_set.h" | 27 #include "extensions/common/permissions/permission_set.h" |
| 28 #include "extensions/common/permissions/permissions_data.h" | 28 #include "extensions/common/permissions/permissions_data.h" |
| 29 #include "media/audio/audio_manager.h" | 29 #include "media/audio/audio_manager.h" |
| 30 #include "media/audio/audio_manager_base.h" | 30 #include "media/audio/audio_manager_base.h" |
| 31 #include "net/test/embedded_test_server/embedded_test_server.h" | 31 #include "net/test/embedded_test_server/embedded_test_server.h" |
| 32 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
| 33 | 33 |
| 34 using base::JSONWriter; | 34 using base::JSONWriter; |
| 35 using content::RenderViewHost; | 35 using content::RenderProcessHost; |
| 36 using content::WebContents; | 36 using content::WebContents; |
| 37 using media::AudioDeviceNames; | 37 using media::AudioDeviceNames; |
| 38 using media::AudioManager; | 38 using media::AudioManager; |
| 39 | 39 |
| 40 namespace extensions { | 40 namespace extensions { |
| 41 | 41 |
| 42 using extension_function_test_utils::RunFunctionAndReturnError; | 42 using extension_function_test_utils::RunFunctionAndReturnError; |
| 43 using extension_function_test_utils::RunFunctionAndReturnSingleResult; | 43 using extension_function_test_utils::RunFunctionAndReturnSingleResult; |
| 44 | 44 |
| 45 class AudioWaitingExtensionTest : public ExtensionApiTest { | 45 class AudioWaitingExtensionTest : public ExtensionApiTest { |
| 46 protected: | 46 protected: |
| 47 void WaitUntilAudioIsPlaying(WebContents* tab) { | 47 void WaitUntilAudioIsPlaying(WebContents* tab) { |
| 48 // Wait for audio to start playing. We gate this on there being one | 48 // Wait for audio to start playing. We gate this on there being one |
| 49 // or more AudioOutputController objects for our tab. | 49 // or more AudioOutputController objects for our tab. |
| 50 bool audio_playing = false; | 50 bool audio_playing = false; |
| 51 for (size_t remaining_tries = 50; remaining_tries > 0; --remaining_tries) { | 51 for (size_t remaining_tries = 50; remaining_tries > 0; --remaining_tries) { |
| 52 tab->GetRenderViewHost()->GetAudioOutputControllers( | 52 tab->GetRenderProcessHost()->GetAudioOutputControllers( |
| 53 base::Bind(OnAudioControllers, &audio_playing)); | 53 base::Bind(OnAudioControllers, &audio_playing)); |
| 54 base::MessageLoop::current()->RunUntilIdle(); | 54 base::MessageLoop::current()->RunUntilIdle(); |
| 55 if (audio_playing) | 55 if (audio_playing) |
| 56 break; | 56 break; |
| 57 | 57 |
| 58 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); | 58 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); |
| 59 } | 59 } |
| 60 | 60 |
| 61 if (!audio_playing) | 61 if (!audio_playing) |
| 62 FAIL() << "Audio did not start playing within ~5 seconds."; | 62 FAIL() << "Audio did not start playing within ~5 seconds."; |
| 63 } | 63 } |
| 64 | 64 |
| 65 // Used by the test above to wait until audio is playing. | 65 // Used by the test above to wait until audio is playing. |
| 66 static void OnAudioControllers( | 66 static void OnAudioControllers( |
| 67 bool* audio_playing, | 67 bool* audio_playing, |
| 68 const RenderViewHost::AudioOutputControllerList& list) { | 68 const RenderProcessHost::AudioOutputControllerList& list) { |
| 69 if (!list.empty()) | 69 if (!list.empty()) |
| 70 *audio_playing = true; | 70 *audio_playing = true; |
| 71 } | 71 } |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 class WebrtcAudioPrivateTest : public AudioWaitingExtensionTest { | 74 class WebrtcAudioPrivateTest : public AudioWaitingExtensionTest { |
| 75 public: | 75 public: |
| 76 WebrtcAudioPrivateTest() | 76 WebrtcAudioPrivateTest() |
| 77 : enumeration_event_(false, false) { | 77 : enumeration_event_(false, false) { |
| 78 } | 78 } |
| 79 | 79 |
| 80 void SetUpOnMainThread() override { | 80 void SetUpOnMainThread() override { |
| 81 AudioWaitingExtensionTest::SetUpOnMainThread(); | 81 AudioWaitingExtensionTest::SetUpOnMainThread(); |
| 82 // Needs to happen after chrome's schemes are added. | 82 // Needs to happen after chrome's schemes are added. |
| 83 source_url_ = GURL("chrome-extension://fakeid012345678/fakepage.html"); | 83 source_url_ = GURL("chrome-extension://fakeid012345678/fakepage.html"); |
| 84 } | 84 } |
| 85 | 85 |
| 86 protected: | 86 protected: |
| 87 void AppendTabIdToRequestInfo(base::ListValue* params, int tab_id) { |
| 88 base::DictionaryValue* request_info = new base::DictionaryValue(); |
| 89 request_info->SetInteger("tabId", tab_id); |
| 90 params->Append(request_info); |
| 91 } |
| 92 |
| 87 std::string InvokeGetActiveSink(int tab_id) { | 93 std::string InvokeGetActiveSink(int tab_id) { |
| 88 base::ListValue parameters; | 94 base::ListValue parameters; |
| 89 parameters.AppendInteger(tab_id); | 95 AppendTabIdToRequestInfo(¶meters, tab_id); |
| 90 std::string parameter_string; | 96 std::string parameter_string; |
| 91 JSONWriter::Write(¶meters, ¶meter_string); | 97 JSONWriter::Write(¶meters, ¶meter_string); |
| 92 | 98 |
| 93 scoped_refptr<WebrtcAudioPrivateGetActiveSinkFunction> function = | 99 scoped_refptr<WebrtcAudioPrivateGetActiveSinkFunction> function = |
| 94 new WebrtcAudioPrivateGetActiveSinkFunction(); | 100 new WebrtcAudioPrivateGetActiveSinkFunction(); |
| 95 function->set_source_url(source_url_); | 101 function->set_source_url(source_url_); |
| 96 scoped_ptr<base::Value> result( | 102 scoped_ptr<base::Value> result( |
| 97 RunFunctionAndReturnSingleResult(function.get(), | 103 RunFunctionAndReturnSingleResult(function.get(), |
| 98 parameter_string, | 104 parameter_string, |
| 99 browser())); | 105 browser())); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 } | 220 } |
| 215 } | 221 } |
| 216 #endif // OS_MACOSX | 222 #endif // OS_MACOSX |
| 217 | 223 |
| 218 // This exercises the case where you have a tab with no active media | 224 // This exercises the case where you have a tab with no active media |
| 219 // stream and try to retrieve the currently active audio sink. | 225 // stream and try to retrieve the currently active audio sink. |
| 220 IN_PROC_BROWSER_TEST_F(WebrtcAudioPrivateTest, GetActiveSinkNoMediaStream) { | 226 IN_PROC_BROWSER_TEST_F(WebrtcAudioPrivateTest, GetActiveSinkNoMediaStream) { |
| 221 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); | 227 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 222 int tab_id = ExtensionTabUtil::GetTabId(tab); | 228 int tab_id = ExtensionTabUtil::GetTabId(tab); |
| 223 base::ListValue parameters; | 229 base::ListValue parameters; |
| 224 parameters.AppendInteger(tab_id); | 230 AppendTabIdToRequestInfo(¶meters, tab_id); |
| 225 std::string parameter_string; | 231 std::string parameter_string; |
| 226 JSONWriter::Write(¶meters, ¶meter_string); | 232 JSONWriter::Write(¶meters, ¶meter_string); |
| 227 | 233 |
| 228 scoped_refptr<WebrtcAudioPrivateGetActiveSinkFunction> function = | 234 scoped_refptr<WebrtcAudioPrivateGetActiveSinkFunction> function = |
| 229 new WebrtcAudioPrivateGetActiveSinkFunction(); | 235 new WebrtcAudioPrivateGetActiveSinkFunction(); |
| 230 function->set_source_url(source_url_); | 236 function->set_source_url(source_url_); |
| 231 scoped_ptr<base::Value> result( | 237 scoped_ptr<base::Value> result( |
| 232 RunFunctionAndReturnSingleResult(function.get(), | 238 RunFunctionAndReturnSingleResult(function.get(), |
| 233 parameter_string, | 239 parameter_string, |
| 234 browser())); | 240 browser())); |
| 235 | 241 |
| 236 std::string result_string; | 242 std::string result_string; |
| 237 JSONWriter::Write(result.get(), &result_string); | 243 JSONWriter::Write(result.get(), &result_string); |
| 238 EXPECT_EQ("\"\"", result_string); | 244 EXPECT_EQ("\"\"", result_string); |
| 239 } | 245 } |
| 240 | 246 |
| 241 // This exercises the case where you have a tab with no active media | 247 // This exercises the case where you have a tab with no active media |
| 242 // stream and try to set the audio sink. | 248 // stream and try to set the audio sink. |
| 243 IN_PROC_BROWSER_TEST_F(WebrtcAudioPrivateTest, SetActiveSinkNoMediaStream) { | 249 IN_PROC_BROWSER_TEST_F(WebrtcAudioPrivateTest, SetActiveSinkNoMediaStream) { |
| 244 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); | 250 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 245 int tab_id = ExtensionTabUtil::GetTabId(tab); | 251 int tab_id = ExtensionTabUtil::GetTabId(tab); |
| 246 base::ListValue parameters; | 252 base::ListValue parameters; |
| 247 parameters.AppendInteger(tab_id); | 253 AppendTabIdToRequestInfo(¶meters, tab_id); |
| 248 parameters.AppendString("no such id"); | 254 parameters.AppendString("no such id"); |
| 249 std::string parameter_string; | 255 std::string parameter_string; |
| 250 JSONWriter::Write(¶meters, ¶meter_string); | 256 JSONWriter::Write(¶meters, ¶meter_string); |
| 251 | 257 |
| 252 scoped_refptr<WebrtcAudioPrivateSetActiveSinkFunction> function = | 258 scoped_refptr<WebrtcAudioPrivateSetActiveSinkFunction> function = |
| 253 new WebrtcAudioPrivateSetActiveSinkFunction(); | 259 new WebrtcAudioPrivateSetActiveSinkFunction(); |
| 254 function->set_source_url(source_url_); | 260 function->set_source_url(source_url_); |
| 255 std::string error(RunFunctionAndReturnError(function.get(), | 261 std::string error(RunFunctionAndReturnError(function.get(), |
| 256 parameter_string, | 262 parameter_string, |
| 257 browser())); | 263 browser())); |
| 258 EXPECT_EQ(base::StringPrintf("No active stream for tab with id: %d.", tab_id), | 264 EXPECT_EQ(base::StringPrintf("No active stream for tabId %d", tab_id), |
| 259 error); | 265 error); |
| 260 } | 266 } |
| 261 | 267 |
| 262 IN_PROC_BROWSER_TEST_F(WebrtcAudioPrivateTest, GetAndSetWithMediaStream) { | 268 IN_PROC_BROWSER_TEST_F(WebrtcAudioPrivateTest, GetAndSetWithMediaStream) { |
| 263 // First retrieve the list of all sinks, so that we can run a test | 269 // First retrieve the list of all sinks, so that we can run a test |
| 264 // where we set the active sink to each of the different available | 270 // where we set the active sink to each of the different available |
| 265 // sinks in turn. | 271 // sinks in turn. |
| 266 base::ListValue* sink_list = NULL; | 272 base::ListValue* sink_list = NULL; |
| 267 scoped_ptr<base::Value> result = InvokeGetSinks(&sink_list); | 273 scoped_ptr<base::Value> result = InvokeGetSinks(&sink_list); |
| 268 | 274 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 283 EXPECT_NE("", current_device); | 289 EXPECT_NE("", current_device); |
| 284 | 290 |
| 285 // Set to each of the other devices in turn. | 291 // Set to each of the other devices in turn. |
| 286 for (size_t ix = 0; ix < sink_list->GetSize(); ++ix) { | 292 for (size_t ix = 0; ix < sink_list->GetSize(); ++ix) { |
| 287 base::DictionaryValue* dict = NULL; | 293 base::DictionaryValue* dict = NULL; |
| 288 sink_list->GetDictionary(ix, &dict); | 294 sink_list->GetDictionary(ix, &dict); |
| 289 std::string target_device; | 295 std::string target_device; |
| 290 dict->GetString("sinkId", &target_device); | 296 dict->GetString("sinkId", &target_device); |
| 291 | 297 |
| 292 base::ListValue parameters; | 298 base::ListValue parameters; |
| 293 parameters.AppendInteger(tab_id); | 299 AppendTabIdToRequestInfo(¶meters, tab_id); |
| 294 parameters.AppendString(target_device); | 300 parameters.AppendString(target_device); |
| 295 std::string parameter_string; | 301 std::string parameter_string; |
| 296 JSONWriter::Write(¶meters, ¶meter_string); | 302 JSONWriter::Write(¶meters, ¶meter_string); |
| 297 | 303 |
| 298 scoped_refptr<WebrtcAudioPrivateSetActiveSinkFunction> function = | 304 scoped_refptr<WebrtcAudioPrivateSetActiveSinkFunction> function = |
| 299 new WebrtcAudioPrivateSetActiveSinkFunction(); | 305 new WebrtcAudioPrivateSetActiveSinkFunction(); |
| 300 function->set_source_url(source_url_); | 306 function->set_source_url(source_url_); |
| 301 scoped_ptr<base::Value> result(RunFunctionAndReturnSingleResult( | 307 scoped_ptr<base::Value> result(RunFunctionAndReturnSingleResult( |
| 302 function.get(), parameter_string, browser())); | 308 function.get(), parameter_string, browser())); |
| 303 // The function was successful if the above invocation doesn't | 309 // The function was successful if the above invocation doesn't |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("failure")); | 416 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("failure")); |
| 411 base::string16 result = title_watcher.WaitAndGetTitle(); | 417 base::string16 result = title_watcher.WaitAndGetTitle(); |
| 412 EXPECT_EQ(base::ASCIIToUTF16("success"), result); | 418 EXPECT_EQ(base::ASCIIToUTF16("success"), result); |
| 413 | 419 |
| 414 g_browser_process->webrtc_log_uploader()->OverrideUploadWithBufferForTesting( | 420 g_browser_process->webrtc_log_uploader()->OverrideUploadWithBufferForTesting( |
| 415 NULL); | 421 NULL); |
| 416 } | 422 } |
| 417 #endif // defined(GOOGLE_CHROME_BUILD) || defined(ENABLE_HANGOUT_SERVICES_EXTEN
SION) | 423 #endif // defined(GOOGLE_CHROME_BUILD) || defined(ENABLE_HANGOUT_SERVICES_EXTEN
SION) |
| 418 | 424 |
| 419 } // namespace extensions | 425 } // namespace extensions |
| OLD | NEW |