OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/android/tab_android.h" | 5 #include "chrome/browser/android/tab_android.h" |
6 | 6 |
| 7 #include "base/android/jni_android.h" |
| 8 #include "chrome/browser/android/chrome_web_contents_delegate_android.h" |
7 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
8 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | 10 #include "chrome/browser/content_settings/tab_specific_content_settings.h" |
9 #include "chrome/browser/extensions/tab_helper.h" | 11 #include "chrome/browser/extensions/tab_helper.h" |
10 #include "chrome/browser/favicon/favicon_tab_helper.h" | 12 #include "chrome/browser/favicon/favicon_tab_helper.h" |
11 #include "chrome/browser/history/history_tab_helper.h" | 13 #include "chrome/browser/history/history_tab_helper.h" |
12 #include "chrome/browser/infobars/infobar_service.h" | 14 #include "chrome/browser/infobars/infobar_service.h" |
13 #include "chrome/browser/password_manager/password_manager.h" | 15 #include "chrome/browser/password_manager/password_manager.h" |
14 #include "chrome/browser/password_manager/password_manager_delegate_impl.h" | 16 #include "chrome/browser/password_manager/password_manager_delegate_impl.h" |
15 #include "chrome/browser/prerender/prerender_tab_helper.h" | 17 #include "chrome/browser/prerender/prerender_tab_helper.h" |
| 18 #include "chrome/browser/profiles/profile.h" |
| 19 #include "chrome/browser/profiles/profile_android.h" |
16 #include "chrome/browser/sessions/session_tab_helper.h" | 20 #include "chrome/browser/sessions/session_tab_helper.h" |
17 #include "chrome/browser/ssl/ssl_tab_helper.h" | 21 #include "chrome/browser/ssl/ssl_tab_helper.h" |
18 #include "chrome/browser/translate/translate_tab_helper.h" | 22 #include "chrome/browser/translate/translate_tab_helper.h" |
19 #include "chrome/browser/ui/alternate_error_tab_observer.h" | 23 #include "chrome/browser/ui/alternate_error_tab_observer.h" |
20 #include "chrome/browser/ui/android/window_android_helper.h" | 24 #include "chrome/browser/ui/android/window_android_helper.h" |
21 #include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h" | 25 #include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h" |
22 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" | 26 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" |
23 #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" | 27 #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" |
24 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | 28 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
25 #include "chrome/browser/ui/browser_tab_contents.h" | 29 #include "chrome/browser/ui/browser_tab_contents.h" |
26 #include "chrome/browser/ui/find_bar/find_tab_helper.h" | 30 #include "chrome/browser/ui/find_bar/find_tab_helper.h" |
27 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" | 31 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
28 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" | 32 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" |
29 #include "chrome/browser/ui/toolbar/toolbar_model_impl.h" | 33 #include "chrome/browser/ui/toolbar/toolbar_model_impl.h" |
30 #include "components/autofill/content/browser/autofill_driver_impl.h" | 34 #include "components/autofill/content/browser/autofill_driver_impl.h" |
31 #include "content/public/browser/android/content_view_core.h" | 35 #include "content/public/browser/android/content_view_core.h" |
32 #include "content/public/browser/web_contents.h" | 36 #include "content/public/browser/web_contents.h" |
33 #include "extensions/browser/view_type_utils.h" | 37 #include "extensions/browser/view_type_utils.h" |
34 #include "jni/TabBase_jni.h" | 38 #include "jni/TabBase_jni.h" |
35 | 39 |
36 using content::WebContents; | |
37 | |
38 namespace { | 40 namespace { |
39 | 41 |
40 const char kTabHelpersInitializedUserDataKey[] = | 42 const char kTabHelpersInitializedUserDataKey[] = |
41 "TabAndroidTabHelpersInitialized"; | 43 "TabAndroidTabHelpersInitialized"; |
42 | 44 |
43 } // namespace | 45 } // namespace |
44 | 46 |
45 void BrowserTabContents::AttachTabHelpers(WebContents* contents) { | 47 void BrowserTabContents::AttachTabHelpers(content::WebContents* contents) { |
46 // If already initialized, nothing to be done. | 48 // If already initialized, nothing to be done. |
47 base::SupportsUserData::Data* initialization_tag = | 49 base::SupportsUserData::Data* initialization_tag = |
48 contents->GetUserData(&kTabHelpersInitializedUserDataKey); | 50 contents->GetUserData(&kTabHelpersInitializedUserDataKey); |
49 if (initialization_tag) | 51 if (initialization_tag) |
50 return; | 52 return; |
51 | 53 |
52 // Mark as initialized. | 54 // Mark as initialized. |
53 contents->SetUserData(&kTabHelpersInitializedUserDataKey, | 55 contents->SetUserData(&kTabHelpersInitializedUserDataKey, |
54 new base::SupportsUserData::Data()); | 56 new base::SupportsUserData::Data()); |
55 | 57 |
(...skipping 25 matching lines...) Expand all Loading... |
81 PopupBlockerTabHelper::CreateForWebContents(contents); | 83 PopupBlockerTabHelper::CreateForWebContents(contents); |
82 PrefsTabHelper::CreateForWebContents(contents); | 84 PrefsTabHelper::CreateForWebContents(contents); |
83 prerender::PrerenderTabHelper::CreateForWebContentsWithPasswordManager( | 85 prerender::PrerenderTabHelper::CreateForWebContentsWithPasswordManager( |
84 contents, PasswordManager::FromWebContents(contents)); | 86 contents, PasswordManager::FromWebContents(contents)); |
85 SSLTabHelper::CreateForWebContents(contents); | 87 SSLTabHelper::CreateForWebContents(contents); |
86 TabSpecificContentSettings::CreateForWebContents(contents); | 88 TabSpecificContentSettings::CreateForWebContents(contents); |
87 TranslateTabHelper::CreateForWebContents(contents); | 89 TranslateTabHelper::CreateForWebContents(contents); |
88 WindowAndroidHelper::CreateForWebContents(contents); | 90 WindowAndroidHelper::CreateForWebContents(contents); |
89 } | 91 } |
90 | 92 |
91 void TabAndroid::InitTabHelpers(WebContents* contents) { | 93 // TODO(dtrainor): Refactor so we do not need this method. |
| 94 void TabAndroid::InitTabHelpers(content::WebContents* contents) { |
92 BrowserTabContents::AttachTabHelpers(contents); | 95 BrowserTabContents::AttachTabHelpers(contents); |
93 } | 96 } |
94 | 97 |
95 WebContents* TabAndroid::InitWebContentsFromView(JNIEnv* env, | 98 TabAndroid* TabAndroid::FromWebContents(content::WebContents* web_contents) { |
96 jobject content_view) { | 99 CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents); |
97 content::ContentViewCore* content_view_core = | 100 if (!core_tab_helper) |
98 content::ContentViewCore::GetNativeContentViewCore(env, content_view); | 101 return NULL; |
99 DCHECK(content_view_core); | 102 |
100 WebContents* web_contents = content_view_core->GetWebContents(); | 103 CoreTabHelperDelegate* core_delegate = core_tab_helper->delegate(); |
101 DCHECK(web_contents); | 104 if (!core_delegate) |
102 InitTabHelpers(web_contents); | 105 return NULL; |
103 // Make sure tab id is same as web contents id. This means tab id can change | 106 |
104 // based on when web_contents are attached to tab. | 107 return static_cast<TabAndroid*>(core_delegate); |
105 // TODO(shashishekhar): Add a new notification for this, so any | |
106 // observers can make appropriate state changes. | |
107 tab_id_.set_id(SessionTabHelper::FromWebContents(web_contents) | |
108 ->session_id().id()); | |
109 return web_contents; | |
110 } | 108 } |
111 | 109 |
112 TabAndroid::TabAndroid(JNIEnv* env, jobject obj) : weak_java_tab_(env, obj) { | 110 TabAndroid* TabAndroid::GetNativeTab(JNIEnv* env, jobject obj) { |
| 111 return reinterpret_cast<TabAndroid*>(Java_TabBase_getNativePtr(env, obj)); |
| 112 } |
| 113 |
| 114 TabAndroid::TabAndroid(JNIEnv* env, jobject obj) |
| 115 : weak_java_tab_(env, obj), |
| 116 session_tab_id_(), |
| 117 android_tab_id_(-1) { |
113 Java_TabBase_setNativePtr(env, obj, reinterpret_cast<jint>(this)); | 118 Java_TabBase_setNativePtr(env, obj, reinterpret_cast<jint>(this)); |
114 } | 119 } |
115 | 120 |
| 121 content::ContentViewCore* TabAndroid::GetContentViewCore() const { |
| 122 if (!web_contents()) |
| 123 return NULL; |
| 124 |
| 125 return content::ContentViewCore::FromWebContents(web_contents()); |
| 126 } |
| 127 |
| 128 Profile* TabAndroid::GetProfile() const { |
| 129 if (!web_contents()) |
| 130 return NULL; |
| 131 |
| 132 return Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
| 133 } |
| 134 |
116 TabAndroid::~TabAndroid() { | 135 TabAndroid::~TabAndroid() { |
117 JNIEnv* env = base::android::AttachCurrentThread(); | 136 JNIEnv* env = base::android::AttachCurrentThread(); |
118 ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env); | 137 ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env); |
119 if (obj.is_null()) | 138 if (obj.is_null()) |
120 return; | 139 return; |
121 | 140 |
122 Java_TabBase_destroyBase(env, obj.obj()); | 141 Java_TabBase_clearNativePtr(env, obj.obj()); |
123 } | |
124 | |
125 content::WebContents* TabAndroid::GetWebContents() { | |
126 return NULL; | |
127 } | 142 } |
128 | 143 |
129 ToolbarModel::SecurityLevel TabAndroid::GetSecurityLevel() { | 144 ToolbarModel::SecurityLevel TabAndroid::GetSecurityLevel() { |
130 return ToolbarModelImpl::GetSecurityLevelForWebContents(GetWebContents()); | 145 return ToolbarModelImpl::GetSecurityLevelForWebContents(web_contents()); |
131 } | 146 } |
132 | 147 |
133 void TabAndroid::RunExternalProtocolDialog(const GURL& url) { | 148 void TabAndroid::RunExternalProtocolDialog(const GURL& url) { |
134 } | 149 } |
135 | 150 |
| 151 void TabAndroid::SwapTabContents(content::WebContents* old_contents, |
| 152 content::WebContents* new_contents) { |
| 153 JNIEnv* env = base::android::AttachCurrentThread(); |
| 154 Java_TabBase_swapWebContents( |
| 155 env, |
| 156 weak_java_tab_.get(env).obj(), |
| 157 reinterpret_cast<jint>(new_contents)); |
| 158 } |
| 159 |
| 160 void TabAndroid::InitWebContents(JNIEnv* env, |
| 161 jobject obj, |
| 162 jint tab_id, |
| 163 jboolean incognito, |
| 164 jobject jcontent_view_core, |
| 165 jobject jweb_contents_delegate) { |
| 166 android_tab_id_ = tab_id; |
| 167 |
| 168 content::ContentViewCore* content_view_core = |
| 169 content::ContentViewCore::GetNativeContentViewCore(env, |
| 170 jcontent_view_core); |
| 171 DCHECK(content_view_core); |
| 172 DCHECK(content_view_core->GetWebContents()); |
| 173 |
| 174 web_contents_.reset(content_view_core->GetWebContents()); |
| 175 InitTabHelpers(web_contents_.get()); |
| 176 |
| 177 session_tab_id_.set_id( |
| 178 SessionTabHelper::FromWebContents(web_contents())->session_id().id()); |
| 179 WindowAndroidHelper::FromWebContents(web_contents())-> |
| 180 SetWindowAndroid(content_view_core->GetWindowAndroid()); |
| 181 CoreTabHelper::FromWebContents(web_contents())->set_delegate(this); |
| 182 web_contents_delegate_.reset( |
| 183 new chrome::android::ChromeWebContentsDelegateAndroid( |
| 184 env, jweb_contents_delegate)); |
| 185 web_contents_delegate_->LoadProgressChanged(web_contents(), 0); |
| 186 web_contents()->SetDelegate(web_contents_delegate_.get()); |
| 187 |
| 188 // Verify that the WebContents this tab represents matches the expected |
| 189 // off the record state. |
| 190 CHECK_EQ(GetProfile()->IsOffTheRecord(), incognito); |
| 191 } |
| 192 |
| 193 void TabAndroid::DestroyWebContents(JNIEnv* env, |
| 194 jobject obj, |
| 195 jboolean delete_native) { |
| 196 web_contents()->SetDelegate(NULL); |
| 197 |
| 198 if (delete_native) { |
| 199 web_contents_.reset(); |
| 200 } else { |
| 201 // Release the WebContents so it does not get deleted by the scoped_ptr. |
| 202 ignore_result(web_contents_.release()); |
| 203 } |
| 204 } |
| 205 |
| 206 base::android::ScopedJavaLocalRef<jobject> TabAndroid::GetProfileAndroid( |
| 207 JNIEnv* env, |
| 208 jobject obj) { |
| 209 Profile* profile = GetProfile(); |
| 210 if (!profile) |
| 211 return base::android::ScopedJavaLocalRef<jobject>(); |
| 212 ProfileAndroid* profile_android = ProfileAndroid::FromProfile(profile); |
| 213 if (!profile_android) |
| 214 return base::android::ScopedJavaLocalRef<jobject>(); |
| 215 |
| 216 return profile_android->GetJavaObject(); |
| 217 } |
| 218 |
136 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { | 219 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { |
137 return RegisterNativesImpl(env); | 220 return RegisterNativesImpl(env); |
138 } | 221 } |
OLD | NEW |