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 23class GURL; 24class Profile; 25class SkBitmap; 26 27namespace chrome { 28struct NavigateParams; 29} 30 31namespace chrome { 32namespace android { 33class ChromeWebContentsDelegateAndroid; 34} 35} 36 37namespace content { 38class ContentViewCore; 39class WebContents; 40} 41 42namespace prerender { 43class PrerenderManager; 44} 45 46class 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