// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/android/website_settings_popup_android.h" #include "base/android/jni_android.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/chrome_security_state_model_client.h" #include "chrome/browser/ui/website_settings/website_settings.h" #include "chrome/browser/ui/website_settings/website_settings_ui.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/content_settings_types.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/cert_store.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" #include "grit/generated_resources.h" #include "jni/WebsiteSettingsPopup_jni.h" #include "ui/base/l10n/l10n_util.h" using base::android::ConvertUTF16ToJavaString; using base::android::ConvertUTF8ToJavaString; // static static jlong Init(JNIEnv* env, const JavaParamRef<jclass>& clazz, const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& java_web_contents) { content::WebContents* web_contents = content::WebContents::FromJavaWebContents(java_web_contents); return reinterpret_cast<intptr_t>( new WebsiteSettingsPopupAndroid(env, obj, web_contents)); } WebsiteSettingsPopupAndroid::WebsiteSettingsPopupAndroid( JNIEnv* env, jobject java_website_settings_pop, content::WebContents* web_contents) { // Important to use GetVisibleEntry to match what's showing in the omnibox. content::NavigationEntry* nav_entry = web_contents->GetController().GetVisibleEntry(); if (nav_entry == NULL) return; url_ = nav_entry->GetURL(); popup_jobject_.Reset(env, java_website_settings_pop); ChromeSecurityStateModelClient* security_model_client = ChromeSecurityStateModelClient::FromWebContents(web_contents); DCHECK(security_model_client); presenter_.reset(new WebsiteSettings( this, Profile::FromBrowserContext(web_contents->GetBrowserContext()), TabSpecificContentSettings::FromWebContents(web_contents), web_contents, nav_entry->GetURL(), security_model_client->GetSecurityInfo(), content::CertStore::GetInstance())); } WebsiteSettingsPopupAndroid::~WebsiteSettingsPopupAndroid() {} void WebsiteSettingsPopupAndroid::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) { delete this; } void WebsiteSettingsPopupAndroid::RecordWebsiteSettingsAction( JNIEnv* env, const JavaParamRef<jobject>& obj, jint action) { presenter_->RecordWebsiteSettingsAction( static_cast<WebsiteSettings::WebsiteSettingsAction>(action)); } void WebsiteSettingsPopupAndroid::SetIdentityInfo( const IdentityInfo& identity_info) { JNIEnv* env = base::android::AttachCurrentThread(); Java_WebsiteSettingsPopup_showDialog(env, popup_jobject_.obj()); } void WebsiteSettingsPopupAndroid::SetCookieInfo( const CookieInfoList& cookie_info_list) { NOTIMPLEMENTED(); } void WebsiteSettingsPopupAndroid::SetPermissionInfo( const PermissionInfoList& permission_info_list, const ChosenObjectInfoList& chosen_object_info_list) { // TODO(reillyg): Display the contents of |chosen_object_info_list|. // https://crbug.com/424667. JNIEnv* env = base::android::AttachCurrentThread(); // On Android, we only want to display a subset of the available options in a // particular order, but only if their value is different from the default. std::vector<ContentSettingsType> permissions_to_display; permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_GEOLOCATION); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_NOTIFICATIONS); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_IMAGES); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_JAVASCRIPT); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_POPUPS); permissions_to_display.push_back(CONTENT_SETTINGS_TYPE_KEYGEN); std::map<ContentSettingsType, ContentSetting> user_specified_settings_to_display; for (const auto& permission : permission_info_list) { if (std::find(permissions_to_display.begin(), permissions_to_display.end(), permission.type) != permissions_to_display.end() && permission.setting != CONTENT_SETTING_DEFAULT) { user_specified_settings_to_display[permission.type] = permission.setting; } } for (const auto& permission : permissions_to_display) { if (ContainsKey(user_specified_settings_to_display, permission)) { base::string16 setting_title = WebsiteSettingsUI::PermissionTypeToUIString(permission); Java_WebsiteSettingsPopup_addPermissionSection( env, popup_jobject_.obj(), ConvertUTF16ToJavaString(env, setting_title).obj(), static_cast<jint>(permission), static_cast<jint>(user_specified_settings_to_display[permission])); } } Java_WebsiteSettingsPopup_updatePermissionDisplay(env, popup_jobject_.obj()); } void WebsiteSettingsPopupAndroid::SetSelectedTab( WebsiteSettingsUI::TabId tab_id) { // There's no tab UI on Android - only connection info is shown. NOTIMPLEMENTED(); } // static bool WebsiteSettingsPopupAndroid::RegisterWebsiteSettingsPopupAndroid( JNIEnv* env) { return RegisterNativesImpl(env); }