Home | History | Annotate | Download | only in extensions
      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.
      4 
      5 #ifndef CHROME_BROWSER_EXTENSIONS_SCRIPT_BADGE_CONTROLLER_H_
      6 #define CHROME_BROWSER_EXTENSIONS_SCRIPT_BADGE_CONTROLLER_H_
      7 
      8 #include <map>
      9 #include <set>
     10 #include <string>
     11 
     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"
     20 
     21 class ExtensionAction;
     22 class ExtensionService;
     23 class GURL;
     24 
     25 namespace base {
     26 class ListValue;
     27 }  // namespace base
     28 
     29 namespace IPC {
     30 class Message;
     31 }
     32 
     33 namespace extensions {
     34 
     35 class Extension;
     36 
     37 // A LocationBarController which displays icons whenever a script is executing
     38 // in a tab.
     39 //
     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 {
     48  public:
     49   explicit ScriptBadgeController(content::WebContents* web_contents,
     50                                  TabHelper* tab_helper);
     51   virtual ~ScriptBadgeController();
     52 
     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;
     59 
     60   // TabHelper::ScriptExecutionObserver implementation.
     61   virtual void OnScriptsExecuted(
     62       const content::WebContents* web_contents,
     63       const ExecutingScriptsMap& extension_ids,
     64       int32 on_page_id,
     65       const GURL& on_url) OVERRIDE;
     66 
     67  private:
     68   // Gets the Profile for |web_contents_|.
     69   Profile* profile() const;
     70 
     71   // Gets the ExtensionService for |web_contents_|.
     72   ExtensionService* GetExtensionService() const;
     73 
     74   // Gets the current page ID, or -1 if no navigation entry has been committed.
     75   int32 GetPageID();
     76 
     77   // content::WebContentsObserver implementation.
     78   virtual void DidNavigateMainFrame(
     79       const content::LoadCommittedDetails& details,
     80       const content::FrameNavigateParams& params) OVERRIDE;
     81 
     82   // content::NotificationObserver implementation.
     83   virtual void Observe(int type,
     84                        const content::NotificationSource& source,
     85                        const content::NotificationDetails& details) OVERRIDE;
     86 
     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);
     92 
     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);
     97 
     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_;
    101 
    102   // Listen to extension unloaded notifications.
    103   content::NotificationRegistrar registrar_;
    104 
    105   DISALLOW_COPY_AND_ASSIGN(ScriptBadgeController);
    106 };
    107 
    108 }  // namespace extensions
    109 
    110 #endif  // CHROME_BROWSER_EXTENSIONS_SCRIPT_BADGE_CONTROLLER_H_
    111