15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_ACTIVE_TAB_PERMISSION_GRANTER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_ACTIVE_TAB_PERMISSION_GRANTER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/scoped_observer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/browser/extension_registry_observer.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern_set.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension;
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass ExtensionRegistry;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Responsible for granting and revoking tab-specific permissions to extensions
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// with the activeTab or tabCapture permission.
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass ActiveTabPermissionGranter
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : public content::WebContentsObserver,
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      public extensions::ExtensionRegistryObserver {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ActiveTabPermissionGranter(content::WebContents* web_contents,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int tab_id,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             Profile* profile);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ActiveTabPermissionGranter();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If |extension| has the activeTab or tabCapture permission, grants
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // tab-specific permissions to it until the next page navigation or refresh.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GrantIfRequested(const Extension* extension);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::WebContentsObserver implementation.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidNavigateMainFrame(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::LoadCommittedDetails& details,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::FrameNavigateParams& params) OVERRIDE;
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void WebContentsDestroyed() OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // extensions::ExtensionRegistryObserver implementation.
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void OnExtensionUnloaded(content::BrowserContext* browser_context,
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   const Extension* extension,
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                   UnloadedExtensionInfo::Reason reason)
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears any tab-specific permissions for all extensions on |tab_id_| and
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // notifies renderers.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearActiveExtensionsAndNotify();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tab ID for this tab.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tab_id_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extensions with the activeTab permission that have been granted
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tab-specific permissions until the next navigation/refresh.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet granted_extensions_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Listen to extension unloaded notifications.
680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      extension_registry_observer_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ActiveTabPermissionGranter);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_ACTIVE_TAB_PERMISSION_GRANTER_H_
77