// Copyright (c) 2013 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 CHROME_BROWSER_EXTENSIONS_EXTENSION_RENDERER_STATE_H_
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_RENDERER_STATE_H_
#include <map>
#include <set>
#include <string>
#include <utility>
#include "base/basictypes.h"
#include "base/memory/singleton.h"
class WebViewGuest;
namespace content {
class ResourceRequestInfo;
}
// This class keeps track of renderer state for use on the IO thread. All
// methods should be called on the IO thread except for Init and Shutdown.
class ExtensionRendererState {
public:
struct WebViewInfo {
int embedder_process_id;
int instance_id;
std::string partition_id;
std::string embedder_extension_id;
};
static ExtensionRendererState* GetInstance();
// These are called on the UI thread to start and stop listening to tab
// notifications.
void Init();
void Shutdown();
// Looks up the information for the embedder <webview> for a given render
// view, if one exists. Called on the IO thread.
bool GetWebViewInfo(int guest_process_id, int guest_routing_id,
WebViewInfo* webview_info);
// Looks up the partition info for the embedder <webview> for a given guest
// process. Called on the IO thread.
bool GetWebViewPartitionID(int guest_process_id, std::string* partition_id);
// Looks up the tab and window ID for a given request. Returns true if we have
// the IDs in our map. Called on the IO thread.
bool GetTabAndWindowId(
const content::ResourceRequestInfo* info, int* tab_id, int* window_id);
// Returns true if the given renderer is used by webviews.
bool IsWebViewRenderer(int render_process_id);
private:
class RenderViewHostObserver;
class TabObserver;
friend class TabObserver;
friend class WebViewGuest;
friend struct DefaultSingletonTraits<ExtensionRendererState>;
typedef std::pair<int, int> RenderId;
typedef std::pair<int, int> TabAndWindowId;
typedef std::map<RenderId, TabAndWindowId> TabAndWindowIdMap;
typedef std::map<RenderId, WebViewInfo> WebViewInfoMap;
struct WebViewPartitionInfo {
int web_view_count;
std::string partition_id;
WebViewPartitionInfo() {}
WebViewPartitionInfo(int count, std::string partition):
web_view_count(count),
partition_id(partition) {}
};
typedef std::map<int, WebViewPartitionInfo> WebViewPartitionIDMap;
ExtensionRendererState();
~ExtensionRendererState();
// Adds or removes a render view from our map.
void SetTabAndWindowId(
int render_process_host_id, int routing_id, int tab_id, int window_id);
void ClearTabAndWindowId(
int render_process_host_id, int routing_id);
// Adds or removes a <webview> guest render process from the set.
void AddWebView(int render_process_host_id, int routing_id,
const WebViewInfo& webview_info);
void RemoveWebView(int render_process_host_id, int routing_id);
TabObserver* observer_;
TabAndWindowIdMap map_;
WebViewInfoMap webview_info_map_;
WebViewPartitionIDMap webview_partition_id_map_;
DISALLOW_COPY_AND_ASSIGN(ExtensionRendererState);
};
#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_RENDERER_STATE_H_