chromium/ios/web/web_state/ui/wk_content_rule_list_provider.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef IOS_WEB_WEB_STATE_UI_WK_CONTENT_RULE_LIST_PROVIDER_H_
#define IOS_WEB_WEB_STATE_UI_WK_CONTENT_RULE_LIST_PROVIDER_H_

#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"

@class WKContentRuleList;
@class WKUserContentController;

namespace web {

// A provider class that handles compiling and configuring Content Blocker
// rules.
class WKContentRuleListProvider {
 public:
  WKContentRuleListProvider();
  ~WKContentRuleListProvider();

  // Sets the WKUserContentController that this provider will install its rules
  // on.
  void SetUserContentController(
      WKUserContentController* user_content_controller);

  // Updates and re-installs the Content Blocker rules using any new state.
  // This may be asynchronous if a rule list hasn't been compiled yet, so
  // `callback` will be called after the mode is set. It will be called with
  // true if the update is successful and false otherwise (most likely because
  // rules were updated again before the first set of rules was fully
  // installed).
  void UpdateContentRuleLists(base::OnceCallback<void(bool)> callback);

 private:
  WKContentRuleListProvider(const WKContentRuleListProvider&) = delete;
  WKContentRuleListProvider& operator=(const WKContentRuleListProvider&) =
      delete;

  // Installs the content rule list that should be installed given the current
  // block setting.
  void InstallContentRuleLists();

  // Uninstalls all content rule lists installed by this provider.
  void UninstallContentRuleLists();

  __weak WKUserContentController* user_content_controller_;
  WKContentRuleList* block_local_rule_list_;
  WKContentRuleList* mixed_content_autoupgrade_rule_list_;

  base::OnceCallback<void(bool)> update_callback_;

  base::WeakPtrFactory<WKContentRuleListProvider> weak_ptr_factory_;
};

}  // namespace web

#endif  // IOS_WEB_WEB_STATE_UI_WK_CONTENT_RULE_LIST_PROVIDER_H_