blob: 3dee2cbd0ff1f7a3afd8ae7d696e467ca6274197 [file] [log] [blame]
// Copyright 2019 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 FUCHSIA_ENGINE_BROWSER_URL_REQUEST_REWRITE_RULES_MANAGER_H_
#define FUCHSIA_ENGINE_BROWSER_URL_REQUEST_REWRITE_RULES_MANAGER_H_
#include <fuchsia/web/cpp/fidl.h>
#include "base/synchronization/lock.h"
#include "content/public/browser/web_contents_binding_set.h"
#include "fuchsia/engine/common/web_engine_url_loader_throttle.h"
#include "fuchsia/engine/url_request_rewrite.mojom.h"
#include "fuchsia/engine/web_engine_export.h"
#include "mojo/public/cpp/bindings/associated_remote.h"
namespace content {
class RenderFrameHost;
class WebContents;
} // namespace content
// Adapts the UrlRequestRewrite FIDL API to be sent to the renderers over the
// over the UrlRequestRewrite Mojo API.
class WEB_ENGINE_EXPORT UrlRequestRewriteRulesManager
: public content::WebContentsObserver,
public WebEngineURLLoaderThrottle::CachedRulesProvider {
public:
static UrlRequestRewriteRulesManager* ForFrameTreeNodeId(
int frame_tree_node_id);
static std::unique_ptr<UrlRequestRewriteRulesManager> CreateForTesting();
explicit UrlRequestRewriteRulesManager(content::WebContents* web_contents);
~UrlRequestRewriteRulesManager() final;
// Signals |rules| have been updated. Actual implementation for
// fuchsia.web.Frame/SetUrlRequestRewriteRules.
// Return ZX_OK on success and an error code otherwise.
zx_status_t OnRulesUpdated(
std::vector<fuchsia::web::UrlRequestRewriteRule> rules,
fuchsia::web::Frame::SetUrlRequestRewriteRulesCallback callback);
// WebEngineURLLoaderThrottle::CachedRulesProvider implementation.
scoped_refptr<WebEngineURLLoaderThrottle::UrlRequestRewriteRules>
GetCachedRules() override;
private:
// Helper struct containing a RenderFrameHost and its corresponding
// AssociatedRemote.
struct ActiveFrame {
ActiveFrame(content::RenderFrameHost* render_frame_host,
mojo::AssociatedRemote<mojom::UrlRequestRulesReceiver>
associated_remote);
ActiveFrame(ActiveFrame&& other);
~ActiveFrame();
content::RenderFrameHost* render_frame_host;
mojo::AssociatedRemote<mojom::UrlRequestRulesReceiver> associated_remote;
};
// Test-only constructor.
explicit UrlRequestRewriteRulesManager();
// content::WebContentsObserver implementation.
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override;
base::Lock lock_;
scoped_refptr<WebEngineURLLoaderThrottle::UrlRequestRewriteRules>
cached_rules_ GUARDED_BY(lock_);
// Map of FrameTreeNode Ids to their current ActiveFrame.
std::map<int, ActiveFrame> active_frames_;
DISALLOW_COPY_AND_ASSIGN(UrlRequestRewriteRulesManager);
};
#endif // FUCHSIA_ENGINE_BROWSER_URL_REQUEST_REWRITE_RULES_MANAGER_H_