// Copyright 2012 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 COMPONENTS_OMNIBOX_BROWSER_LOCATION_BAR_MODEL_IMPL_H_
#define COMPONENTS_OMNIBOX_BROWSER_LOCATION_BAR_MODEL_IMPL_H_

#include <stddef.h>

#include <string>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "components/omnibox/browser/location_bar_model.h"
#include "components/url_formatter/url_formatter.h"
#include "url/gurl.h"

class LocationBarModelDelegate;

// This class is the model used by the toolbar, location bar and autocomplete
// edit.  It populates its states from the current navigation entry retrieved
// from the navigation controller returned by GetNavigationController().
class LocationBarModelImpl : public LocationBarModel {
 public:
  LocationBarModelImpl(LocationBarModelDelegate* delegate,
                       size_t max_url_display_chars);
  ~LocationBarModelImpl() override;

  // LocationBarModel:
  base::string16 GetFormattedFullURL() const override;
  base::string16 GetURLForDisplay() const override;
  GURL GetURL() const override;
  security_state::SecurityLevel GetSecurityLevel(
      bool ignore_editing) const override;
  bool GetDisplaySearchTerms(base::string16* search_terms) override;
  const gfx::VectorIcon& GetVectorIcon() const override;
  base::string16 GetSecureDisplayText() const override;
  base::string16 GetSecureAccessibilityText() const override;
  base::string16 GetEVCertName() const override;
  bool ShouldDisplayURL() const override;
  bool IsOfflinePage() const override;

 private:
  struct SecureChipText {
    base::string16 display_text_;
    base::string16 accessibility_label_;
    SecureChipText(base::string16 display_text,
                   base::string16 accessibility_label)
        : display_text_(display_text),
          accessibility_label_(accessibility_label) {}
    SecureChipText(base::string16 display_text)
        : display_text_(display_text), accessibility_label_(display_text) {}
  };

  // Get the security chip labels for the current security state.
  SecureChipText GetSecureChipText() const;

  base::string16 GetFormattedURL(
      url_formatter::FormatUrlTypes format_types) const;

  // Extracts search terms from |url|. Returns an empty string if |url| is not
  // from the default search provider, if there are no search terms in |url|,
  // or if the extracted search terms look too much like a URL.
  base::string16 ExtractSearchTermsInternal(const GURL& url);

  LocationBarModelDelegate* delegate_;
  const size_t max_url_display_chars_;

  // Because extracting search terms from a URL string is relatively expensive,
  // and we want to support cheap calls to GetDisplaySearchTerms, cache the
  // result of the last-parsed URL string.
  base::string16 cached_search_terms_;
  GURL cached_url_;

  DISALLOW_IMPLICIT_CONSTRUCTORS(LocationBarModelImpl);
};

#endif  // COMPONENTS_OMNIBOX_BROWSER_LOCATION_BAR_MODEL_IMPL_H_
