OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include "base/android/jni_android.h" | 9 #include "base/android/jni_android.h" |
10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 : weak_java_tab_(env, obj), | 128 : weak_java_tab_(env, obj), |
129 content_layer_(cc::Layer::Create()), | 129 content_layer_(cc::Layer::Create()), |
130 tab_content_manager_(NULL), | 130 tab_content_manager_(NULL), |
131 synced_tab_delegate_(new browser_sync::SyncedTabDelegateAndroid(this)) { | 131 synced_tab_delegate_(new browser_sync::SyncedTabDelegateAndroid(this)) { |
132 Java_Tab_setNativePtr(env, obj, reinterpret_cast<intptr_t>(this)); | 132 Java_Tab_setNativePtr(env, obj, reinterpret_cast<intptr_t>(this)); |
133 } | 133 } |
134 | 134 |
135 TabAndroid::~TabAndroid() { | 135 TabAndroid::~TabAndroid() { |
136 GetContentLayer()->RemoveAllChildren(); | 136 GetContentLayer()->RemoveAllChildren(); |
137 JNIEnv* env = base::android::AttachCurrentThread(); | 137 JNIEnv* env = base::android::AttachCurrentThread(); |
138 Java_Tab_clearNativePtr(env, weak_java_tab_.get(env).obj()); | 138 Java_Tab_clearNativePtr(env, weak_java_tab_.get(env)); |
139 } | 139 } |
140 | 140 |
141 base::android::ScopedJavaLocalRef<jobject> TabAndroid::GetJavaObject() { | 141 base::android::ScopedJavaLocalRef<jobject> TabAndroid::GetJavaObject() { |
142 JNIEnv* env = base::android::AttachCurrentThread(); | 142 JNIEnv* env = base::android::AttachCurrentThread(); |
143 return weak_java_tab_.get(env); | 143 return weak_java_tab_.get(env); |
144 } | 144 } |
145 | 145 |
146 scoped_refptr<cc::Layer> TabAndroid::GetContentLayer() const { | 146 scoped_refptr<cc::Layer> TabAndroid::GetContentLayer() const { |
147 return content_layer_; | 147 return content_layer_; |
148 } | 148 } |
149 | 149 |
150 int TabAndroid::GetAndroidId() const { | 150 int TabAndroid::GetAndroidId() const { |
151 JNIEnv* env = base::android::AttachCurrentThread(); | 151 JNIEnv* env = base::android::AttachCurrentThread(); |
152 return Java_Tab_getId(env, weak_java_tab_.get(env).obj()); | 152 return Java_Tab_getId(env, weak_java_tab_.get(env)); |
153 } | 153 } |
154 | 154 |
155 int TabAndroid::GetSyncId() const { | 155 int TabAndroid::GetSyncId() const { |
156 JNIEnv* env = base::android::AttachCurrentThread(); | 156 JNIEnv* env = base::android::AttachCurrentThread(); |
157 return Java_Tab_getSyncId(env, weak_java_tab_.get(env).obj()); | 157 return Java_Tab_getSyncId(env, weak_java_tab_.get(env)); |
158 } | 158 } |
159 | 159 |
160 base::string16 TabAndroid::GetTitle() const { | 160 base::string16 TabAndroid::GetTitle() const { |
161 JNIEnv* env = base::android::AttachCurrentThread(); | 161 JNIEnv* env = base::android::AttachCurrentThread(); |
162 return base::android::ConvertJavaStringToUTF16( | 162 return base::android::ConvertJavaStringToUTF16( |
163 Java_Tab_getTitle(env, weak_java_tab_.get(env).obj())); | 163 Java_Tab_getTitle(env, weak_java_tab_.get(env))); |
164 } | 164 } |
165 | 165 |
166 GURL TabAndroid::GetURL() const { | 166 GURL TabAndroid::GetURL() const { |
167 JNIEnv* env = base::android::AttachCurrentThread(); | 167 JNIEnv* env = base::android::AttachCurrentThread(); |
168 return GURL(base::android::ConvertJavaStringToUTF8( | 168 return GURL(base::android::ConvertJavaStringToUTF8( |
169 Java_Tab_getUrl(env, weak_java_tab_.get(env).obj()))); | 169 Java_Tab_getUrl(env, weak_java_tab_.get(env)))); |
170 } | 170 } |
171 | 171 |
172 bool TabAndroid::LoadIfNeeded() { | 172 bool TabAndroid::LoadIfNeeded() { |
173 JNIEnv* env = base::android::AttachCurrentThread(); | 173 JNIEnv* env = base::android::AttachCurrentThread(); |
174 return Java_Tab_loadIfNeeded(env, weak_java_tab_.get(env).obj()); | 174 return Java_Tab_loadIfNeeded(env, weak_java_tab_.get(env)); |
175 } | 175 } |
176 | 176 |
177 Profile* TabAndroid::GetProfile() const { | 177 Profile* TabAndroid::GetProfile() const { |
178 if (!web_contents()) | 178 if (!web_contents()) |
179 return NULL; | 179 return NULL; |
180 | 180 |
181 return Profile::FromBrowserContext(web_contents()->GetBrowserContext()); | 181 return Profile::FromBrowserContext(web_contents()->GetBrowserContext()); |
182 } | 182 } |
183 | 183 |
184 browser_sync::SyncedTabDelegate* TabAndroid::GetSyncedTabDelegate() const { | 184 browser_sync::SyncedTabDelegate* TabAndroid::GetSyncedTabDelegate() const { |
185 return synced_tab_delegate_.get(); | 185 return synced_tab_delegate_.get(); |
186 } | 186 } |
187 | 187 |
188 void TabAndroid::SetWindowSessionID(SessionID::id_type window_id) { | 188 void TabAndroid::SetWindowSessionID(SessionID::id_type window_id) { |
189 session_window_id_.set_id(window_id); | 189 session_window_id_.set_id(window_id); |
190 | 190 |
191 if (!web_contents()) | 191 if (!web_contents()) |
192 return; | 192 return; |
193 | 193 |
194 SessionTabHelper* session_tab_helper = | 194 SessionTabHelper* session_tab_helper = |
195 SessionTabHelper::FromWebContents(web_contents()); | 195 SessionTabHelper::FromWebContents(web_contents()); |
196 session_tab_helper->SetWindowID(session_window_id_); | 196 session_tab_helper->SetWindowID(session_window_id_); |
197 } | 197 } |
198 | 198 |
199 void TabAndroid::SetSyncId(int sync_id) { | 199 void TabAndroid::SetSyncId(int sync_id) { |
200 JNIEnv* env = base::android::AttachCurrentThread(); | 200 JNIEnv* env = base::android::AttachCurrentThread(); |
201 Java_Tab_setSyncId(env, weak_java_tab_.get(env).obj(), sync_id); | 201 Java_Tab_setSyncId(env, weak_java_tab_.get(env), sync_id); |
202 } | 202 } |
203 | 203 |
204 void TabAndroid::HandlePopupNavigation(chrome::NavigateParams* params) { | 204 void TabAndroid::HandlePopupNavigation(chrome::NavigateParams* params) { |
205 DCHECK(params->source_contents == web_contents()); | 205 DCHECK(params->source_contents == web_contents()); |
206 DCHECK(params->target_contents == NULL || | 206 DCHECK(params->target_contents == NULL || |
207 params->target_contents == web_contents()); | 207 params->target_contents == web_contents()); |
208 | 208 |
209 WindowOpenDisposition disposition = params->disposition; | 209 WindowOpenDisposition disposition = params->disposition; |
210 const GURL& url = params->url; | 210 const GURL& url = params->url; |
211 | 211 |
212 if (disposition == NEW_POPUP || | 212 if (disposition == NEW_POPUP || |
213 disposition == NEW_FOREGROUND_TAB || | 213 disposition == NEW_FOREGROUND_TAB || |
214 disposition == NEW_BACKGROUND_TAB || | 214 disposition == NEW_BACKGROUND_TAB || |
215 disposition == NEW_WINDOW || | 215 disposition == NEW_WINDOW || |
216 disposition == OFF_THE_RECORD) { | 216 disposition == OFF_THE_RECORD) { |
217 JNIEnv* env = AttachCurrentThread(); | 217 JNIEnv* env = AttachCurrentThread(); |
218 ScopedJavaLocalRef<jobject> jobj = weak_java_tab_.get(env); | 218 ScopedJavaLocalRef<jobject> jobj = weak_java_tab_.get(env); |
219 ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString(env, url.spec())); | 219 ScopedJavaLocalRef<jstring> jurl(ConvertUTF8ToJavaString(env, url.spec())); |
220 ScopedJavaLocalRef<jstring> jheaders( | 220 ScopedJavaLocalRef<jstring> jheaders( |
221 ConvertUTF8ToJavaString(env, params->extra_headers)); | 221 ConvertUTF8ToJavaString(env, params->extra_headers)); |
222 ScopedJavaLocalRef<jobject> jpost_data; | 222 ScopedJavaLocalRef<jobject> jpost_data; |
223 if (params->uses_post && params->post_data) | 223 if (params->uses_post && params->post_data) |
224 jpost_data = params->post_data->ToJavaObject(env); | 224 jpost_data = params->post_data->ToJavaObject(env); |
225 Java_Tab_openNewTab(env, | 225 Java_Tab_openNewTab(env, jobj, jurl, jheaders, jpost_data, disposition, |
226 jobj.obj(), | |
227 jurl.obj(), | |
228 jheaders.obj(), | |
229 jpost_data.obj(), | |
230 disposition, | |
231 params->created_with_opener, | 226 params->created_with_opener, |
232 params->is_renderer_initiated); | 227 params->is_renderer_initiated); |
233 } else { | 228 } else { |
234 NOTIMPLEMENTED(); | 229 NOTIMPLEMENTED(); |
235 } | 230 } |
236 } | 231 } |
237 | 232 |
238 bool TabAndroid::HasPrerenderedUrl(GURL gurl) { | 233 bool TabAndroid::HasPrerenderedUrl(GURL gurl) { |
239 prerender::PrerenderManager* prerender_manager = GetPrerenderManager(); | 234 prerender::PrerenderManager* prerender_manager = GetPrerenderManager(); |
240 if (!prerender_manager) | 235 if (!prerender_manager) |
(...skipping 11 matching lines...) Expand all Loading... |
252 } | 247 } |
253 } | 248 } |
254 return false; | 249 return false; |
255 } | 250 } |
256 | 251 |
257 void TabAndroid::SwapTabContents(content::WebContents* old_contents, | 252 void TabAndroid::SwapTabContents(content::WebContents* old_contents, |
258 content::WebContents* new_contents, | 253 content::WebContents* new_contents, |
259 bool did_start_load, | 254 bool did_start_load, |
260 bool did_finish_load) { | 255 bool did_finish_load) { |
261 JNIEnv* env = base::android::AttachCurrentThread(); | 256 JNIEnv* env = base::android::AttachCurrentThread(); |
262 Java_Tab_swapWebContents( | 257 Java_Tab_swapWebContents(env, weak_java_tab_.get(env), |
263 env, | 258 new_contents->GetJavaWebContents(), did_start_load, |
264 weak_java_tab_.get(env).obj(), | 259 did_finish_load); |
265 new_contents->GetJavaWebContents().obj(), | |
266 did_start_load, | |
267 did_finish_load); | |
268 } | 260 } |
269 | 261 |
270 void TabAndroid::DefaultSearchProviderChanged( | 262 void TabAndroid::DefaultSearchProviderChanged( |
271 bool google_base_url_domain_changed) { | 263 bool google_base_url_domain_changed) { |
272 // TODO(kmadhusu): Move this function definition to a common place and update | 264 // TODO(kmadhusu): Move this function definition to a common place and update |
273 // BrowserInstantController::DefaultSearchProviderChanged to use the same. | 265 // BrowserInstantController::DefaultSearchProviderChanged to use the same. |
274 if (!web_contents()) | 266 if (!web_contents()) |
275 return; | 267 return; |
276 | 268 |
277 InstantService* instant_service = | 269 InstantService* instant_service = |
(...skipping 18 matching lines...) Expand all Loading... |
296 InfoBarService::FromWebContents(web_contents())->set_ignore_next_reload(); | 288 InfoBarService::FromWebContents(web_contents())->set_ignore_next_reload(); |
297 } | 289 } |
298 | 290 |
299 void TabAndroid::OnWebContentsInstantSupportDisabled( | 291 void TabAndroid::OnWebContentsInstantSupportDisabled( |
300 const content::WebContents* contents) { | 292 const content::WebContents* contents) { |
301 DCHECK(contents); | 293 DCHECK(contents); |
302 if (web_contents() != contents) | 294 if (web_contents() != contents) |
303 return; | 295 return; |
304 | 296 |
305 JNIEnv* env = base::android::AttachCurrentThread(); | 297 JNIEnv* env = base::android::AttachCurrentThread(); |
306 Java_Tab_onWebContentsInstantSupportDisabled(env, | 298 Java_Tab_onWebContentsInstantSupportDisabled(env, weak_java_tab_.get(env)); |
307 weak_java_tab_.get(env).obj()); | |
308 } | 299 } |
309 | 300 |
310 void TabAndroid::Observe(int type, | 301 void TabAndroid::Observe(int type, |
311 const content::NotificationSource& source, | 302 const content::NotificationSource& source, |
312 const content::NotificationDetails& details) { | 303 const content::NotificationDetails& details) { |
313 JNIEnv* env = base::android::AttachCurrentThread(); | 304 JNIEnv* env = base::android::AttachCurrentThread(); |
314 switch (type) { | 305 switch (type) { |
315 case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { | 306 case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: { |
316 TabSpecificContentSettings* settings = | 307 TabSpecificContentSettings* settings = |
317 TabSpecificContentSettings::FromWebContents(web_contents()); | 308 TabSpecificContentSettings::FromWebContents(web_contents()); |
318 if (!settings->IsBlockageIndicated(CONTENT_SETTINGS_TYPE_POPUPS)) { | 309 if (!settings->IsBlockageIndicated(CONTENT_SETTINGS_TYPE_POPUPS)) { |
319 // TODO(dfalcantara): Create an InfoBarDelegate to keep the | 310 // TODO(dfalcantara): Create an InfoBarDelegate to keep the |
320 // PopupBlockedInfoBar logic native-side instead of straddling the JNI | 311 // PopupBlockedInfoBar logic native-side instead of straddling the JNI |
321 // boundary. | 312 // boundary. |
322 int num_popups = 0; | 313 int num_popups = 0; |
323 PopupBlockerTabHelper* popup_blocker_helper = | 314 PopupBlockerTabHelper* popup_blocker_helper = |
324 PopupBlockerTabHelper::FromWebContents(web_contents()); | 315 PopupBlockerTabHelper::FromWebContents(web_contents()); |
325 if (popup_blocker_helper) | 316 if (popup_blocker_helper) |
326 num_popups = popup_blocker_helper->GetBlockedPopupsCount(); | 317 num_popups = popup_blocker_helper->GetBlockedPopupsCount(); |
327 | 318 |
328 if (num_popups > 0) | 319 if (num_popups > 0) |
329 PopupBlockedInfoBarDelegate::Create(web_contents(), num_popups); | 320 PopupBlockedInfoBarDelegate::Create(web_contents(), num_popups); |
330 | 321 |
331 settings->SetBlockageHasBeenIndicated(CONTENT_SETTINGS_TYPE_POPUPS); | 322 settings->SetBlockageHasBeenIndicated(CONTENT_SETTINGS_TYPE_POPUPS); |
332 } | 323 } |
333 break; | 324 break; |
334 } | 325 } |
335 case content::NOTIFICATION_NAV_ENTRY_CHANGED: | 326 case content::NOTIFICATION_NAV_ENTRY_CHANGED: |
336 Java_Tab_onNavEntryChanged(env, weak_java_tab_.get(env).obj()); | 327 Java_Tab_onNavEntryChanged(env, weak_java_tab_.get(env)); |
337 break; | 328 break; |
338 default: | 329 default: |
339 NOTREACHED() << "Unexpected notification " << type; | 330 NOTREACHED() << "Unexpected notification " << type; |
340 break; | 331 break; |
341 } | 332 } |
342 } | 333 } |
343 | 334 |
344 void TabAndroid::OnFaviconUpdated(favicon::FaviconDriver* favicon_driver, | 335 void TabAndroid::OnFaviconUpdated(favicon::FaviconDriver* favicon_driver, |
345 NotificationIconType notification_icon_type, | 336 NotificationIconType notification_icon_type, |
346 const GURL& icon_url, | 337 const GURL& icon_url, |
347 bool icon_url_changed, | 338 bool icon_url_changed, |
348 const gfx::Image& image) { | 339 const gfx::Image& image) { |
349 if (notification_icon_type != NON_TOUCH_LARGEST && | 340 if (notification_icon_type != NON_TOUCH_LARGEST && |
350 notification_icon_type != TOUCH_LARGEST) { | 341 notification_icon_type != TOUCH_LARGEST) { |
351 return; | 342 return; |
352 } | 343 } |
353 | 344 |
354 SkBitmap favicon = image.AsImageSkia().GetRepresentation(1.0f).sk_bitmap(); | 345 SkBitmap favicon = image.AsImageSkia().GetRepresentation(1.0f).sk_bitmap(); |
355 if (favicon.empty()) | 346 if (favicon.empty()) |
356 return; | 347 return; |
357 | 348 |
358 JNIEnv* env = base::android::AttachCurrentThread(); | 349 JNIEnv* env = base::android::AttachCurrentThread(); |
359 Java_Tab_onFaviconAvailable(env, weak_java_tab_.get(env).obj(), | 350 Java_Tab_onFaviconAvailable(env, weak_java_tab_.get(env), |
360 gfx::ConvertToJavaBitmap(&favicon).obj()); | 351 gfx::ConvertToJavaBitmap(&favicon)); |
361 } | 352 } |
362 | 353 |
363 void TabAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 354 void TabAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
364 delete this; | 355 delete this; |
365 } | 356 } |
366 | 357 |
367 void TabAndroid::InitWebContents( | 358 void TabAndroid::InitWebContents( |
368 JNIEnv* env, | 359 JNIEnv* env, |
369 const JavaParamRef<jobject>& obj, | 360 const JavaParamRef<jobject>& obj, |
370 jboolean incognito, | 361 jboolean incognito, |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 printing::PrintViewManagerBasic::FromWebContents(web_contents()); | 625 printing::PrintViewManagerBasic::FromWebContents(web_contents()); |
635 if (print_view_manager == NULL) | 626 if (print_view_manager == NULL) |
636 return false; | 627 return false; |
637 | 628 |
638 print_view_manager->PrintNow(); | 629 print_view_manager->PrintNow(); |
639 return true; | 630 return true; |
640 } | 631 } |
641 | 632 |
642 void TabAndroid::SetPendingPrint() { | 633 void TabAndroid::SetPendingPrint() { |
643 JNIEnv* env = base::android::AttachCurrentThread(); | 634 JNIEnv* env = base::android::AttachCurrentThread(); |
644 Java_Tab_setPendingPrint(env, weak_java_tab_.get(env).obj()); | 635 Java_Tab_setPendingPrint(env, weak_java_tab_.get(env)); |
645 } | 636 } |
646 | 637 |
647 ScopedJavaLocalRef<jobject> TabAndroid::GetFavicon( | 638 ScopedJavaLocalRef<jobject> TabAndroid::GetFavicon( |
648 JNIEnv* env, | 639 JNIEnv* env, |
649 const JavaParamRef<jobject>& obj) { | 640 const JavaParamRef<jobject>& obj) { |
650 ScopedJavaLocalRef<jobject> bitmap; | 641 ScopedJavaLocalRef<jobject> bitmap; |
651 favicon::FaviconDriver* favicon_driver = | 642 favicon::FaviconDriver* favicon_driver = |
652 favicon::ContentFaviconDriver::FromWebContents(web_contents_.get()); | 643 favicon::ContentFaviconDriver::FromWebContents(web_contents_.get()); |
653 | 644 |
654 if (!favicon_driver) | 645 if (!favicon_driver) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 if (only_editable && !managed->CanBeEditedByUser(nodes[i])) | 758 if (only_editable && !managed->CanBeEditedByUser(nodes[i])) |
768 continue; | 759 continue; |
769 return nodes[i]->id(); | 760 return nodes[i]->id(); |
770 } | 761 } |
771 | 762 |
772 return -1; | 763 return -1; |
773 } | 764 } |
774 | 765 |
775 void TabAndroid::ShowOfflinePages() { | 766 void TabAndroid::ShowOfflinePages() { |
776 JNIEnv* env = base::android::AttachCurrentThread(); | 767 JNIEnv* env = base::android::AttachCurrentThread(); |
777 Java_Tab_showOfflinePages(env, weak_java_tab_.get(env).obj()); | 768 Java_Tab_showOfflinePages(env, weak_java_tab_.get(env)); |
778 } | 769 } |
779 | 770 |
780 void TabAndroid::OnLoFiResponseReceived(bool is_preview) { | 771 void TabAndroid::OnLoFiResponseReceived(bool is_preview) { |
781 JNIEnv* env = base::android::AttachCurrentThread(); | 772 JNIEnv* env = base::android::AttachCurrentThread(); |
782 Java_Tab_onLoFiResponseReceived(env, weak_java_tab_.get(env).obj(), | 773 Java_Tab_onLoFiResponseReceived(env, weak_java_tab_.get(env), is_preview); |
783 is_preview); | |
784 } | 774 } |
785 | 775 |
786 jboolean TabAndroid::IsOfflinePage(JNIEnv* env, | 776 jboolean TabAndroid::IsOfflinePage(JNIEnv* env, |
787 const JavaParamRef<jobject>& obj) { | 777 const JavaParamRef<jobject>& obj) { |
788 return offline_pages::OfflinePageUtils::GetOfflinePageFromWebContents( | 778 return offline_pages::OfflinePageUtils::GetOfflinePageFromWebContents( |
789 web_contents()) != nullptr; | 779 web_contents()) != nullptr; |
790 } | 780 } |
791 | 781 |
792 ScopedJavaLocalRef<jobject> TabAndroid::GetOfflinePage( | 782 ScopedJavaLocalRef<jobject> TabAndroid::GetOfflinePage( |
793 JNIEnv* env, | 783 JNIEnv* env, |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { | 874 static void Init(JNIEnv* env, const JavaParamRef<jobject>& obj) { |
885 TRACE_EVENT0("native", "TabAndroid::Init"); | 875 TRACE_EVENT0("native", "TabAndroid::Init"); |
886 // This will automatically bind to the Java object and pass ownership there. | 876 // This will automatically bind to the Java object and pass ownership there. |
887 new TabAndroid(env, obj); | 877 new TabAndroid(env, obj); |
888 } | 878 } |
889 | 879 |
890 // static | 880 // static |
891 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { | 881 bool TabAndroid::RegisterTabAndroid(JNIEnv* env) { |
892 return RegisterNativesImpl(env); | 882 return RegisterNativesImpl(env); |
893 } | 883 } |
OLD | NEW |