Index: components/favicon/core/favicon_selector.h |
diff --git a/components/favicon/core/favicon_selector.h b/components/favicon/core/favicon_selector.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..346a3b2fd25687eff515a77effadc72bc2ad5cf4 |
--- /dev/null |
+++ b/components/favicon/core/favicon_selector.h |
@@ -0,0 +1,146 @@ |
+// Copyright (c) 2017 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_FAVICON_CORE_FAVICON_SELECTOR_H_ |
+#define COMPONENTS_FAVICON_CORE_FAVICON_SELECTOR_H_ |
+ |
+#include <list> |
+#include <memory> |
+#include <utility> |
+#include <vector> |
+ |
+#include "base/macros.h" |
+#include "base/optional.h" |
+#include "components/favicon/core/favicon_url.h" |
+#include "ui/gfx/image/image_skia.h" |
+ |
+namespace favicon { |
+ |
+// Represents a queue contaning favicon bitmaps, sorted by descending score. |
+// Candidates can be dequeued one by one and the result of processing candidates |
+// can be fed back to the queue, such that it keeps track of the best candidate |
+// found so far. |
+class FaviconSelector { |
+ public: |
+ // Used to track a candidate favicon bitmap. |
+ struct Candidate { |
+ // Builds a scored candidate by selecting the best bitmap size. |
+ static Candidate FromFaviconURL(const favicon::FaviconURL& favicon_url, |
+ int target_pixel_size); |
+ |
+ GURL icon_url; |
+ favicon_base::IconType icon_type; |
+ float score; |
+ }; |
+ |
+ struct BestCandidate { |
+ Candidate candidate; |
+ gfx::Size original_size; |
+ SkBitmap bitmap; |
+ }; |
+ |
+ // Defines the goals or ideal pixel size that a particular |
+ // FaviconSelector is looking for. |
+ class TargetSizeSpec { |
+ public: |
+ static TargetSizeSpec ForLargest(); |
+ // Returns largest pixel sizes first. |
+ static std::vector<TargetSizeSpec> For16x16Dips(); |
+ |
+ TargetSizeSpec(const TargetSizeSpec&); |
+ ~TargetSizeSpec(); |
+ |
+ TargetSizeSpec(TargetSizeSpec&&); |
+ TargetSizeSpec& operator=(TargetSizeSpec&&); |
+ |
+ // Returns the target pixel size. |
+ int pixel_size() const { return pixel_size_; } |
+ |
+ // Returns the target scale factor. |
+ float scale_factor() const { return scale_factor_; } |
+ |
+ // Returns whether the spec is requiring the best-matching bitmap only. |
+ // TODO(mastiz): Rename this? |
+ bool WantsBestBitmapOnly() const; |
+ |
+ // Checks if |bitmap_results| contains a bitmap satistying this spec. |
+ bool HasSatisfyingResult( |
+ const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results) |
+ const; |
+ |
+ // Scores and sorts the entries in |favicon_urls|, best icon size matches |
+ // first. Pruning means discarding all but the best bitmap per candidate. |
+ // Returns the sorted, scored and pruned candidate list. |
+ std::list<Candidate> SortAndPruneCandidates( |
+ const std::vector<favicon::FaviconURL>& favicon_urls) const; |
+ |
+ private: |
+ TargetSizeSpec(); |
+ |
+ int pixel_size_; |
+ float scale_factor_; |
+ |
+ // If true, FaviconHandler will resample candidates whenever needed to |
+ // ensure that bitmaps for all |pixel_sizes| are produced. |
+ bool ensure_exact_size_; |
+ }; |
+ |
+ // Convenience function to construct multiple selectors. |target_size_specs| |
+ // must be in descending pixel size order. |
+ static std::vector<FaviconSelector> BuildMultiple( |
+ const std::vector<TargetSizeSpec>& target_size_specs, |
+ const std::vector<favicon::FaviconURL>& candidates); |
+ |
+ // |candidates| must be non-empty. |
+ FaviconSelector(const TargetSizeSpec& target_size_spec, |
+ const std::vector<favicon::FaviconURL>& candidates); |
+ ~FaviconSelector(); |
+ FaviconSelector(FaviconSelector&&); |
+ FaviconSelector& operator=(FaviconSelector&&); |
+ |
+ const TargetSizeSpec& target_size_spec() const { return target_size_spec_; } |
+ |
+ // Returns the next candidate to be processed, or an empty value if no |
+ // further work is demanded, although clients are allowed to feed in new |
+ // downloads via ProcessDownloadedImage(). |
+ base::Optional<Candidate> DequeueCandidate(); |
+ |
+ // Returns the current candidate without dequeueing it. |
+ const Candidate* CurrentCandidate() const; |
+ |
+ // Feeds in the bitmaps of a downloaded image, which will be compared against |
+ // the best one processed so far. |bitmaps| and |original_sizes| must have the |
+ // same size. Returns true if |icon_url| was chosen as the best one so far. |
+ bool ProcessDownloadedImage(const GURL& icon_url, |
+ favicon_base::IconType icon_type, |
+ const std::vector<SkBitmap>& bitmaps, |
+ const std::vector<gfx::Size>& original_sizes); |
+ |
+ // Returns the best-matching bitmap downloaded/processed so far, if any. |
+ const base::Optional<BestCandidate>& BestBitmap() const { |
+ return best_candidate_; |
+ } |
+ |
+ private: |
+ // Returns whether a good enough bitmap was found (i.e. no further work |
+ // demanded by this selector, although callers are allowed to process and feed |
+ // in more processed downloads) |
+ bool IsSatisfied() const; |
+ |
+ // Desired icon size. |
+ class TargetSizeSpec target_size_spec_; |
+ |
+ // The prioritized favicon candidates from the page. There cannot be |
+ // multiple candidates for the same icon URL. |
+ std::list<Candidate> pending_candidates_; |
+ |
+ // Best bitmap we've seen so far, if any. |
+ base::Optional<BestCandidate> best_candidate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FaviconSelector); |
+}; |
+ |
+} // namespace favicon |
+ |
+#endif // COMPONENTS_FAVICON_CORE_FAVICON_SELECTOR_H_ |