Home | History | Annotate | Download | only in android
      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_ANDROID_TAB_ANDROID_H_
      6 #define CHROME_BROWSER_ANDROID_TAB_ANDROID_H_
      7 
      8 #include <jni.h>
      9 
     10 #include "base/android/jni_weak_ref.h"
     11 #include "base/callback_forward.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/strings/string16.h"
     14 #include "chrome/browser/search/instant_service_observer.h"
     15 #include "chrome/browser/sync/glue/synced_tab_delegate_android.h"
     16 #include "chrome/browser/ui/search/search_tab_helper_delegate.h"
     17 #include "chrome/browser/ui/tab_contents/core_tab_helper_delegate.h"
     18 #include "chrome/browser/ui/toolbar/toolbar_model.h"
     19 #include "components/sessions/session_id.h"
     20 #include "content/public/browser/notification_observer.h"
     21 #include "content/public/browser/notification_registrar.h"
     22 
     23 class GURL;
     24 class Profile;
     25 class SkBitmap;
     26 
     27 namespace chrome {
     28 struct NavigateParams;
     29 }
     30 
     31 namespace chrome {
     32 namespace android {
     33 class ChromeWebContentsDelegateAndroid;
     34 }
     35 }
     36 
     37 namespace content {
     38 class ContentViewCore;
     39 class WebContents;
     40 }
     41 
     42 namespace prerender {
     43 class PrerenderManager;
     44 }
     45 
     46 class TabAndroid : public CoreTabHelperDelegate,
     47                    public InstantServiceObserver,
     48                    public SearchTabHelperDelegate,
     49                    public content::NotificationObserver {
     50  public:
     51   enum TabLoadStatus {
     52 #define DEFINE_TAB_LOAD_STATUS(name, value)  name = value,
     53 #include "chrome/browser/android/tab_load_status.h"
     54 #undef DEFINE_TAB_LOAD_STATUS
     55   };
     56 
     57   // Convenience method to retrieve the Tab associated with the passed
     58   // WebContents.  Can return NULL.
     59   static TabAndroid* FromWebContents(content::WebContents* web_contents);
     60 
     61   // Returns the native TabAndroid stored in the Java Tab represented by
     62   // |obj|.
     63   static TabAndroid* GetNativeTab(JNIEnv* env, jobject obj);
     64 
     65   // Function to attach helpers to the contentView.
     66   static void AttachTabHelpers(content::WebContents* web_contents);
     67 
     68   TabAndroid(JNIEnv* env, jobject obj);
     69   virtual ~TabAndroid();
     70 
     71   base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
     72 
     73   // Return the WebContents, if any, currently owned by this TabAndroid.
     74   content::WebContents* web_contents() const { return web_contents_.get(); }
     75 
     76   // Return specific id information regarding this TabAndroid.
     77   const SessionID& session_id() const { return session_tab_id_; }
     78   int GetAndroidId() const;
     79   int GetSyncId() const;
     80 
     81   // Return the tab title.
     82   base::string16 GetTitle() const;
     83 
     84   // Return the tab url.
     85   GURL GetURL() const;
     86 
     87   // Load the tab if it was unloaded from memory.
     88   bool LoadIfNeeded();
     89 
     90   // Helper methods to make it easier to access objects from the associated
     91   // WebContents.  Can return NULL.
     92   content::ContentViewCore* GetContentViewCore() const;
     93   Profile* GetProfile() const;
     94   browser_sync::SyncedTabDelegate* GetSyncedTabDelegate() const;
     95 
     96   void SetWindowSessionID(SessionID::id_type window_id);
     97   void SetSyncId(int sync_id);
     98 
     99   virtual void HandlePopupNavigation(chrome::NavigateParams* params);
    100 
    101   // Called to determine if chrome://welcome should contain links to the terms
    102   // of service and the privacy notice.
    103   virtual bool ShouldWelcomePageLinkToTermsOfService();
    104 
    105   bool HasPrerenderedUrl(GURL gurl);
    106 
    107   void MakeLoadURLParams(
    108       chrome::NavigateParams* params,
    109       content::NavigationController::LoadURLParams* load_url_params);
    110 
    111   // CoreTabHelperDelegate ----------------------------------------------------
    112 
    113   virtual void SwapTabContents(content::WebContents* old_contents,
    114                                content::WebContents* new_contents,
    115                                bool did_start_load,
    116                                bool did_finish_load) OVERRIDE;
    117 
    118   // Overridden from InstantServiceObserver:
    119   void DefaultSearchProviderChanged() OVERRIDE;
    120 
    121   // Overridden from SearchTabHelperDelegate:
    122   virtual void OnWebContentsInstantSupportDisabled(
    123       const content::WebContents* web_contents) OVERRIDE;
    124 
    125   // NotificationObserver -----------------------------------------------------
    126   virtual void Observe(int type,
    127                        const content::NotificationSource& source,
    128                        const content::NotificationDetails& details) OVERRIDE;
    129 
    130   // Methods called from Java via JNI -----------------------------------------
    131 
    132   virtual void Destroy(JNIEnv* env, jobject obj);
    133   virtual void InitWebContents(JNIEnv* env,
    134                                jobject obj,
    135                                jboolean incognito,
    136                                jobject jcontent_view_core,
    137                                jobject jweb_contents_delegate,
    138                                jobject jcontext_menu_populator);
    139   virtual void DestroyWebContents(JNIEnv* env,
    140                                   jobject obj,
    141                                   jboolean delete_native);
    142   base::android::ScopedJavaLocalRef<jobject> GetProfileAndroid(JNIEnv* env,
    143                                                                jobject obj);
    144   virtual TabLoadStatus LoadUrl(JNIEnv* env,
    145                                 jobject obj,
    146                                 jstring url,
    147                                 jstring j_extra_headers,
    148                                 jbyteArray j_post_data,
    149                                 jint page_transition,
    150                                 jstring j_referrer_url,
    151                                 jint referrer_policy,
    152                                 jboolean is_renderer_initiated);
    153   ToolbarModel::SecurityLevel GetSecurityLevel(JNIEnv* env, jobject obj);
    154   void SetActiveNavigationEntryTitleForUrl(JNIEnv* env,
    155                                            jobject obj,
    156                                            jstring jurl,
    157                                            jstring jtitle);
    158   bool Print(JNIEnv* env, jobject obj);
    159   // Called to get favicon of current tab, return null if no favicon is
    160   // avaliable for current tab.
    161   base::android::ScopedJavaLocalRef<jobject> GetFavicon(JNIEnv* env,
    162                                                         jobject obj);
    163   jboolean IsFaviconValid(JNIEnv* env, jobject jobj);
    164 
    165   // Register the Tab's native methods through JNI.
    166   static bool RegisterTabAndroid(JNIEnv* env);
    167 
    168  private:
    169   prerender::PrerenderManager* GetPrerenderManager() const;
    170 
    171   JavaObjectWeakGlobalRef weak_java_tab_;
    172 
    173   // The identifier used by session restore for this tab.
    174   SessionID session_tab_id_;
    175 
    176   // Identifier of the window the tab is in.
    177   SessionID session_window_id_;
    178 
    179   content::NotificationRegistrar notification_registrar_;
    180 
    181   scoped_ptr<content::WebContents> web_contents_;
    182   scoped_ptr<chrome::android::ChromeWebContentsDelegateAndroid>
    183       web_contents_delegate_;
    184 
    185   scoped_ptr<browser_sync::SyncedTabDelegateAndroid> synced_tab_delegate_;
    186 
    187   DISALLOW_COPY_AND_ASSIGN(TabAndroid);
    188 };
    189 
    190 #endif  // CHROME_BROWSER_ANDROID_TAB_ANDROID_H_
    191