// 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_