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(
void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie,
bool has_video,
bool has_audio) {
// Chrome OS does its own detection of audio and video.
#if !defined(OS_CHROMEOS)
scoped_ptr<PowerSaveBlocker> blocker;
if (has_video) {
......@@ -3028,17 +3027,24 @@ void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie,
}
if (blocker) {
power_save_blockers_[render_frame_message_source_][player_cookie] =
blocker.release();
uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_);
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)
}
void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) {
// Chrome OS does its own detection of audio and video.
#if !defined(OS_CHROMEOS)
delete power_save_blockers_[render_frame_message_source_][player_cookie];
power_save_blockers_[render_frame_message_source_].erase(player_cookie);
uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_);
PowerSaveBlockerMapEntry* map_entry = power_save_blockers_.get(key);
if (map_entry)
map_entry->erase(player_cookie);
#endif // !defined(OS_CHROMEOS)
}
......@@ -4208,15 +4214,19 @@ BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
void WebContentsImpl::ClearPowerSaveBlockers(
RenderFrameHost* render_frame_host) {
STLDeleteValues(&power_save_blockers_[render_frame_host]);
power_save_blockers_.erase(render_frame_host);
#if !defined(OS_CHROMEOS)
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() {
for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin());
i != power_save_blockers_.end(); ++i)
STLDeleteValues(&power_save_blockers_[i->first]);
#if !defined(OS_CHROMEOS)
power_save_blockers_.clear();
#endif
}
gfx::Size WebContentsImpl::GetSizeForNewRenderView() {
......
......@@ -10,6 +10,7 @@
#include <string>
#include "base/compiler_specific.h"
#include "base/containers/scoped_ptr_hash_map.h"
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
......@@ -898,7 +899,7 @@ class CONTENT_EXPORT WebContentsImpl
// Clear |render_frame_host|'s PowerSaveBlockers.
void ClearPowerSaveBlockers(RenderFrameHost* render_frame_host);
// Clear all PowerSaveBlockers, leave power_save_blocker_ empty.
// Clear all PowerSaveBlockers, leave |power_save_blocker_| empty.
void ClearAllPowerSaveBlockers();
// Helper function to invoke WebContentsDelegate::GetSizeForNewRenderView().
......@@ -965,12 +966,18 @@ class CONTENT_EXPORT WebContentsImpl
// Helper classes ------------------------------------------------------------
#if !defined(OS_CHROMEOS)
// Maps the RenderFrameHost to its media_player_cookie and PowerSaveBlocker
// pairs. Key is the RenderFrameHost, value is the map which maps
// 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 power_save_blockers_;
#endif
// Manages the frame tree of the page and process swaps in each node.
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