| Index: components/offline_pages/offline_page_model_query.h
|
| diff --git a/components/offline_pages/offline_page_model_query.h b/components/offline_pages/offline_page_model_query.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ddc8e837d83082468ce6ffc7a98bb4cda5057a25
|
| --- /dev/null
|
| +++ b/components/offline_pages/offline_page_model_query.h
|
| @@ -0,0 +1,145 @@
|
| +// 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_OFFLINE_PAGES_OFFLINE_PAGE_MODEL_QUERY_H_
|
| +#define COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_MODEL_QUERY_H_
|
| +
|
| +#include <set>
|
| +#include <vector>
|
| +
|
| +#include "base/memory/ptr_util.h"
|
| +#include "components/offline_pages/client_policy_controller.h"
|
| +#include "components/offline_pages/offline_page_item.h"
|
| +#include "components/offline_pages/offline_page_types.h"
|
| +
|
| +namespace offline_pages {
|
| +
|
| +// Can be used by OfflinePageModel instances to direct a query of the model.
|
| +class OfflinePageModelQuery {
|
| + public:
|
| + // A query can be constrained by several fields. This constraint can be
|
| + // either a positive or negative one (or no constraint): a page MUST have
|
| + // something, or a page MUST NOT have something to match a query.
|
| + enum class Requirement {
|
| + // No requirement.
|
| + UNSET,
|
| + // All returned pages will have one of the values specified in the query
|
| + // requirement.
|
| + INCLUDE_MATCHING,
|
| + // All returned pages will not have any of the values specified in the query
|
| + // requirement.
|
| + EXCLUDE_MATCHING,
|
| + };
|
| +
|
| + OfflinePageModelQuery();
|
| + virtual ~OfflinePageModelQuery();
|
| +
|
| + std::pair<bool, std::set<std::string>> GetRestrictedToNamespaces() const;
|
| + std::pair<Requirement, std::set<int64_t>> GetRestrictedToOfflineIds() const;
|
| + std::pair<Requirement, std::set<ClientId>> GetRestrictedToClientIds() const;
|
| + std::pair<Requirement, std::set<GURL>> GetRestrictedToUrls() const;
|
| +
|
| + bool GetAllowExpired() const;
|
| +
|
| + // This is the workhorse function that is used by the in-memory offline page
|
| + // model, given a page it will find out whether that page matches the query.
|
| + bool Matches(const OfflinePageItem& page) const;
|
| +
|
| + private:
|
| + friend class OfflinePageModelQueryBuilder;
|
| +
|
| + bool allow_expired_ = false;
|
| +
|
| + std::unique_ptr<std::set<std::string>> restricted_to_namespaces_;
|
| +
|
| + std::pair<Requirement, std::set<int64_t>> offline_ids_;
|
| + std::pair<Requirement, std::set<ClientId>> client_ids_;
|
| + std::pair<Requirement, std::set<GURL>> urls_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(OfflinePageModelQuery);
|
| +};
|
| +
|
| +// Used to create an offline page model query. QueryBuilders without
|
| +// modifications create queries that allow all pages that are not expired.
|
| +// Can restrict results by policies provided by |ClientPolicyController|, or by
|
| +// individual features of pages. Each restriction comes with a |Requirement|
|
| +// that can be used to specify whether the input restriction should include or
|
| +// exclude matching pages.
|
| +class OfflinePageModelQueryBuilder {
|
| + public:
|
| + using Requirement = OfflinePageModelQuery::Requirement;
|
| +
|
| + OfflinePageModelQueryBuilder();
|
| + ~OfflinePageModelQueryBuilder();
|
| +
|
| + // Sets the offline page IDs that are valid for this request. If called
|
| + // multiple times, overwrites previous offline page ID restrictions.
|
| + OfflinePageModelQueryBuilder& SetOfflinePageIds(
|
| + Requirement requirement,
|
| + const std::vector<int64_t>& ids);
|
| +
|
| + // Sets the client IDs that are valid for this request. If called multiple
|
| + // times, overwrites previous client ID restrictions.
|
| + OfflinePageModelQueryBuilder& SetClientIds(Requirement requirement,
|
| + const std::vector<ClientId>& ids);
|
| +
|
| + // Sets the URLs that are valid for this request. If called multiple times,
|
| + // overwrites previous URL restrictions.
|
| + OfflinePageModelQueryBuilder& SetUrls(Requirement requirement,
|
| + const std::vector<GURL>& urls);
|
| +
|
| + // Only include pages whose namespaces satisfy
|
| + // ClientPolicyController::IsSupportedByDownload(|namespace|) ==
|
| + // |supported_by_download|
|
| + // Multiple calls overwrite previous ones.
|
| + OfflinePageModelQueryBuilder& RequireSupportedByDownload(
|
| + Requirement supported_by_download);
|
| +
|
| + // Only include pages whose namespaces satisfy
|
| + // ClientPolicyController::IsShownAsRecentlyVisitedSite(|namespace|) ==
|
| + // |recently_visited|
|
| + // Multiple calls overwrite previous ones.
|
| + OfflinePageModelQueryBuilder& RequireShownAsRecentlyVisitedSite(
|
| + Requirement recently_visited);
|
| +
|
| + // Only include pages whose namespaces satisfy
|
| + // ClientPolicyController::IsRestrictedToOriginalTab(|namespace|) ==
|
| + // |original_tab|
|
| + // Multiple calls overwrite previous ones.
|
| + OfflinePageModelQueryBuilder& RequireRestrictedToOriginalTab(
|
| + Requirement original_tab);
|
| +
|
| + // Resets whether we return expired pages. If called multiple times the bit
|
| + // is overwritten and |allow_expired| from the last call is saved.
|
| + OfflinePageModelQueryBuilder& AllowExpiredPages(bool allow_expired);
|
| +
|
| + // Builds the query using the namespace policies provided by |controller|
|
| + // This resets the internal state. |controller| should not be |nullptr|.
|
| + std::unique_ptr<OfflinePageModelQuery> Build(
|
| + ClientPolicyController* controller);
|
| +
|
| + private:
|
| + // Intersects the allowed namespaces in query_ with |namespaces|. If
|
| + // |inverted| is true, intersects the allowed namespaces with all namespaces
|
| + // except those provided in |namespaces|.
|
| + void IntersectWithNamespaces(ClientPolicyController* controller,
|
| + const std::vector<std::string>& namespaces,
|
| + Requirement match_requirement);
|
| +
|
| + std::pair<Requirement, std::vector<int64_t>> offline_ids_;
|
| + std::pair<Requirement, std::vector<ClientId>> client_ids_;
|
| + std::pair<Requirement, std::vector<GURL>> urls_;
|
| +
|
| + Requirement supported_by_download_ = Requirement::UNSET;
|
| + Requirement shown_as_recently_visited_site_ = Requirement::UNSET;
|
| + Requirement restricted_to_original_tab_ = Requirement::UNSET;
|
| +
|
| + bool allow_expired_ = false;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(OfflinePageModelQueryBuilder);
|
| +};
|
| +
|
| +} // namespace offline_pages
|
| +
|
| +#endif // COMPONENTS_OFFLINE_PAGES_OFFLINE_PAGE_MODEL_QUERY_H_
|
|
|