15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Interface for objects providing content setting rules.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_RULE_H_
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_RULE_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content_settings {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Rule {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rule();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rule takes ownership of |value|.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rule(const ContentSettingsPattern& primary_pattern,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       const ContentSettingsPattern& secondary_pattern,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       base::Value* value);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Rule();
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern primary_pattern;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern secondary_pattern;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  linked_ptr<base::Value> value;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RuleIterator {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~RuleIterator();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasNext() const = 0;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Rule Next() = 0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EmptyRuleIterator : public RuleIterator {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~EmptyRuleIterator();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasNext() const OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Rule Next() OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConcatenationIterator : public RuleIterator {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ConcatenationIterator takes ownership of the pointers in the |iterators|
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // list and |auto_lock|. |auto_lock| can be NULL if no locking is needed.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConcatenationIterator(ScopedVector<RuleIterator>* iterators,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        base::AutoLock* auto_lock);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ConcatenationIterator();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasNext() const OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual Rule Next() OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<RuleIterator> iterators_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::AutoLock> auto_lock_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content_settings
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // COMPONENTS_CONTENT_SETTINGS_CORE_BROWSER_CONTENT_SETTINGS_RULE_H_
64