1 // Copyright (c) 2012 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.
5 #ifndef CHROME_BROWSER_EXTENSIONS_SCRIPT_BADGE_CONTROLLER_H_
6 #define CHROME_BROWSER_EXTENSIONS_SCRIPT_BADGE_CONTROLLER_H_
12 #include "base/compiler_specific.h"
13 #include "base/memory/linked_ptr.h"
14 #include "base/memory/ref_counted.h"
15 #include "chrome/browser/extensions/location_bar_controller.h"
16 #include "chrome/browser/extensions/tab_helper.h"
17 #include "content/public/browser/notification_observer.h"
18 #include "content/public/browser/notification_registrar.h"
19 #include "content/public/browser/web_contents_observer.h"
21 class ExtensionAction
;
22 class ExtensionService
;
33 namespace extensions
{
37 // A LocationBarController which displays icons whenever a script is executing
40 // When extension IDs are recorded a NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED
41 // is sent, and those extensions will be returned from GetCurrentActions until
42 // the next page navigation.
43 class ScriptBadgeController
44 : public LocationBarController
,
45 public TabHelper::ScriptExecutionObserver
,
46 public content::WebContentsObserver
,
47 public content::NotificationObserver
{
49 explicit ScriptBadgeController(content::WebContents
* web_contents
,
50 TabHelper
* tab_helper
);
51 virtual ~ScriptBadgeController();
53 // LocationBarController implementation.
54 virtual std::vector
<ExtensionAction
*> GetCurrentActions() const OVERRIDE
;
55 virtual void GetAttentionFor(const std::string
& extension_id
) OVERRIDE
;
56 virtual Action
OnClicked(const std::string
& extension_id
,
57 int mouse_button
) OVERRIDE
;
58 virtual void NotifyChange() OVERRIDE
;
60 // TabHelper::ScriptExecutionObserver implementation.
61 virtual void OnScriptsExecuted(
62 const content::WebContents
* web_contents
,
63 const ExecutingScriptsMap
& extension_ids
,
65 const GURL
& on_url
) OVERRIDE
;
68 // Gets the Profile for |web_contents_|.
69 Profile
* profile() const;
71 // Gets the ExtensionService for |web_contents_|.
72 ExtensionService
* GetExtensionService() const;
74 // Gets the current page ID, or -1 if no navigation entry has been committed.
77 // content::WebContentsObserver implementation.
78 virtual void DidNavigateMainFrame(
79 const content::LoadCommittedDetails
& details
,
80 const content::FrameNavigateParams
& params
) OVERRIDE
;
82 // content::NotificationObserver implementation.
83 virtual void Observe(int type
,
84 const content::NotificationSource
& source
,
85 const content::NotificationDetails
& details
) OVERRIDE
;
87 // Adds the extension's icon to the list of script badges. Returns
88 // the script badge ExtensionAction that was added, or NULL if
89 // extension_id isn't valid.
90 ExtensionAction
* AddExtensionToCurrentActions(
91 const std::string
& extension_id
);
93 // Called when an extension is running script on the current tab,
94 // and tries to insert an extension into the relevant collections.
95 // Returns true if any change was made.
96 bool MarkExtensionExecuting(const std::string
& extension_id
);
98 // The current extension actions. These come from calls to ExecuteScript or
99 // getAttention on the current frame.
100 std::set
<std::string
> extensions_in_current_actions_
;
102 // Listen to extension unloaded notifications.
103 content::NotificationRegistrar registrar_
;
105 DISALLOW_COPY_AND_ASSIGN(ScriptBadgeController
);
108 } // namespace extensions
110 #endif // CHROME_BROWSER_EXTENSIONS_SCRIPT_BADGE_CONTROLLER_H_