Home | History | Annotate | Download | only in global_error
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/global_error/global_error_service.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/stl_util.h"
     10 #include "chrome/browser/chrome_notification_types.h"
     11 #include "chrome/browser/profiles/profile.h"
     12 #include "chrome/browser/ui/global_error/global_error.h"
     13 #include "chrome/browser/ui/global_error/global_error_bubble_view_base.h"
     14 #include "content/public/browser/notification_service.h"
     15 
     16 GlobalErrorService::GlobalErrorService(Profile* profile) : profile_(profile) {
     17 }
     18 
     19 GlobalErrorService::~GlobalErrorService() {
     20   STLDeleteElements(&errors_);
     21 }
     22 
     23 void GlobalErrorService::AddGlobalError(GlobalError* error) {
     24   DCHECK(error);
     25   errors_.push_back(error);
     26   NotifyErrorsChanged(error);
     27 }
     28 
     29 void GlobalErrorService::RemoveGlobalError(GlobalError* error) {
     30   errors_.erase(std::find(errors_.begin(), errors_.end(), error));
     31   GlobalErrorBubbleViewBase* bubble = error->GetBubbleView();
     32   if (bubble)
     33     bubble->CloseBubbleView();
     34   NotifyErrorsChanged(error);
     35 }
     36 
     37 GlobalError* GlobalErrorService::GetGlobalErrorByMenuItemCommandID(
     38     int command_id) const {
     39   for (GlobalErrorList::const_iterator
     40        it = errors_.begin(); it != errors_.end(); ++it) {
     41     GlobalError* error = *it;
     42     if (error->HasMenuItem() && command_id == error->MenuItemCommandID())
     43       return error;
     44   }
     45   return NULL;
     46 }
     47 
     48 GlobalError*
     49 GlobalErrorService::GetHighestSeverityGlobalErrorWithWrenchMenuItem() const {
     50   GlobalError::Severity highest_severity = GlobalError::SEVERITY_LOW;
     51   GlobalError* highest_severity_error = NULL;
     52 
     53   for (GlobalErrorList::const_iterator
     54        it = errors_.begin(); it != errors_.end(); ++it) {
     55     GlobalError* error = *it;
     56     if (error->HasMenuItem()) {
     57       if (!highest_severity_error || error->GetSeverity() > highest_severity) {
     58         highest_severity = error->GetSeverity();
     59         highest_severity_error = error;
     60       }
     61     }
     62   }
     63 
     64   return highest_severity_error;
     65 }
     66 
     67 GlobalError* GlobalErrorService::GetFirstGlobalErrorWithBubbleView() const {
     68   for (GlobalErrorList::const_iterator
     69        it = errors_.begin(); it != errors_.end(); ++it) {
     70     GlobalError* error = *it;
     71     if (error->HasBubbleView() && !error->HasShownBubbleView())
     72       return error;
     73   }
     74   return NULL;
     75 }
     76 
     77 void GlobalErrorService::NotifyErrorsChanged(GlobalError* error) {
     78   // GlobalErrorService is bound only to original profile so we need to send
     79   // notifications to both it and its off-the-record profile to update
     80   // incognito windows as well.
     81   std::vector<Profile*> profiles_to_notify;
     82   if (profile_ != NULL) {
     83     profiles_to_notify.push_back(profile_);
     84     if (profile_->IsOffTheRecord())
     85       profiles_to_notify.push_back(profile_->GetOriginalProfile());
     86     else if (profile_->HasOffTheRecordProfile())
     87       profiles_to_notify.push_back(profile_->GetOffTheRecordProfile());
     88     for (size_t i = 0; i < profiles_to_notify.size(); ++i) {
     89       content::NotificationService::current()->Notify(
     90         chrome::NOTIFICATION_GLOBAL_ERRORS_CHANGED,
     91         content::Source<Profile>(profiles_to_notify[i]),
     92         content::Details<GlobalError>(error));
     93     }
     94   }
     95 }
     96