Commit c9e3b203 authored by thestig@chromium.org's avatar thestig@chromium.org

Fix a PowerSaveBlocker leak in WebContentsImpl.

BUG=399922

Review URL: https://codereview.chromium.org/425713003

Cr-Commit-Position: refs/heads/master@{#288254}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288254 0039d316-1c4b-4281-b951-d872f2087c98
parent d1c0f9f7
...@@ -3012,7 +3012,6 @@ void WebContentsImpl::OnUpdateFaviconURL( ...@@ -3012,7 +3012,6 @@ void WebContentsImpl::OnUpdateFaviconURL(
void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie,
bool has_video, bool has_video,
bool has_audio) { bool has_audio) {
// Chrome OS does its own detection of audio and video.
#if !defined(OS_CHROMEOS) #if !defined(OS_CHROMEOS)
scoped_ptr<PowerSaveBlocker> blocker; scoped_ptr<PowerSaveBlocker> blocker;
if (has_video) { if (has_video) {
...@@ -3028,17 +3027,24 @@ void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, ...@@ -3028,17 +3027,24 @@ void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie,
} }
if (blocker) { if (blocker) {
power_save_blockers_[render_frame_message_source_][player_cookie] = uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_);
blocker.release(); if (!power_save_blockers_.contains(key)) {
power_save_blockers_.add(key,
make_scoped_ptr(new PowerSaveBlockerMapEntry));
}
PowerSaveBlockerMapEntry* map_entry =
power_save_blockers_.get(key);
map_entry->set(player_cookie, blocker.Pass());
} }
#endif // !defined(OS_CHROMEOS) #endif // !defined(OS_CHROMEOS)
} }
void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) {
// Chrome OS does its own detection of audio and video.
#if !defined(OS_CHROMEOS) #if !defined(OS_CHROMEOS)
delete power_save_blockers_[render_frame_message_source_][player_cookie]; uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_);
power_save_blockers_[render_frame_message_source_].erase(player_cookie); PowerSaveBlockerMapEntry* map_entry = power_save_blockers_.get(key);
if (map_entry)
map_entry->erase(player_cookie);
#endif // !defined(OS_CHROMEOS) #endif // !defined(OS_CHROMEOS)
} }
...@@ -4208,15 +4214,19 @@ BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { ...@@ -4208,15 +4214,19 @@ BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
void WebContentsImpl::ClearPowerSaveBlockers( void WebContentsImpl::ClearPowerSaveBlockers(
RenderFrameHost* render_frame_host) { RenderFrameHost* render_frame_host) {
STLDeleteValues(&power_save_blockers_[render_frame_host]); #if !defined(OS_CHROMEOS)
power_save_blockers_.erase(render_frame_host); uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_host);
scoped_ptr<PowerSaveBlockerMapEntry> map_entry =
power_save_blockers_.take_and_erase(key);
if (map_entry)
map_entry->clear();
#endif
} }
void WebContentsImpl::ClearAllPowerSaveBlockers() { void WebContentsImpl::ClearAllPowerSaveBlockers() {
for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin()); #if !defined(OS_CHROMEOS)
i != power_save_blockers_.end(); ++i)
STLDeleteValues(&power_save_blockers_[i->first]);
power_save_blockers_.clear(); power_save_blockers_.clear();
#endif
} }
gfx::Size WebContentsImpl::GetSizeForNewRenderView() { gfx::Size WebContentsImpl::GetSizeForNewRenderView() {
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <string> #include <string>
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/gtest_prod_util.h" #include "base/gtest_prod_util.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/observer_list.h" #include "base/observer_list.h"
...@@ -898,7 +899,7 @@ class CONTENT_EXPORT WebContentsImpl ...@@ -898,7 +899,7 @@ class CONTENT_EXPORT WebContentsImpl
// Clear |render_frame_host|'s PowerSaveBlockers. // Clear |render_frame_host|'s PowerSaveBlockers.
void ClearPowerSaveBlockers(RenderFrameHost* render_frame_host); void ClearPowerSaveBlockers(RenderFrameHost* render_frame_host);
// Clear all PowerSaveBlockers, leave power_save_blocker_ empty. // Clear all PowerSaveBlockers, leave |power_save_blocker_| empty.
void ClearAllPowerSaveBlockers(); void ClearAllPowerSaveBlockers();
// Helper function to invoke WebContentsDelegate::GetSizeForNewRenderView(). // Helper function to invoke WebContentsDelegate::GetSizeForNewRenderView().
...@@ -965,12 +966,18 @@ class CONTENT_EXPORT WebContentsImpl ...@@ -965,12 +966,18 @@ class CONTENT_EXPORT WebContentsImpl
// Helper classes ------------------------------------------------------------ // Helper classes ------------------------------------------------------------
#if !defined(OS_CHROMEOS)
// Maps the RenderFrameHost to its media_player_cookie and PowerSaveBlocker // Maps the RenderFrameHost to its media_player_cookie and PowerSaveBlocker
// pairs. Key is the RenderFrameHost, value is the map which maps // pairs. Key is the RenderFrameHost, value is the map which maps
// player_cookie on to PowerSaveBlocker. // player_cookie on to PowerSaveBlocker.
typedef std::map<RenderFrameHost*, std::map<int64, PowerSaveBlocker*> > //
// ChromeOS does its own detection of audio and video.
typedef base::ScopedPtrHashMap<int64, PowerSaveBlocker>
PowerSaveBlockerMapEntry;
typedef base::ScopedPtrHashMap<uintptr_t, PowerSaveBlockerMapEntry>
PowerSaveBlockerMap; PowerSaveBlockerMap;
PowerSaveBlockerMap power_save_blockers_; PowerSaveBlockerMap power_save_blockers_;
#endif
// Manages the frame tree of the page and process swaps in each node. // Manages the frame tree of the page and process swaps in each node.
FrameTree frame_tree_; FrameTree frame_tree_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment