Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: content/browser/web_contents/web_contents_impl.cc

Issue 425713003: Fix a PowerSaveBlocker leak in WebContentsImpl. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/web_contents/web_contents_impl.h" 5 #include "content/browser/web_contents/web_contents_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 2994 matching lines...) Expand 10 before | Expand all | Expand 10 after
3005 3005
3006 void WebContentsImpl::OnUpdateFaviconURL( 3006 void WebContentsImpl::OnUpdateFaviconURL(
3007 const std::vector<FaviconURL>& candidates) { 3007 const std::vector<FaviconURL>& candidates) {
3008 FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3008 FOR_EACH_OBSERVER(WebContentsObserver, observers_,
3009 DidUpdateFaviconURL(candidates)); 3009 DidUpdateFaviconURL(candidates));
3010 } 3010 }
3011 3011
3012 void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie, 3012 void WebContentsImpl::OnMediaPlayingNotification(int64 player_cookie,
3013 bool has_video, 3013 bool has_video,
3014 bool has_audio) { 3014 bool has_audio) {
3015 // Chrome OS does its own detection of audio and video.
3016 #if !defined(OS_CHROMEOS) 3015 #if !defined(OS_CHROMEOS)
3017 scoped_ptr<PowerSaveBlocker> blocker; 3016 scoped_ptr<PowerSaveBlocker> blocker;
3018 if (has_video) { 3017 if (has_video) {
3019 blocker = PowerSaveBlocker::Create( 3018 blocker = PowerSaveBlocker::Create(
3020 PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video"); 3019 PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, "Playing video");
3021 #if defined(OS_ANDROID) 3020 #if defined(OS_ANDROID)
3022 static_cast<PowerSaveBlockerImpl*>(blocker.get()) 3021 static_cast<PowerSaveBlockerImpl*>(blocker.get())
3023 ->InitDisplaySleepBlocker(GetView()->GetNativeView()); 3022 ->InitDisplaySleepBlocker(GetView()->GetNativeView());
3024 #endif 3023 #endif
3025 } else if (has_audio) { 3024 } else if (has_audio) {
3026 blocker = PowerSaveBlocker::Create( 3025 blocker = PowerSaveBlocker::Create(
3027 PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio"); 3026 PowerSaveBlocker::kPowerSaveBlockPreventAppSuspension, "Playing audio");
3028 } 3027 }
3029 3028
3030 if (blocker) { 3029 if (blocker) {
3031 power_save_blockers_[render_frame_message_source_][player_cookie] = 3030 uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_);
3032 blocker.release(); 3031 if (!power_save_blockers_.contains(key)) {
3032 power_save_blockers_.add(key,
3033 make_scoped_ptr(new PowerSaveBlockerMapEntry));
3034 }
3035 PowerSaveBlockerMapEntry* map_entry =
3036 power_save_blockers_.get(key);
3037 map_entry->set(player_cookie, blocker.Pass());
3033 } 3038 }
3034 #endif // !defined(OS_CHROMEOS) 3039 #endif // !defined(OS_CHROMEOS)
3035 } 3040 }
3036 3041
3037 void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) { 3042 void WebContentsImpl::OnMediaPausedNotification(int64 player_cookie) {
3038 // Chrome OS does its own detection of audio and video.
3039 #if !defined(OS_CHROMEOS) 3043 #if !defined(OS_CHROMEOS)
3040 delete power_save_blockers_[render_frame_message_source_][player_cookie]; 3044 uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_message_source_);
3041 power_save_blockers_[render_frame_message_source_].erase(player_cookie); 3045 PowerSaveBlockerMapEntry* map_entry = power_save_blockers_.get(key);
3046 if (map_entry)
3047 map_entry->erase(player_cookie);
3042 #endif // !defined(OS_CHROMEOS) 3048 #endif // !defined(OS_CHROMEOS)
3043 } 3049 }
3044 3050
3045 void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() { 3051 void WebContentsImpl::OnFirstVisuallyNonEmptyPaint() {
3046 FOR_EACH_OBSERVER(WebContentsObserver, observers_, 3052 FOR_EACH_OBSERVER(WebContentsObserver, observers_,
3047 DidFirstVisuallyNonEmptyPaint()); 3053 DidFirstVisuallyNonEmptyPaint());
3048 } 3054 }
3049 3055
3050 void WebContentsImpl::DidChangeVisibleSSLState() { 3056 void WebContentsImpl::DidChangeVisibleSSLState() {
3051 if (delegate_) 3057 if (delegate_)
(...skipping 1150 matching lines...) Expand 10 before | Expand all | Expand 10 after
4202 CHECK(!browser_plugin_guest_); 4208 CHECK(!browser_plugin_guest_);
4203 browser_plugin_guest_.reset(guest); 4209 browser_plugin_guest_.reset(guest);
4204 } 4210 }
4205 4211
4206 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const { 4212 BrowserPluginEmbedder* WebContentsImpl::GetBrowserPluginEmbedder() const {
4207 return browser_plugin_embedder_.get(); 4213 return browser_plugin_embedder_.get();
4208 } 4214 }
4209 4215
4210 void WebContentsImpl::ClearPowerSaveBlockers( 4216 void WebContentsImpl::ClearPowerSaveBlockers(
4211 RenderFrameHost* render_frame_host) { 4217 RenderFrameHost* render_frame_host) {
4212 STLDeleteValues(&power_save_blockers_[render_frame_host]); 4218 #if !defined(OS_CHROMEOS)
4213 power_save_blockers_.erase(render_frame_host); 4219 uintptr_t key = reinterpret_cast<uintptr_t>(render_frame_host);
4220 scoped_ptr<PowerSaveBlockerMapEntry> map_entry =
4221 power_save_blockers_.take_and_erase(key);
4222 if (map_entry)
4223 map_entry->clear();
4224 #endif
4214 } 4225 }
4215 4226
4216 void WebContentsImpl::ClearAllPowerSaveBlockers() { 4227 void WebContentsImpl::ClearAllPowerSaveBlockers() {
4217 for (PowerSaveBlockerMap::iterator i(power_save_blockers_.begin()); 4228 #if !defined(OS_CHROMEOS)
4218 i != power_save_blockers_.end(); ++i)
4219 STLDeleteValues(&power_save_blockers_[i->first]);
4220 power_save_blockers_.clear(); 4229 power_save_blockers_.clear();
4230 #endif
4221 } 4231 }
4222 4232
4223 gfx::Size WebContentsImpl::GetSizeForNewRenderView() { 4233 gfx::Size WebContentsImpl::GetSizeForNewRenderView() {
4224 gfx::Size size; 4234 gfx::Size size;
4225 if (delegate_) 4235 if (delegate_)
4226 size = delegate_->GetSizeForNewRenderView(this); 4236 size = delegate_->GetSizeForNewRenderView(this);
4227 if (size.IsEmpty()) 4237 if (size.IsEmpty())
4228 size = GetContainerBounds().size(); 4238 size = GetContainerBounds().size();
4229 return size; 4239 return size;
4230 } 4240 }
(...skipping 10 matching lines...) Expand all
4241 if (new_size != old_size) 4251 if (new_size != old_size)
4242 delegate_->UpdatePreferredSize(this, new_size); 4252 delegate_->UpdatePreferredSize(this, new_size);
4243 } 4253 }
4244 4254
4245 void WebContentsImpl::ResumeResponseDeferredAtStart() { 4255 void WebContentsImpl::ResumeResponseDeferredAtStart() {
4246 FrameTreeNode* node = frame_tree_.root(); 4256 FrameTreeNode* node = frame_tree_.root();
4247 node->render_manager()->ResumeResponseDeferredAtStart(); 4257 node->render_manager()->ResumeResponseDeferredAtStart();
4248 } 4258 }
4249 4259
4250 } // namespace content 4260 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698