Index: extensions/browser/guest_view/app_view/app_view_apitest.cc |
diff --git a/extensions/browser/guest_view/app_view/app_view_apitest.cc b/extensions/browser/guest_view/app_view/app_view_apitest.cc |
index 6e3ff85ad3180e0265af0c2127f78d7374533ce2..b9fc7c9de83be8eb60124485f3a5b891e8b64a9f 100644 |
--- a/extensions/browser/guest_view/app_view/app_view_apitest.cc |
+++ b/extensions/browser/guest_view/app_view/app_view_apitest.cc |
@@ -14,12 +14,75 @@ |
#include "extensions/browser/guest_view/test_guest_view_manager.h" |
#include "extensions/common/extension.h" |
#include "extensions/common/extension_paths.h" |
+#include "extensions/shell/browser/shell_app_delegate.h" |
+#include "extensions/shell/browser/shell_app_view_guest_delegate.h" |
#include "extensions/shell/browser/shell_content_browser_client.h" |
#include "extensions/shell/browser/shell_extension_system.h" |
+#include "extensions/shell/browser/shell_extensions_api_client.h" |
+#include "extensions/shell/browser/shell_extensions_browser_client.h" |
#include "extensions/shell/test/shell_test.h" |
#include "extensions/test/extension_test_message_listener.h" |
#include "net/base/filename_util.h" |
+namespace { |
+ |
+class MockShellAppDelegate : public extensions::ShellAppDelegate { |
+ public: |
+ MockShellAppDelegate() : requested_(false) { |
+ DCHECK(instance_ == nullptr); |
+ instance_ = this; |
+ } |
+ ~MockShellAppDelegate() override { instance_ = nullptr; } |
+ |
+ void RequestMediaAccessPermission( |
+ content::WebContents* web_contents, |
+ const content::MediaStreamRequest& request, |
+ const content::MediaResponseCallback& callback, |
+ const extensions::Extension* extension) override { |
+ requested_ = true; |
+ if (request_message_loop_runner_.get()) |
+ request_message_loop_runner_->Quit(); |
+ } |
+ |
+ void WaitForRequestMediaPermission() { |
+ if (requested_) |
+ return; |
+ request_message_loop_runner_ = new content::MessageLoopRunner; |
+ request_message_loop_runner_->Run(); |
+ } |
+ |
+ static MockShellAppDelegate* Get() { return instance_; } |
+ |
+ private: |
+ bool requested_; |
+ scoped_refptr<content::MessageLoopRunner> request_message_loop_runner_; |
+ static MockShellAppDelegate* instance_; |
+}; |
+ |
+MockShellAppDelegate* MockShellAppDelegate::instance_ = nullptr; |
+ |
+class MockShellAppViewGuestDelegate |
+ : public extensions::ShellAppViewGuestDelegate { |
+ public: |
+ MockShellAppViewGuestDelegate() {} |
+ |
+ extensions::AppDelegate* CreateAppDelegate() override { |
+ return new MockShellAppDelegate(); |
+ } |
+}; |
+ |
+class MockExtensionsAPIClient : public extensions::ShellExtensionsAPIClient { |
+ public: |
+ MockExtensionsAPIClient() {} |
+ |
+ extensions::AppViewGuestDelegate* CreateAppViewGuestDelegate() |
+ const override { |
+ return new MockShellAppViewGuestDelegate(); |
+ } |
+}; |
+ |
+} // namespace |
+ |
namespace extensions { |
class AppViewTest : public AppShellTest { |
@@ -86,6 +149,19 @@ IN_PROC_BROWSER_TEST_F(AppViewTest, TestAppViewGoodDataShouldSucceed) { |
"app_view/apitest/skeleton"); |
} |
+// Tests that <appview> can handle media permission requests. |
+IN_PROC_BROWSER_TEST_F(AppViewTest, TestAppViewMediaRequest) { |
+ static_cast<ShellExtensionsBrowserClient*>(ExtensionsBrowserClient::Get()) |
+ ->SetAPIClientForTest(nullptr); |
+ static_cast<ShellExtensionsBrowserClient*>(ExtensionsBrowserClient::Get()) |
+ ->SetAPIClientForTest(new MockExtensionsAPIClient); |
+ |
+ RunTest("testAppViewMediaRequest", "app_view/apitest", |
+ "app_view/apitest/media_request"); |
+ |
+ MockShellAppDelegate::Get()->WaitForRequestMediaPermission(); |
+} |
+ |
// Tests that <appview> correctly processes parameters passed on connect. |
// This test should fail to connect because the embedded app (skeleton) will |
// refuse the data passed by the embedder app and deny the request. |