Home | History | Annotate | Download | only in tab_contents
      1 // Copyright (c) 2011 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_UI_TAB_CONTENTS_TAB_CONTENTS_WRAPPER_H_
      6 #define CHROME_BROWSER_UI_TAB_CONTENTS_TAB_CONTENTS_WRAPPER_H_
      7 #pragma once
      8 
      9 #include <string>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "chrome/browser/printing/print_view_manager.h"
     15 #include "content/browser/tab_contents/tab_contents.h"
     16 #include "content/browser/tab_contents/tab_contents_observer.h"
     17 #include "content/common/notification_registrar.h"
     18 
     19 namespace prerender {
     20 class PrerenderObserver;
     21 }
     22 
     23 namespace printing {
     24 class PrintPreviewMessageHandler;
     25 }
     26 
     27 class AutocompleteHistoryManager;
     28 class AutofillManager;
     29 class AutomationTabHelper;
     30 class DownloadTabHelper;
     31 class Extension;
     32 class ExtensionTabHelper;
     33 class ExtensionWebNavigationTabObserver;
     34 class FileSelectObserver;
     35 class FindTabHelper;
     36 class NavigationController;
     37 class PasswordManager;
     38 class PasswordManagerDelegate;
     39 class SearchEngineTabHelper;
     40 class TabContentsWrapperDelegate;
     41 class TranslateTabHelper;
     42 
     43 // Wraps TabContents and all of its supporting objects in order to control
     44 // their ownership and lifetime, while allowing TabContents to remain generic
     45 // and re-usable in other projects.
     46 // TODO(pinkerton): Eventually, this class will become TabContents as far as
     47 // the browser front-end is concerned, and the current TabContents will be
     48 // renamed to something like WebPage or WebView (ben's suggestions).
     49 class TabContentsWrapper : public NotificationObserver,
     50                            public TabContentsObserver {
     51  public:
     52   // Takes ownership of |contents|, which must be heap-allocated (as it lives
     53   // in a scoped_ptr) and can not be NULL.
     54   explicit TabContentsWrapper(TabContents* contents);
     55   ~TabContentsWrapper();
     56 
     57   // Used to retrieve this object from |tab_contents_|, which is placed in
     58   // its property bag to avoid adding additional interfaces.
     59   static PropertyAccessor<TabContentsWrapper*>* property_accessor();
     60 
     61   static void RegisterUserPrefs(PrefService* prefs);
     62 
     63   // Initial title assigned to NavigationEntries from Navigate.
     64   static string16 GetDefaultTitle();
     65 
     66   // Returns a human-readable description the tab's loading state.
     67   string16 GetStatusText() const;
     68 
     69   // Create a TabContentsWrapper with the same state as this one. The returned
     70   // heap-allocated pointer is owned by the caller.
     71   TabContentsWrapper* Clone();
     72 
     73   // Helper to retrieve the existing instance that wraps a given TabContents.
     74   // Returns NULL if there is no such existing instance.
     75   // NOTE: This is not intended for general use. It is intended for situations
     76   // like callbacks from content/ where only a TabContents is available. In the
     77   // general case, please do NOT use this; plumb TabContentsWrapper through the
     78   // chrome/ code instead of TabContents.
     79   static TabContentsWrapper* GetCurrentWrapperForContents(
     80       TabContents* contents);
     81 
     82   TabContentsWrapperDelegate* delegate() const { return delegate_; }
     83   void set_delegate(TabContentsWrapperDelegate* d) { delegate_ = d; }
     84 
     85   TabContents* tab_contents() const { return tab_contents_.get(); }
     86   NavigationController& controller() const {
     87     return tab_contents()->controller();
     88   }
     89   TabContentsView* view() const { return tab_contents()->view(); }
     90   RenderViewHost* render_view_host() const {
     91     return tab_contents()->render_view_host();
     92   }
     93   Profile* profile() const { return tab_contents()->profile(); }
     94   bool is_starred() const { return is_starred_; }
     95 
     96   // Tab Helpers ---------------------------------------------------------------
     97 
     98   AutocompleteHistoryManager* autocomplete_history_manager() {
     99     return autocomplete_history_manager_.get();
    100   }
    101 
    102   AutofillManager* autofill_manager() { return autofill_manager_.get(); }
    103 
    104   // Used only for testing/automation.
    105   AutomationTabHelper* automation_tab_helper() {
    106     return automation_tab_helper_.get();
    107   }
    108 
    109   DownloadTabHelper* download_tab_helper() {
    110     return download_tab_helper_.get();
    111   }
    112 
    113   ExtensionTabHelper* extension_tab_helper() {
    114     return extension_tab_helper_.get();
    115   }
    116 
    117   FindTabHelper* find_tab_helper() { return find_tab_helper_.get(); }
    118 
    119   PasswordManager* password_manager() { return password_manager_.get(); }
    120 
    121   printing::PrintViewManager* print_view_manager() {
    122     return print_view_manager_.get();
    123   }
    124 
    125   SearchEngineTabHelper* search_engine_tab_helper() {
    126     return search_engine_tab_helper_.get();
    127   }
    128 
    129   TranslateTabHelper* translate_tab_helper() {
    130     return translate_tab_helper_.get();
    131   }
    132 
    133   // Overrides -----------------------------------------------------------------
    134 
    135   // TabContentsObserver overrides:
    136   virtual void DidNavigateMainFramePostCommit(
    137       const NavigationController::LoadCommittedDetails& details,
    138       const ViewHostMsg_FrameNavigate_Params& params) OVERRIDE;
    139   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
    140 
    141   // NotificationObserver overrides:
    142   virtual void Observe(NotificationType type,
    143                        const NotificationSource& source,
    144                        const NotificationDetails& details) OVERRIDE;
    145 
    146  private:
    147   // Internal helpers ----------------------------------------------------------
    148 
    149   // Message handlers.
    150   void OnPageContents(const GURL& url,
    151                       int32 page_id,
    152                       const string16& contents);
    153   void OnJSOutOfMemory();
    154   void OnRegisterProtocolHandler(const std::string& protocol,
    155                                  const GURL& url,
    156                                  const string16& title);
    157   void OnMsgThumbnail(const GURL& url,
    158                       const ThumbnailScore& score,
    159                       const SkBitmap& bitmap);
    160 
    161   // Updates the starred state from the bookmark bar model. If the state has
    162   // changed, the delegate is notified.
    163   void UpdateStarredStateForCurrentURL();
    164 
    165   // Data for core operation ---------------------------------------------------
    166 
    167   // Delegate for notifying our owner about stuff. Not owned by us.
    168   TabContentsWrapperDelegate* delegate_;
    169 
    170   // Registers and unregisters us for notifications.
    171   NotificationRegistrar registrar_;
    172 
    173   // Data for current page -----------------------------------------------------
    174 
    175   // Whether the current URL is starred.
    176   bool is_starred_;
    177 
    178   // Tab Helpers ---------------------------------------------------------------
    179   // (These provide API for callers and have a getter function listed in the
    180   // "Tab Helpers" section in the member functions area, above.)
    181 
    182   scoped_ptr<AutocompleteHistoryManager> autocomplete_history_manager_;
    183   scoped_ptr<AutofillManager> autofill_manager_;
    184   scoped_ptr<AutomationTabHelper> automation_tab_helper_;
    185   scoped_ptr<DownloadTabHelper> download_tab_helper_;
    186   scoped_ptr<ExtensionTabHelper> extension_tab_helper_;
    187   scoped_ptr<FindTabHelper> find_tab_helper_;
    188 
    189   // PasswordManager and its delegate. The delegate must outlive the manager,
    190   // per documentation in password_manager.h.
    191   scoped_ptr<PasswordManagerDelegate> password_manager_delegate_;
    192   scoped_ptr<PasswordManager> password_manager_;
    193 
    194   // Handles print job for this contents.
    195   scoped_ptr<printing::PrintViewManager> print_view_manager_;
    196 
    197   scoped_ptr<SearchEngineTabHelper> search_engine_tab_helper_;
    198   scoped_ptr<TranslateTabHelper> translate_tab_helper_;
    199 
    200   // Per-tab observers ---------------------------------------------------------
    201   // (These provide no API for callers; objects that need to exist 1:1 with tabs
    202   // and silently do their thing live here.)
    203 
    204   scoped_ptr<FileSelectObserver> file_select_observer_;
    205   scoped_ptr<prerender::PrerenderObserver> prerender_observer_;
    206   scoped_ptr<printing::PrintPreviewMessageHandler> print_preview_;
    207   scoped_ptr<ExtensionWebNavigationTabObserver> webnavigation_observer_;
    208 
    209   // TabContents (MUST BE LAST) ------------------------------------------------
    210 
    211   // The supporting objects need to outlive the TabContents dtor (as they may
    212   // be called upon during its execution). As a result, this must come last
    213   // in the list.
    214   scoped_ptr<TabContents> tab_contents_;
    215 
    216   DISALLOW_COPY_AND_ASSIGN(TabContentsWrapper);
    217 };
    218 
    219 #endif  // CHROME_BROWSER_UI_TAB_CONTENTS_TAB_CONTENTS_WRAPPER_H_
    220