diff options
author | justinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-20 11:42:09 +0000 |
---|---|---|
committer | justinlin@chromium.org <justinlin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-20 11:42:09 +0000 |
commit | 0a1ca8f44cdd738cbea1c12361cd6adcb638091a (patch) | |
tree | 00e3f36572681f56a5925de537f0630424e48f19 | |
parent | 100f188e16b14c79c177e2ebcd8b6b6c79e66eaf (diff) | |
download | chromium_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
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() {}); + }); +}); |