summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjustinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-20 11:42:09 +0000
committerjustinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-20 11:42:09 +0000
commit0a1ca8f44cdd738cbea1c12361cd6adcb638091a (patch)
tree00e3f36572681f56a5925de537f0630424e48f19
parent100f188e16b14c79c177e2ebcd8b6b6c79e66eaf (diff)
downloadchromium_src-0a1ca8f44cdd738cbea1c12361cd6adcb638091a.zip
chromium_src-0a1ca8f44cdd738cbea1c12361cd6adcb638091a.tar.gz
chromium_src-0a1ca8f44cdd738cbea1c12361cd6adcb638091a.tar.bz2
Hook up HTML5 fullscreen video notifications to tabCapture API
BUG=222287 Review URL: https://chromiumcodereview.appspot.com/17354003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207400 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc42
-rw-r--r--chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc38
-rw-r--r--chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.html1
-rw-r--r--chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.js29
4 files changed, 108 insertions, 2 deletions
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index ea190c2..485cd9e 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/extensions/extension_test_message_listener.h"
#include "chrome/browser/extensions/tab_helper.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/extensions/feature_switch.h"
@@ -188,4 +189,45 @@ IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_ActiveTabPermission) {
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
}
+// Linux Aura does not currently support fullscreen video.
+#if defined(USE_AURA) && defined(OS_LINUX)
+#define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
+// Fullscreen is special on Mac and does not fire events when run in tests.
+#elif defined(OS_MACOSX)
+#define MAYBE_FullscreenEvents DISABLED_FullscreenEvents
+#else
+#define MAYBE_FullscreenEvents FullscreenEvents
+#endif
+IN_PROC_BROWSER_TEST_F(TabCaptureApiTest, MAYBE_FullscreenEvents) {
+ AddExtensionToCommandLineWhitelist();
+
+ content::OpenURLParams params(GURL("chrome://version"),
+ content::Referrer(),
+ CURRENT_TAB,
+ content::PAGE_TRANSITION_LINK, false);
+ content::WebContents* web_contents = browser()->OpenURL(params);
+
+ ExtensionTestMessageListener listeners_setup("ready1", true);
+ ExtensionTestMessageListener fullscreen_entered("ready2", true);
+
+ ASSERT_TRUE(RunExtensionSubtest("tab_capture/experimental",
+ "fullscreen_test.html")) << message_;
+ EXPECT_TRUE(listeners_setup.WaitUntilSatisfied());
+
+ // Toggle fullscreen after setting up listeners.
+ browser()->fullscreen_controller()->ToggleFullscreenModeForTab(web_contents,
+ true);
+ listeners_setup.Reply("");
+
+ // Toggle again after JS should have the event.
+ EXPECT_TRUE(fullscreen_entered.WaitUntilSatisfied());
+ browser()->fullscreen_controller()->ToggleFullscreenModeForTab(web_contents,
+ false);
+ fullscreen_entered.Reply("");
+
+ ResultCatcher catcher;
+ catcher.RestrictToProfile(browser()->profile());
+ EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
+}
+
} // namespace chrome
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
index 406d9de..bd2d5c1 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
@@ -10,11 +10,13 @@
#include "chrome/browser/extensions/event_router.h"
#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
@@ -109,7 +111,9 @@ TabCaptureRegistry::TabCaptureRegistry(Profile* profile)
registrar_.Add(this,
chrome::NOTIFICATION_EXTENSION_UNLOADED,
content::Source<Profile>(profile_));
- // TODO(justinlin): Hook up HTML5 fullscreen.
+ registrar_.Add(this,
+ chrome::NOTIFICATION_FULLSCREEN_CHANGED,
+ content::NotificationService::AllSources());
}
TabCaptureRegistry::~TabCaptureRegistry() {
@@ -132,6 +136,7 @@ const TabCaptureRegistry::RegistryCaptureInfo
void TabCaptureRegistry::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
switch (type) {
case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
// Cleanup all the requested media streams for this extension.
@@ -149,7 +154,36 @@ void TabCaptureRegistry::Observe(int type,
break;
}
case chrome::NOTIFICATION_FULLSCREEN_CHANGED: {
- // TODO(justinlin): Hook up HTML5 fullscreen.
+ FullscreenController* fullscreen_controller =
+ content::Source<FullscreenController>(source).ptr();
+ const bool is_fullscreen = *content::Details<bool>(details).ptr();
+ for (ScopedVector<TabCaptureRequest>::iterator it = requests_.begin();
+ it != requests_.end(); ++it) {
+ // If we are exiting fullscreen mode, we only need to check if any of
+ // the requests had the fullscreen flag toggled previously. The
+ // fullscreen controller no longer has the reference to the fullscreen
+ // web_contents here.
+ if (!is_fullscreen) {
+ if ((*it)->fullscreen) {
+ (*it)->fullscreen = false;
+ DispatchStatusChangeEvent(*it);
+ break;
+ }
+ continue;
+ }
+
+ // If we are entering fullscreen mode, find whether the web_contents we
+ // are capturing entered fullscreen mode.
+ content::RenderViewHost* const rvh =
+ content::RenderViewHost::FromID((*it)->render_process_id,
+ (*it)->render_view_id);
+ if (rvh && fullscreen_controller->IsFullscreenForTabOrPending(
+ content::WebContents::FromRenderViewHost(rvh))) {
+ (*it)->fullscreen = true;
+ DispatchStatusChangeEvent(*it);
+ break;
+ }
+ }
break;
}
}
diff --git a/chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.html b/chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.html
new file mode 100644
index 0000000..6c39e32
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.html
@@ -0,0 +1 @@
+<script src="fullscreen_test.js"></script>
diff --git a/chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.js b/chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.js
new file mode 100644
index 0000000..a227cbf
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/tab_capture/experimental/fullscreen_test.js
@@ -0,0 +1,29 @@
+// 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.
+
+var mediaStream = null;
+var events = [];
+
+chrome.tabCapture.onStatusChanged.addListener(function(info) {
+ if (info.status == 'active') {
+ events.push(info.fullscreen);
+ if (events.length == 3) {
+ chrome.test.assertFalse(events[0]);
+ chrome.test.assertTrue(events[1]);
+ chrome.test.assertFalse(events[2]);
+ mediaStream.stop();
+ chrome.test.succeed();
+ }
+ }
+});
+
+chrome.tabCapture.capture({audio: true, video: true}, function(stream) {
+ chrome.test.assertTrue(!!stream);
+ mediaStream = stream;
+
+ chrome.test.notifyPass();
+ chrome.test.sendMessage('ready1', function() {
+ chrome.test.sendMessage('ready2', function() {});
+ });
+});