Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/power_save_blocker.h"
      6 #include "content/browser/browser_thread.h"
      7 
      8 // Accessed only from the UI thread.
      9 int PowerSaveBlocker::blocker_count_ = 0;
     10 
     11 PowerSaveBlocker::PowerSaveBlocker(bool enable) : enabled_(false) {
     12   if (enable)
     13     Enable();
     14 }
     15 
     16 PowerSaveBlocker::~PowerSaveBlocker(void) {
     17   Disable();
     18 }
     19 
     20 void PowerSaveBlocker::Enable() {
     21   if (enabled_)
     22     return;
     23 
     24   enabled_ = true;
     25   PostAdjustBlockCount(1);
     26 }
     27 
     28 void PowerSaveBlocker::Disable() {
     29   if (!enabled_)
     30     return;
     31 
     32   enabled_ = false;
     33   PostAdjustBlockCount(-1);
     34 }
     35 
     36 
     37 void PowerSaveBlocker::PostAdjustBlockCount(int delta) {
     38   BrowserThread::PostTask(
     39       BrowserThread::UI, FROM_HERE,
     40       NewRunnableFunction(&PowerSaveBlocker::AdjustBlockCount, delta));
     41 }
     42 
     43 // Called only from UI thread.
     44 void PowerSaveBlocker::AdjustBlockCount(int delta) {
     45   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     46 
     47   bool was_blocking = (blocker_count_ != 0);
     48 
     49   blocker_count_ += delta;
     50 
     51   bool is_blocking = (blocker_count_ != 0);
     52 
     53   DCHECK_GE(blocker_count_, 0);
     54 
     55   if (is_blocking != was_blocking)
     56     ApplyBlock(is_blocking);
     57 }
     58