// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef EXTENSIONS_BROWSER_FILE_HIGHLIGHTER_H_
#define EXTENSIONS_BROWSER_FILE_HIGHLIGHTER_H_

#include <stddef.h>

#include <string>

#include "base/macros.h"

namespace base {
class DictionaryValue;
}

namespace extensions {

// The FileHighlighter class is used in order to isolate and highlight a portion
// of a given file (in string form). The Highlighter will split the source into
// three portions: the portion before the highlighted feature, the highlighted
// feature, and the portion following the highlighted feature.
// The file will be parsed for highlighting upon construction of the Highlighter
// object.
class FileHighlighter {
 public:
  virtual ~FileHighlighter();

  // Get the portion of the manifest which should not be highlighted and is
  // before the feature.
  std::string GetBeforeFeature() const;

  // Get the feature portion of the manifest, which should be highlighted.
  std::string GetFeature() const;

  // Get the portion of the manifest which should not be highlighted and is
  // after the feature.
  std::string GetAfterFeature() const;

  // Populate a DictionaryValue with the highlighted portions (in UTF16) of the
  // source file.
  void SetHighlightedRegions(base::DictionaryValue* dict) const;

 protected:
  explicit FileHighlighter(const std::string& contents);

  // The contents of the file we are parsing.
  std::string contents_;

  // The start of the feature.
  size_t start_;

  // The end of the feature.
  size_t end_;

  DISALLOW_COPY_AND_ASSIGN(FileHighlighter);
};

// Use the ManifestHighlighter class to find the bounds of a feature in the
// manifest.
// A feature can be at any level in the hierarchy. The "start" of a feature is
// the first character of the feature name, or the beginning quote of the name,
// if present. The "end" of a feature is wherever the next item at the same
// level starts.
// For instance, the bounds for the 'permissions' feature at the top level could
// be '"permissions": { "tabs", "history", "downloads" }', but the feature for
// 'tabs' within 'permissions' would just be '"tabs"'.
// We can't use the JSONParser to do this, because we want to display the actual
// manifest, and once we parse it into Values, we lose any formatting the user
// may have had.
// If a feature cannot be found, the feature will have zero-length.
class ManifestHighlighter : public FileHighlighter {
 public:
  ManifestHighlighter(const std::string& manifest,
                      const std::string& key,
                      const std::string& specific /* optional */);
  ~ManifestHighlighter() override;

 private:
  // Called from the constructor; determine the start and end bounds of a
  // feature, using both the key and specific information.
  void Parse(const std::string& key, const std::string& specific);

  // Find the bounds of any feature, either a full key or a specific item within
  // the key. |enforce_at_top_level| means that the feature we find must be at
  // the same level as |start_| (i.e., ignore nested elements).
  // Returns true on success.
  bool FindBounds(const std::string& feature, bool enforce_at_top_level);

  // Finds the end of the feature.
  void FindBoundsEnd(const std::string& feature, size_t local_start);

  DISALLOW_COPY_AND_ASSIGN(ManifestHighlighter);
};

// Use the SourceHighlighter to highlight a particular line in a given source
// file.
class SourceHighlighter : public FileHighlighter {
 public:
  SourceHighlighter(const std::string& source, size_t line_number);
  ~SourceHighlighter() override;

 private:
  // Called from the constructor; determine the bounds of the line in the source
  // file.
  void Parse(size_t line_number);

  DISALLOW_COPY_AND_ASSIGN(SourceHighlighter);
};

}  // namespace extensions

#endif  // EXTENSIONS_BROWSER_FILE_HIGHLIGHTER_H_
