// Copyright 2014 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_CSSOM_STYLE_SHEET_LIST_H_
#define COBALT_CSSOM_STYLE_SHEET_LIST_H_

#include <vector>

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "cobalt/cssom/mutation_observer.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace cssom {

class StyleSheet;

// The StyleSheetList interface represents an ordered collection of CSS
// style sheets.
//   https://www.w3.org/TR/2013/WD-cssom-20131205/#the-stylesheetlist-interface
class StyleSheetList : public script::Wrappable, public MutationObserver {
 public:
  // If no layout mutation reporting needed, |observer| can be null.
  explicit StyleSheetList(MutationObserver* observer);

  // Web API: StyleSheetList
  //

  // Returns the index-th CSS style sheet in the collection.
  // Returns null if there is no index-th object in the collection.
  scoped_refptr<StyleSheet> Item(unsigned int index) const;

  // Returns the number of CSS style sheets represented by the collection.
  unsigned int length() const;

  // Custom, not in any spec.
  //
  // From MutationObserver.
  void OnCSSMutation() OVERRIDE;

  void Append(const scoped_refptr<StyleSheet>& style_sheet);

  MutationObserver* mutation_observer() const { return mutation_observer_; }

  DEFINE_WRAPPABLE_TYPE(StyleSheetList);

 private:
  ~StyleSheetList();

  std::vector<scoped_refptr<StyleSheet> > style_sheets_;
  MutationObserver* const mutation_observer_;

  DISALLOW_COPY_AND_ASSIGN(StyleSheetList);
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_STYLE_SHEET_LIST_H_
