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