summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender
diff options
context:
space:
mode:
authorshishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-18 04:31:35 +0000
committershishir@chromium.org <shishir@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-18 04:31:35 +0000
commit3e026f4caaff1061ecae67c6de1f39c367d158f7 (patch)
treee8cdb01b12cadc3e0f82aa233164e95048dd2015 /chrome/browser/prerender
parentc41ea859f70938d4a87ec834759c440489bdc00b (diff)
downloadchromium_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.cc7
-rw-r--r--chrome/browser/prerender/prerender_final_status.cc3
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
-rw-r--r--chrome/browser/prerender/prerender_manager.cc20
-rw-r--r--chrome/browser/prerender/prerender_manager.h8
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_; }