| // 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 COMPONENTS_NTP_SNIPPETS_CONTENT_SUGGESTION_H_ |
| #define COMPONENTS_NTP_SNIPPETS_CONTENT_SUGGESTION_H_ |
| |
| #include <memory> |
| #include <string> |
| |
| #include "base/files/file_path.h" |
| #include "base/macros.h" |
| #include "base/strings/string16.h" |
| #include "base/time/time.h" |
| #include "components/ntp_snippets/category.h" |
| #include "url/gurl.h" |
| |
| namespace ntp_snippets { |
| |
| // DownloadSuggestionExtra contains additional data which is only available for |
| // download suggestions. |
| struct DownloadSuggestionExtra { |
| DownloadSuggestionExtra(); |
| ~DownloadSuggestionExtra(); |
| |
| // The file path of the downloaded file once download completes. |
| base::FilePath target_file_path; |
| // The effective MIME type of downloaded content. |
| std::string mime_type; |
| // Underlying offline page identifier. |
| int64_t offline_page_id = 0; |
| // Whether or not the download suggestion is a downloaded asset. |
| // When this is true, |offline_page_id| is ignored, otherwise |
| // |target_file_path| and |mime_type| are ignored. |
| bool is_download_asset = false; |
| }; |
| |
| // Contains additional data which is only available for recent tab suggestions. |
| struct RecentTabSuggestionExtra { |
| // Corresponding tab identifier. |
| std::string tab_id; |
| // Underlying offline page identifier. |
| int64_t offline_page_id = 0; |
| }; |
| |
| // Contains additional data for notification-worthy suggestions. |
| struct NotificationExtra { |
| // Deadline for showing notification. If the deadline is past, the |
| // notification is no longer fresh and no notification should be sent. If the |
| // deadline passes while a notification is up, it should be canceled. |
| base::Time deadline; |
| }; |
| |
| // A content suggestion for the new tab page, which can be an article or an |
| // offline page, for example. |
| class ContentSuggestion { |
| public: |
| class ID { |
| public: |
| ID(Category category, const std::string& id_within_category) |
| : category_(category), id_within_category_(id_within_category) {} |
| |
| Category category() const { return category_; } |
| |
| const std::string& id_within_category() const { |
| return id_within_category_; |
| } |
| |
| bool operator==(const ID& rhs) const; |
| bool operator!=(const ID& rhs) const; |
| |
| private: |
| Category category_; |
| std::string id_within_category_; |
| |
| // Allow copy and assignment. |
| }; |
| |
| // Creates a new ContentSuggestion. The caller must ensure that the |id| |
| // passed in here is unique application-wide. |
| ContentSuggestion(const ID& id, const GURL& url); |
| ContentSuggestion(Category category, |
| const std::string& id_within_category, |
| const GURL& url); |
| ContentSuggestion(ContentSuggestion&&); |
| ContentSuggestion& operator=(ContentSuggestion&&); |
| |
| ~ContentSuggestion(); |
| |
| // An ID for identifying the suggestion. The ID is unique application-wide. |
| const ID& id() const { return id_; } |
| |
| // The URL where the content referenced by the suggestion can be accessed. |
| // This may be an AMP URL. |
| const GURL& url() const { return url_; } |
| |
| // Title of the suggestion. |
| const base::string16& title() const { return title_; } |
| void set_title(const base::string16& title) { title_ = title; } |
| |
| // Summary or relevant textual extract from the content. |
| const base::string16& snippet_text() const { return snippet_text_; } |
| void set_snippet_text(const base::string16& snippet_text) { |
| snippet_text_ = snippet_text; |
| } |
| |
| // The time when the content represented by this suggestion was published. |
| const base::Time& publish_date() const { return publish_date_; } |
| void set_publish_date(const base::Time& publish_date) { |
| publish_date_ = publish_date; |
| } |
| |
| // The name of the source/publisher of this suggestion. |
| const base::string16& publisher_name() const { return publisher_name_; } |
| void set_publisher_name(const base::string16& publisher_name) { |
| publisher_name_ = publisher_name; |
| } |
| |
| // TODO(pke): Remove the score from the ContentSuggestion class. The UI only |
| // uses it to track user clicks (histogram data). Instead, the providers |
| // should be informed about clicks and do appropriate logging themselves. |
| // IMPORTANT: The score may simply be 0 for suggestions from providers which |
| // cannot provide score values. |
| float score() const { return score_; } |
| void set_score(float score) { score_ = score; } |
| |
| // Extra information for download suggestions. Only available for DOWNLOADS |
| // suggestions (i.e., if the associated category has the |
| // KnownCategories::DOWNLOADS id). |
| DownloadSuggestionExtra* download_suggestion_extra() const { |
| return download_suggestion_extra_.get(); |
| } |
| void set_download_suggestion_extra( |
| std::unique_ptr<DownloadSuggestionExtra> download_suggestion_extra); |
| |
| // Extra information for recent tab suggestions. Only available for |
| // KnownCategories::RECENT_TABS suggestions. |
| RecentTabSuggestionExtra* recent_tab_suggestion_extra() const { |
| return recent_tab_suggestion_extra_.get(); |
| } |
| void set_recent_tab_suggestion_extra( |
| std::unique_ptr<RecentTabSuggestionExtra> recent_tab_suggestion_extra); |
| |
| // Extra information for notifications. When absent, no notification should be |
| // sent for this suggestion. When present, a notification should be sent, |
| // unless other factors disallow it (examples: the extra parameters say to; |
| // notifications are disabled; Chrome is in the foreground). |
| NotificationExtra* notification_extra() const { |
| return notification_extra_.get(); |
| } |
| void set_notification_extra( |
| std::unique_ptr<NotificationExtra> notification_extra); |
| |
| private: |
| ID id_; |
| GURL url_; |
| base::string16 title_; |
| base::string16 snippet_text_; |
| base::Time publish_date_; |
| base::string16 publisher_name_; |
| float score_; |
| std::unique_ptr<DownloadSuggestionExtra> download_suggestion_extra_; |
| std::unique_ptr<RecentTabSuggestionExtra> recent_tab_suggestion_extra_; |
| std::unique_ptr<NotificationExtra> notification_extra_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ContentSuggestion); |
| }; |
| |
| std::ostream& operator<<(std::ostream& os, const ContentSuggestion::ID& id); |
| |
| } // namespace ntp_snippets |
| |
| #endif // COMPONENTS_NTP_SNIPPETS_CONTENT_SUGGESTION_H_ |