15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef EXTENSIONS_BROWSER_ERROR_MAP_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define EXTENSIONS_BROWSER_ERROR_MAP_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <deque>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_error.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace extensions {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef std::deque<const ExtensionError*> ErrorList;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// An ErrorMap is responsible for storing Extension-related errors, keyed by
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Extension ID. The errors are owned by the ErrorMap, and are deleted upon
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction.
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ErrorMap {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ErrorMap();
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~ErrorMap();
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Return the list of all errors associated with the given extension.
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ErrorList& GetErrorsForExtension(const std::string& extension_id) const;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add the |error| to the ErrorMap.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const ExtensionError* AddError(scoped_ptr<ExtensionError> error);
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove an extension from the ErrorMap, deleting all associated errors.
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Remove(const std::string& extension_id);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove all errors of a given type for an extension.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RemoveErrorsForExtensionOfType(const std::string& extension_id,
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      ExtensionError::Type type);
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove all incognito errors for all extensions.
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RemoveIncognitoErrors();
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove all errors for all extensions, and clear the map.
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void RemoveAllErrors();
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t size() const { return map_.size(); }
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // An Entry is created for each Extension ID, and stores the errors related to
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // that Extension.
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class ExtensionEntry {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ExtensionEntry();
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ~ExtensionEntry();
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Delete all errors associated with this extension.
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void DeleteAllErrors();
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Delete all incognito errors associated with this extension.
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void DeleteIncognitoErrors();
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Delete all errors of the given |type| associated with this extension.
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    void DeleteErrorsOfType(ExtensionError::Type type);
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Add the error to the list, and return a weak reference.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ExtensionError* AddError(scoped_ptr<ExtensionError> error);
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ErrorList* list() const { return &list_; }
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   private:
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // The list of all errors associated with the extension. The errors are
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // owned by the Entry (in turn owned by the ErrorMap) and are deleted upon
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // destruction.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ErrorList list_;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ExtensionEntry);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<std::string, ExtensionEntry*> EntryMap;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The mapping between Extension IDs and their corresponding Entries.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EntryMap map_;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ErrorMap);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace extensions
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // EXTENSIONS_BROWSER_ERROR_MAP_H_
85