text: // Copyright 2016 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 CHROME_BROWSER_UI_WEBUI_SETTINGS_SEARCH_ENGINES_HANDLER_H_
  #define CHROME_BROWSER_UI_WEBUI_SETTINGS_SEARCH_ENGINES_HANDLER_H_
  
  #include <memory>
  #include <string>
  
  #include "base/macros.h"
  #include "base/memory/weak_ptr.h"
  #include "chrome/browser/ui/search_engines/edit_search_engine_controller.h"
  #include "chrome/browser/ui/search_engines/keyword_editor_controller.h"
  #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
  #include "components/prefs/pref_change_registrar.h"
  #include "ui/base/models/table_model_observer.h"
  
  class Profile;
  
  namespace base {
  class DictionaryValue;
  class ListValue;
  }
  
  namespace extensions {
  class Extension;
  }
  
  namespace settings {
  
  class SearchEnginesHandler : public SettingsPageUIHandler,
                               public ui::TableModelObserver,
                               public EditSearchEngineControllerDelegate {
   public:
    explicit SearchEnginesHandler(Profile* profile);
    ~SearchEnginesHandler() override;
  
    // ui::TableModelObserver implementation.
    void OnModelChanged() override;
    void OnItemsChanged(int start, int length) override;
    void OnItemsAdded(int start, int length) override;
    void OnItemsRemoved(int start, int length) override;
  
    // EditSearchEngineControllerDelegate implementation.
    void OnEditedKeyword(TemplateURL* template_url,
                         const base::string16& title,
                         const base::string16& keyword,
                         const std::string& url) override;
  
    // SettingsPageUIHandler implementation.
    void RegisterMessages() override;
    void OnJavascriptAllowed() override;
    void OnJavascriptDisallowed() override;
  
   private:
    // Retrieves all search engines and returns them to WebUI.
    void HandleGetSearchEnginesList(const base::ListValue* args);
  
    std::unique_ptr<base::DictionaryValue> GetSearchEnginesList();
  
    // Removes the search engine at the given index. Called from WebUI.
    void HandleRemoveSearchEngine(const base::ListValue* args);
  
    // Sets the search engine at the given index to be default. Called from WebUI.
    void HandleSetDefaultSearchEngine(const base::ListValue* args);
  
    // Starts an edit session for the search engine at the given index. If the
    // index is -1, starts editing a new search engine instead of an existing one.
    // Called from WebUI.
    void HandleSearchEngineEditStarted(const base::ListValue* args);
  
    // Validates the given search engine values, and reports the results back
    // to WebUI. Called from WebUI.
    void HandleValidateSearchEngineInput(const base::ListValue* args);
  
    // Checks whether the given user input field (searchEngine, keyword, queryUrl)
    // is populated with a valid value.
    bool CheckFieldValidity(const std::string& field_name,
                            const std::string& field_value);
  
    // Called when an edit is canceled.
    // Called from WebUI.
    void HandleSearchEngineEditCancelled(const base::ListValue* args);
  
    // Called when an edit is finished and should be saved.
    // Called from WebUI.
    void HandleSearchEngineEditCompleted(const base::ListValue* args);
  
    // Returns a dictionary to pass to WebUI representing the given search engine.
    std::unique_ptr<base::DictionaryValue> CreateDictionaryForEngine(
        int index,
        bool is_default);
  
    // Returns a dictionary to pass to WebUI representing the extension.
    base::DictionaryValue* CreateDictionaryForExtension(
        const extensions::Extension& extension);
  
    Profile* const profile_;
  
    KeywordEditorController list_controller_;
    std::unique_ptr<EditSearchEngineController> edit_controller_;
    PrefChangeRegistrar pref_change_registrar_;
    base::WeakPtrFactory<SearchEnginesHandler> weak_ptr_factory_;
  
    DISALLOW_COPY_AND_ASSIGN(SearchEnginesHandler);
  };
  
  }  // namespace settings
  
  #endif  // CHROME_BROWSER_UI_WEBUI_SETTINGS_SEARCH_ENGINES_HANDLER_H_
  