tab_android.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/android/tab_android.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/android/jni_android.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/android/jni_string.h"
9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/android/chrome_web_contents_delegate_android.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/android/webapps/single_tab_mode_tab_helper.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_tab_helper.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/net/net_error_tab_helper.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_manager.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/password_manager/password_manager_delegate_impl.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_predictor_factory.h"
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/predictors/resource_prefetch_predictor_tab_helper.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prerender/prerender_tab_helper.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/printing/print_view_manager_basic.h"
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
26424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/profiles/profile_android.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_tab_helper.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ssl/ssl_tab_helper.h"
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync/glue/synced_tab_delegate_android.h"
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/tab_contents/navigation_metrics_recorder.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/translate/translate_tab_helper.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/alternate_error_tab_observer.h"
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/android/content_settings/popup_blocked_infobar_delegate.h"
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/android/context_menu_helper.h"
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/ui/android/infobars/infobar_container_android.h"
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/android/tab_model/tab_model.h"
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/android/window_android_helper.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h"
40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_tab_contents.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_tab_helper.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/toolbar/toolbar_model_impl.h"
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/content/browser/autofill_driver_impl.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/android/content_view_core.h"
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/browser/notification_service.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/browser/view_type_utils.h"
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "jni/TabBase_jni.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTabHelpersInitializedUserDataKey[] =
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "TabAndroidTabHelpersInitialized";
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void BrowserTabContents::AttachTabHelpers(content::WebContents* contents) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If already initialized, nothing to be done.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::SupportsUserData::Data* initialization_tag =
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      contents->GetUserData(&kTabHelpersInitializedUserDataKey);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (initialization_tag)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Mark as initialized.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  contents->SetUserData(&kTabHelpersInitializedUserDataKey,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            new base::SupportsUserData::Data());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the view type.
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extensions::SetViewType(contents, extensions::VIEW_TYPE_TAB_CONTENTS);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext());
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SessionTabHelper comes first because it sets up the tab ID, and other
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // helpers may rely on that.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTabHelper::CreateForWebContents(contents);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AlternateErrorPageTabObserver::CreateForWebContents(contents);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  autofill::TabAutofillManagerDelegate::CreateForWebContents(contents);
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  autofill::AutofillDriverImpl::CreateForWebContentsAndDelegate(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      contents,
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      autofill::TabAutofillManagerDelegate::FromWebContents(contents),
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      g_browser_process->GetApplicationLocale(),
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      autofill::AutofillManager::ENABLE_AUTOFILL_DOWNLOAD_MANAGER);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkTabHelper::CreateForWebContents(contents);
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ContextMenuHelper::CreateForWebContents(contents);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CoreTabHelper::CreateForWebContents(contents);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(contents);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FaviconTabHelper::CreateForWebContents(contents);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FindTabHelper::CreateForWebContents(contents);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryTabHelper::CreateForWebContents(contents);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InfoBarService::CreateForWebContents(contents);
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NavigationMetricsRecorder::CreateForWebContents(contents);
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  chrome_browser_net::NetErrorTabHelper::CreateForWebContents(contents);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordManagerDelegateImpl::CreateForWebContents(contents);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordManager::CreateForWebContentsAndDelegate(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contents, PasswordManagerDelegateImpl::FromWebContents(contents));
106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PopupBlockerTabHelper::CreateForWebContents(contents);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefsTabHelper::CreateForWebContents(contents);
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  prerender::PrerenderTabHelper::CreateForWebContentsWithPasswordManager(
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      contents, PasswordManager::FromWebContents(contents));
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SingleTabModeTabHelper::CreateForWebContents(contents);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLTabHelper::CreateForWebContents(contents);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings::CreateForWebContents(contents);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TranslateTabHelper::CreateForWebContents(contents);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowAndroidHelper::CreateForWebContents(contents);
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (predictors::ResourcePrefetchPredictorFactory::GetForProfile(profile)) {
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    predictors::ResourcePrefetchPredictorTabHelper::CreateForWebContents(
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        contents);
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ENABLE_MANAGED_USERS)
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (profile->IsManaged())
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ManagedModeNavigationObserver::CreateForWebContents(contents);
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
127424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// TODO(dtrainor): Refactor so we do not need this method.
128424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void TabAndroid::InitTabHelpers(content::WebContents* contents) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BrowserTabContents::AttachTabHelpers(contents);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TabAndroid* TabAndroid::FromWebContents(content::WebContents* web_contents) {
133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CoreTabHelper* core_tab_helper = CoreTabHelper::FromWebContents(web_contents);
134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!core_tab_helper)
135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return NULL;
136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CoreTabHelperDelegate* core_delegate = core_tab_helper->delegate();
138424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!core_delegate)
139424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return NULL;
140424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return static_cast<TabAndroid*>(core_delegate);
142424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
143424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
144424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TabAndroid* TabAndroid::GetNativeTab(JNIEnv* env, jobject obj) {
145424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return reinterpret_cast<TabAndroid*>(Java_TabBase_getNativePtr(env, obj));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TabAndroid::TabAndroid(JNIEnv* env, jobject obj)
149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    : weak_java_tab_(env, obj),
150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      session_tab_id_(),
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      synced_tab_delegate_(new browser_sync::SyncedTabDelegateAndroid(this)) {
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Java_TabBase_setNativePtr(env, obj, reinterpret_cast<intptr_t>(this));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TabAndroid::~TabAndroid() {
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (obj.is_null())
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Java_TabBase_clearNativePtr(env, obj.obj());
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int TabAndroid::GetAndroidId() const {
1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
1668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
1678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (obj.is_null())
1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return -1;
1698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return Java_TabBase_getId(env, obj.obj());
1708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)int TabAndroid::GetSyncId() const {
1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (obj.is_null())
1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return 0;
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return Java_TabBase_getSyncId(env, obj.obj());
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 TabAndroid::GetTitle() const {
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (obj.is_null())
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return base::string16();
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return base::android::ConvertJavaStringToUTF16(
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Java_TabBase_getTitle(env, obj.obj()));
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)GURL TabAndroid::GetURL() const {
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (obj.is_null())
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return GURL::EmptyGURL();
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return GURL(base::android::ConvertJavaStringToUTF8(
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      Java_TabBase_getUrl(env, obj.obj())));
1968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool TabAndroid::RestoreIfNeeded() {
1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (obj.is_null())
2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return false;
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return Java_TabBase_restoreIfNeeded(env, obj.obj());
2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)content::ContentViewCore* TabAndroid::GetContentViewCore() const {
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!web_contents())
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return NULL;
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return content::ContentViewCore::FromWebContents(web_contents());
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)Profile* TabAndroid::GetProfile() const {
214424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!web_contents())
215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return NULL;
216424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents()->GetBrowserContext());
218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)browser_sync::SyncedTabDelegate* TabAndroid::GetSyncedTabDelegate() const {
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return synced_tab_delegate_.get();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void TabAndroid::SetSyncId(int sync_id) {
2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_tab_.get(env);
2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  if (obj.is_null())
2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  Java_TabBase_setSyncId(env, obj.obj(), sync_id);
2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
2310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
232424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void TabAndroid::SwapTabContents(content::WebContents* old_contents,
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 content::WebContents* new_contents) {
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We need to notify the native InfobarContainer so infobars can be swapped.
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  InfoBarContainerAndroid* infobar_container =
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      reinterpret_cast<InfoBarContainerAndroid*>(
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          Java_TabBase_getNativeInfoBarContainer(
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              env,
2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              weak_java_tab_.get(env).obj()));
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  InfoBarService* new_infobar_service = new_contents ?
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      InfoBarService::FromWebContents(new_contents) : NULL;
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  infobar_container->ChangeInfoBarService(new_infobar_service);
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Java_TabBase_swapWebContents(
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      env,
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      weak_java_tab_.get(env).obj(),
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      reinterpret_cast<intptr_t>(new_contents));
250424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
251424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void TabAndroid::Observe(int type,
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         const content::NotificationSource& source,
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                         const content::NotificationDetails& details) {
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  switch (type) {
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED: {
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TabSpecificContentSettings* settings =
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          TabSpecificContentSettings::FromWebContents(web_contents());
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (!settings->IsBlockageIndicated(CONTENT_SETTINGS_TYPE_POPUPS)) {
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // TODO(dfalcantara): Create an InfoBarDelegate to keep the
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // PopupBlockedInfoBar logic native-side instead of straddling the JNI
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // boundary.
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        int num_popups = 0;
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PopupBlockerTabHelper* popup_blocker_helper =
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            PopupBlockerTabHelper::FromWebContents(web_contents());
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        if (popup_blocker_helper)
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          num_popups = popup_blocker_helper->GetBlockedPopupsCount();
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (num_popups > 0) {
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          PopupBlockedInfoBarDelegate::Create(
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              InfoBarService::FromWebContents(web_contents()),
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              num_popups);
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        settings->SetBlockageHasBeenIndicated(CONTENT_SETTINGS_TYPE_POPUPS);
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      }
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case chrome::NOTIFICATION_FAVICON_UPDATED:
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Java_TabBase_onFaviconUpdated(env, weak_java_tab_.get(env).obj());
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    default:
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      NOTREACHED() << "Unexpected notification " << type;
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void TabAndroid::InitWebContents(JNIEnv* env,
290424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 jobject obj,
291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 jboolean incognito,
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 jobject jcontent_view_core,
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 jobject jweb_contents_delegate,
294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 jobject jcontext_menu_populator) {
295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::ContentViewCore* content_view_core =
296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      content::ContentViewCore::GetNativeContentViewCore(env,
297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                                         jcontent_view_core);
298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(content_view_core);
299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DCHECK(content_view_core->GetWebContents());
300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  web_contents_.reset(content_view_core->GetWebContents());
302424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  InitTabHelpers(web_contents_.get());
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  session_tab_id_.set_id(
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SessionTabHelper::FromWebContents(web_contents())->session_id().id());
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ContextMenuHelper::FromWebContents(web_contents())->SetPopulator(
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      jcontext_menu_populator);
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  WindowAndroidHelper::FromWebContents(web_contents())->
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      SetWindowAndroid(content_view_core->GetWindowAndroid());
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CoreTabHelper::FromWebContents(web_contents())->set_delegate(this);
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  web_contents_delegate_.reset(
312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      new chrome::android::ChromeWebContentsDelegateAndroid(
313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          env, jweb_contents_delegate));
314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  web_contents_delegate_->LoadProgressChanged(web_contents(), 0);
315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  web_contents()->SetDelegate(web_contents_delegate_.get());
316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  notification_registrar_.Add(
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::Source<content::WebContents>(web_contents()));
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  notification_registrar_.Add(
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_FAVICON_UPDATED,
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::Source<content::WebContents>(web_contents()));
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  synced_tab_delegate_->SetWebContents(web_contents());
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Set the window ID if there is a valid TabModel.
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TabModel* model = TabModelList::GetTabModelWithProfile(GetProfile());
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (model) {
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SessionID window_id;
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    window_id.set_id(model->GetSessionId());
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SessionTabHelper* session_tab_helper =
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        SessionTabHelper::FromWebContents(web_contents());
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    session_tab_helper->SetWindowID(window_id);
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
339424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Verify that the WebContents this tab represents matches the expected
340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // off the record state.
341424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  CHECK_EQ(GetProfile()->IsOffTheRecord(), incognito);
342424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
343424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
344424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)void TabAndroid::DestroyWebContents(JNIEnv* env,
345424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    jobject obj,
346424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    jboolean delete_native) {
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(web_contents());
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  notification_registrar_.Remove(
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::Source<content::WebContents>(web_contents()));
35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  notification_registrar_.Remove(
35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      this,
35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      chrome::NOTIFICATION_FAVICON_UPDATED,
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      content::Source<content::WebContents>(web_contents()));
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
358424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  web_contents()->SetDelegate(NULL);
359424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (delete_native) {
361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    web_contents_.reset();
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    synced_tab_delegate_->ResetWebContents();
363424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  } else {
364424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Release the WebContents so it does not get deleted by the scoped_ptr.
365424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ignore_result(web_contents_.release());
366424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
367424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
368424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
369424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)base::android::ScopedJavaLocalRef<jobject> TabAndroid::GetProfileAndroid(
370424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    JNIEnv* env,
371424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    jobject obj) {
372424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Profile* profile = GetProfile();
373424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!profile)
374424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return base::android::ScopedJavaLocalRef<jobject>();
375424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ProfileAndroid* profile_android = ProfileAndroid::FromProfile(profile);
376424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!profile_android)
377424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return base::android::ScopedJavaLocalRef<jobject>();
378424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
379424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return profile_android->GetJavaObject();
380424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)ToolbarModel::SecurityLevel TabAndroid::GetSecurityLevel(JNIEnv* env,
38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                         jobject obj) {
38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return ToolbarModelImpl::GetSecurityLevelForWebContents(web_contents());
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void TabAndroid::SetActiveNavigationEntryTitleForUrl(JNIEnv* env,
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                     jobject obj,
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                     jstring jurl,
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                                     jstring jtitle) {
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(web_contents());
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (jtitle)
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    title = base::android::ConvertJavaStringToUTF16(env, jtitle);
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string url;
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (jurl)
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    url = base::android::ConvertJavaStringToUTF8(env, jurl);
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::NavigationEntry* entry =
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      web_contents()->GetController().GetVisibleEntry();
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (entry && url == entry->GetVirtualURL().spec())
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    entry->SetTitle(title);
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool TabAndroid::Print(JNIEnv* env, jobject obj) {
408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!web_contents())
409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printing::PrintViewManagerBasic::CreateForWebContents(web_contents());
412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  printing::PrintViewManagerBasic* print_view_manager =
413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      printing::PrintViewManagerBasic::FromWebContents(web_contents());
414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (print_view_manager == NULL)
415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return false;
416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  print_view_manager->PrintNow();
418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return true;
419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool TabAndroid::RegisterTabAndroid(JNIEnv* env) {
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return RegisterNativesImpl(env);
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
424