1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_RENDERER_STATE_H_
6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_RENDERER_STATE_H_
7
8#include <map>
9#include <set>
10#include <string>
11#include <utility>
12
13#include "base/basictypes.h"
14#include "base/memory/singleton.h"
15
16namespace content {
17class ResourceRequestInfo;
18}
19
20// This class keeps track of renderer state for use on the IO thread. All
21// methods should be called on the IO thread except for Init and Shutdown.
22class ExtensionRendererState {
23 public:
24  static ExtensionRendererState* GetInstance();
25
26  // These are called on the UI thread to start and stop listening to tab
27  // notifications.
28  void Init();
29  void Shutdown();
30
31  // Looks up the tab and window ID for a given request. Returns true if we have
32  // the IDs in our map. Called on the IO thread.
33  bool GetTabAndWindowId(
34      const content::ResourceRequestInfo* info, int* tab_id, int* window_id);
35
36 private:
37  class RenderViewHostObserver;
38  class TabObserver;
39  friend class TabObserver;
40  friend struct DefaultSingletonTraits<ExtensionRendererState>;
41
42  typedef std::pair<int, int> RenderId;
43  typedef std::pair<int, int> TabAndWindowId;
44  typedef std::map<RenderId, TabAndWindowId> TabAndWindowIdMap;
45
46  ExtensionRendererState();
47  ~ExtensionRendererState();
48
49  // Adds or removes a render view from our map.
50  void SetTabAndWindowId(
51      int render_process_host_id, int routing_id, int tab_id, int window_id);
52  void ClearTabAndWindowId(
53      int render_process_host_id, int routing_id);
54
55  TabObserver* observer_;
56  TabAndWindowIdMap map_;
57
58  DISALLOW_COPY_AND_ASSIGN(ExtensionRendererState);
59};
60
61#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_RENDERER_STATE_H_
62