diff options
author | shishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-18 04:31:35 +0000 |
---|---|---|
committer | shishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-18 04:31:35 +0000 |
commit | 3e026f4caaff1061ecae67c6de1f39c367d158f7 (patch) | |
tree | e8cdb01b12cadc3e0f82aa233164e95048dd2015 /chrome/browser/prerender | |
parent | c41ea859f70938d4a87ec834759c440489bdc00b (diff) | |
download | chromium_src-3e026f4caaff1061ecae67c6de1f39c367d158f7.zip chromium_src-3e026f4caaff1061ecae67c6de1f39c367d158f7.tar.gz chromium_src-3e026f4caaff1061ecae67c6de1f39c367d158f7.tar.bz2 |
Prerender: Cancel prerender on creation of any Audio Stream
BUG=136262
Review URL: https://chromiumcodereview.appspot.com/19220003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@212245 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r-- | chrome/browser/prerender/prerender_browsertest.cc | 7 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.cc | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.h | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.cc | 20 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 8 |
5 files changed, 37 insertions, 2 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc index cfaf608..f171112 100644 --- a/chrome/browser/prerender/prerender_browsertest.cc +++ b/chrome/browser/prerender/prerender_browsertest.cc @@ -2899,4 +2899,11 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHTML5MediaSourceVideo) { NavigateToDestUrlAndWaitForPassTitle(); } +// Checks that a prerender that creates an audio stream (via a WebAudioDevice) +// is cancelled. +IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderWebAudioDevice) { + PrerenderTestURL("files/prerender/prerender_web_audio_device.html", + FINAL_STATUS_CREATING_AUDIO_STREAM, 1); +} + } // namespace prerender diff --git a/chrome/browser/prerender/prerender_final_status.cc b/chrome/browser/prerender/prerender_final_status.cc index f3f2cfe..72e0f58 100644 --- a/chrome/browser/prerender/prerender_final_status.cc +++ b/chrome/browser/prerender/prerender_final_status.cc @@ -54,12 +54,13 @@ const char* kFinalStatusNames[] = { "OpenURL", "WouldHaveBeenUsed", "Register Protocol Handler", + "Creating Audio Stream", "Max", }; COMPILE_ASSERT(arraysize(kFinalStatusNames) == FINAL_STATUS_MAX + 1, PrerenderFinalStatus_name_count_mismatch); -} +} // namespace const char* NameFromFinalStatus(FinalStatus final_status) { DCHECK_LT(static_cast<unsigned int>(final_status), diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h index 87922f8..63255c2 100644 --- a/chrome/browser/prerender/prerender_final_status.h +++ b/chrome/browser/prerender/prerender_final_status.h @@ -55,6 +55,7 @@ enum FinalStatus { FINAL_STATUS_OPEN_URL = 40, FINAL_STATUS_WOULD_HAVE_BEEN_USED = 41, FINAL_STATUS_REGISTER_PROTOCOL_HANDLER = 42, + FINAL_STATUS_CREATING_AUDIO_STREAM = 43, FINAL_STATUS_MAX, }; diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc index e93ccc9..9cdeff0 100644 --- a/chrome/browser/prerender/prerender_manager.cc +++ b/chrome/browser/prerender/prerender_manager.cc @@ -39,6 +39,7 @@ #include "chrome/browser/prerender/prerender_tracker.h" #include "chrome/browser/prerender/prerender_util.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/ui/tab_contents/core_tab_helper.h" #include "chrome/browser/ui/tab_contents/core_tab_helper_delegate.h" #include "chrome/common/chrome_switches.h" @@ -275,9 +276,13 @@ PrerenderManager::PrerenderManager(Profile* profile, notification_registrar_.Add( this, chrome::NOTIFICATION_COOKIE_CHANGED, content::NotificationService::AllBrowserContextsAndSources()); + + MediaCaptureDevicesDispatcher::GetInstance()->AddObserver(this); } PrerenderManager::~PrerenderManager() { + MediaCaptureDevicesDispatcher::GetInstance()->RemoveObserver(this); + // The earlier call to BrowserContextKeyedService::Shutdown() should have // emptied these vectors already. DCHECK(active_prerenders_.empty()); @@ -1432,6 +1437,21 @@ void PrerenderManager::Observe(int type, CookieChanged(content::Details<ChromeCookieDetails>(details).ptr()); } +void PrerenderManager::OnCreatingAudioStream(int render_process_id, + int render_view_id) { + WebContents* tab = tab_util::GetWebContentsByID( + render_process_id, render_view_id); + if (!tab) + return; + + if (!IsWebContentsPrerendering(tab, NULL)) + return; + + prerender_tracker()->TryCancel( + render_process_id, render_view_id, + prerender::FINAL_STATUS_CREATING_AUDIO_STREAM); +} + void PrerenderManager::RecordLikelyLoginOnURL(const GURL& url) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (!IsWebURL(url)) diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h index 67ff3f3..8789699 100644 --- a/chrome/browser/prerender/prerender_manager.h +++ b/chrome/browser/prerender/prerender_manager.h @@ -19,6 +19,7 @@ #include "base/threading/non_thread_safe.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "chrome/browser/media/media_capture_devices_dispatcher.h" #include "chrome/browser/predictors/logged_in_predictor_table.h" #include "chrome/browser/prerender/prerender_config.h" #include "chrome/browser/prerender/prerender_contents.h" @@ -78,7 +79,8 @@ class PrerenderTracker; class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, public base::NonThreadSafe, public content::NotificationObserver, - public BrowserContextKeyedService { + public BrowserContextKeyedService, + public MediaCaptureDevicesDispatcher::Observer { public: // NOTE: New values need to be appended, since they are used in histograms. enum PrerenderManagerMode { @@ -274,6 +276,10 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; + // MediaCaptureDevicesDispatcher::Observer + virtual void OnCreatingAudioStream(int render_process_id, + int render_view_id) OVERRIDE; + const Config& config() const { return config_; } Config& mutable_config() { return config_; } |