blob: 041f6d1adbfebba0201a5286317c15ac97504791 [file] [log] [blame]
// Copyright 2018 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 ASH_ASSISTANT_MODEL_ASSISTANT_UI_ELEMENT_H_
#define ASH_ASSISTANT_MODEL_ASSISTANT_UI_ELEMENT_H_
#include <memory>
#include <string>
#include "base/component_export.h"
#include "base/macros.h"
#include "services/content/public/cpp/navigable_contents.h"
namespace ash {
// AssistantUiElementType ------------------------------------------------------
// Defines possible types of Assistant UI elements.
enum class AssistantUiElementType {
kCard, // See AssistantCardElement.
kText, // See AssistantTextElement.
};
// AssistantUiElement ----------------------------------------------------------
// Base class for a UI element that will be rendered inside of Assistant UI.
class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantUiElement {
public:
virtual ~AssistantUiElement() = default;
AssistantUiElementType GetType() const { return type_; }
protected:
explicit AssistantUiElement(AssistantUiElementType type) : type_(type) {}
private:
const AssistantUiElementType type_;
DISALLOW_COPY_AND_ASSIGN(AssistantUiElement);
};
// AssistantCardElement --------------------------------------------------------
// An Assistant UI element that will be rendered as an HTML card.
class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantCardElement
: public AssistantUiElement {
public:
using ProcessingCallback = base::OnceCallback<void(bool)>;
explicit AssistantCardElement(const std::string& html,
const std::string& fallback);
~AssistantCardElement() override;
const std::string& html() const { return html_; }
const std::string& fallback() const { return fallback_; }
const content::NavigableContents* contents() const { return contents_.get(); }
content::NavigableContents* contents() { return contents_.get(); }
void set_contents(std::unique_ptr<content::NavigableContents> contents) {
contents_ = std::move(contents);
}
// Invoke to begin processing the card element. Upon completion, the specified
// |callback| will be run to indicate success or failure.
void Process(content::mojom::NavigableContentsFactory* contents_factory,
ProcessingCallback callback);
private:
// Handles processing of an AssistantCardElement.
class Processor : public content::NavigableContentsObserver {
public:
Processor(AssistantCardElement& card_element,
content::mojom::NavigableContentsFactory* contents_factory,
ProcessingCallback callback);
~Processor() override;
// Invoke to begin processing.
void Process();
// content::NavigableContentsObserver:
void DidStopLoading() override;
private:
AssistantCardElement& card_element_;
content::mojom::NavigableContentsFactory* const contents_factory_;
ProcessingCallback callback_;
std::unique_ptr<content::NavigableContents> contents_;
DISALLOW_COPY_AND_ASSIGN(Processor);
};
const std::string html_;
const std::string fallback_;
std::unique_ptr<content::NavigableContents> contents_;
std::unique_ptr<Processor> processor_;
DISALLOW_COPY_AND_ASSIGN(AssistantCardElement);
};
// AssistantTextElement --------------------------------------------------------
// An Assistant UI element that will be rendered as text.
class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantTextElement
: public AssistantUiElement {
public:
explicit AssistantTextElement(const std::string& text)
: AssistantUiElement(AssistantUiElementType::kText), text_(text) {}
~AssistantTextElement() override = default;
const std::string& text() const { return text_; }
private:
const std::string text_;
DISALLOW_COPY_AND_ASSIGN(AssistantTextElement);
};
} // namespace ash
#endif // ASH_ASSISTANT_MODEL_ASSISTANT_UI_ELEMENT_H_