diff options
Diffstat (limited to 'chromium/weblayer/browser/tab_impl.cc')
-rw-r--r-- | chromium/weblayer/browser/tab_impl.cc | 122 |
1 files changed, 103 insertions, 19 deletions
diff --git a/chromium/weblayer/browser/tab_impl.cc b/chromium/weblayer/browser/tab_impl.cc index 98d19f83b06..9ee00624c5a 100644 --- a/chromium/weblayer/browser/tab_impl.cc +++ b/chromium/weblayer/browser/tab_impl.cc @@ -22,6 +22,7 @@ #include "components/blocked_content/popup_tracker.h" #include "components/captive_portal/core/buildflags.h" #include "components/content_settings/browser/page_specific_content_settings.h" +#include "components/embedder_support/android/util/user_agent_utils.h" #include "components/find_in_page/find_tab_helper.h" #include "components/find_in_page/find_types.h" #include "components/js_injection/browser/js_communication_host.h" @@ -37,8 +38,10 @@ #include "components/webrtc/media_stream_devices_controller.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/context_menu_params.h" #include "content/public/browser/file_select_listener.h" #include "content/public/browser/navigation_controller.h" +#include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_view_host.h" @@ -46,8 +49,8 @@ #include "content/public/browser/renderer_preferences_util.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" +#include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" -#include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #include "third_party/blink/public/mojom/window_features/window_features.mojom.h" #include "ui/base/window_open_disposition.h" #include "weblayer/browser/autofill_client_impl.h" @@ -63,6 +66,7 @@ #include "weblayer/browser/infobar_service.h" #include "weblayer/browser/js_communication/web_message_host_factory_wrapper.h" #include "weblayer/browser/navigation_controller_impl.h" +#include "weblayer/browser/navigation_entry_data.h" #include "weblayer/browser/no_state_prefetch/prerender_tab_helper.h" #include "weblayer/browser/page_load_metrics_initialize.h" #include "weblayer/browser/page_specific_content_settings_delegate.h" @@ -72,6 +76,7 @@ #include "weblayer/browser/popup_navigation_delegate_impl.h" #include "weblayer/browser/profile_impl.h" #include "weblayer/browser/translate_client_impl.h" +#include "weblayer/browser/user_agent.h" #include "weblayer/browser/weblayer_features.h" #include "weblayer/common/isolated_world_ids.h" #include "weblayer/public/fullscreen_delegate.h" @@ -92,6 +97,7 @@ #include "base/trace_event/trace_event.h" #include "components/autofill/android/provider/autofill_provider_android.h" #include "components/browser_ui/sms/android/sms_infobar.h" +#include "components/download/content/public/context_menu_download.h" #include "components/embedder_support/android/contextmenu/context_menu_builder.h" #include "components/embedder_support/android/delegate/color_chooser_android.h" #include "components/javascript_dialogs/tab_modal_dialog_manager.h" // nogncheck @@ -105,6 +111,7 @@ #include "weblayer/browser/javascript_tab_modal_dialog_manager_delegate_android.h" #include "weblayer/browser/js_communication/web_message_host_factory_proxy.h" #include "weblayer/browser/translate_client_impl.h" +#include "weblayer/browser/url_bar/trusted_cdn_observer.h" #include "weblayer/browser/weblayer_factory_impl_android.h" #include "weblayer/browser/webrtc/media_stream_manager.h" #endif @@ -201,7 +208,7 @@ void ConvertToJavaBitmapBackgroundThread( base::OnceCallback<void(const ScopedJavaGlobalRef<jobject>&)> callback) { // Make sure to only pass ScopedJavaGlobalRef between threads. ScopedJavaGlobalRef<jobject> java_bitmap = ScopedJavaGlobalRef<jobject>( - gfx::ConvertToJavaBitmap(&bitmap, gfx::OomBehavior::kReturnNullOnOom)); + gfx::ConvertToJavaBitmap(bitmap, gfx::OomBehavior::kReturnNullOnOom)); content::GetUIThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(std::move(callback), std::move(java_bitmap))); } @@ -256,6 +263,15 @@ static ScopedJavaLocalRef<jobject> JNI_TabImpl_FromWebContents( return nullptr; } +static void JNI_TabImpl_DestroyContextMenuParams( + JNIEnv* env, + jlong native_context_menu_params) { + // Note: this runs on the finalizer thread which isn't the UI thread. + auto* context_menu_params = + reinterpret_cast<content::ContextMenuParams*>(native_context_menu_params); + delete context_menu_params; +} + TabImpl::TabImpl(ProfileImpl* profile, const JavaParamRef<jobject>& java_impl, std::unique_ptr<content::WebContents> web_contents) @@ -281,12 +297,6 @@ TabImpl::TabImpl(ProfileImpl* profile, // notifying weblayer observers of changes. FaviconTabHelper::CreateForWebContents(web_contents_.get()); - // By default renderer initiated navigations inherit the user-agent override - // of the current NavigationEntry. For WebLayer, the user-agent override is - // set on a per NavigationEntry entry basis. - web_contents_->SetRendererInitiatedUserAgentOverrideOption( - content::NavigationController::UA_OVERRIDE_FALSE); - UpdateRendererPrefs(false); locale_change_subscription_ = i18n::RegisterLocaleChangeCallback(base::BindRepeating( @@ -301,10 +311,6 @@ TabImpl::TabImpl(ProfileImpl* profile, navigation_controller_ = std::make_unique<NavigationControllerImpl>(this); -#if defined(OS_ANDROID) - InfoBarService::CreateForWebContents(web_contents_.get()); -#endif - find_in_page::FindTabHelper::CreateForWebContents(web_contents_.get()); GetFindTabHelper()->AddObserver(this); @@ -341,6 +347,8 @@ TabImpl::TabImpl(ProfileImpl* profile, browser_controls_navigation_state_handler_ = std::make_unique<BrowserControlsNavigationStateHandler>( web_contents_.get(), this); + + TrustedCDNObserver::CreateForWebContents(web_contents_.get()); #endif #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) @@ -410,6 +418,10 @@ void TabImpl::RemoveDataObserver(DataObserver* observer) { data_observers_.RemoveObserver(observer); } +Browser* TabImpl::GetBrowser() { + return browser_; +} + void TabImpl::SetErrorPageDelegate(ErrorPageDelegate* delegate) { error_page_delegate_ = delegate; } @@ -543,7 +555,8 @@ void TabImpl::ShowContextMenu(const content::ContextMenuParams& params) { #if defined(OS_ANDROID) Java_TabImpl_showContextMenu( base::android::AttachCurrentThread(), java_impl_, - context_menu::BuildJavaContextMenuParams(params)); + context_menu::BuildJavaContextMenuParams(params), + reinterpret_cast<jlong>(new content::ContextMenuParams(params))); #endif } @@ -795,6 +808,58 @@ void TabImpl::SetTranslateTargetLanguage( translate_manager->SetPredefinedTargetLanguage( base::android::ConvertJavaStringToUTF8(env, translate_target_lang)); } + +void TabImpl::SetDesktopUserAgentEnabled(JNIEnv* env, jboolean enable) { + if (desktop_user_agent_enabled_ == enable) + return; + + desktop_user_agent_enabled_ = enable; + + // Reset state that an earlier call to Navigation::SetUserAgentString() + // could have modified. + embedder_support::SetDesktopUserAgentOverride(web_contents_.get(), + GetUserAgentMetadata()); + web_contents_->SetRendererInitiatedUserAgentOverrideOption( + content::NavigationController::UA_OVERRIDE_INHERIT); + + content::NavigationEntry* entry = + web_contents_->GetController().GetLastCommittedEntry(); + if (!entry) + return; + + entry->SetIsOverridingUserAgent(enable); + web_contents_->NotifyPreferencesChanged(); + web_contents_->GetController().Reload( + content::ReloadType::ORIGINAL_REQUEST_URL, true); +} + +jboolean TabImpl::IsDesktopUserAgentEnabled(JNIEnv* env) { + auto* entry = web_contents_->GetController().GetLastCommittedEntry(); + if (!entry) + return false; + + // The same user agent override mechanism is used for per-navigation user + // agent and desktop mode. Make sure not to return desktop mode for + // navigation entries which used a per-navigation user agent. + auto* entry_data = NavigationEntryData::Get(entry); + if (entry_data && entry_data->per_navigation_user_agent_override()) + return false; + + return entry->GetIsOverridingUserAgent(); +} + +void TabImpl::Download(JNIEnv* env, jlong native_context_menu_params) { + auto* context_menu_params = + reinterpret_cast<content::ContextMenuParams*>(native_context_menu_params); + + bool is_link = context_menu_params->media_type != + blink::ContextMenuDataMediaType::kImage && + context_menu_params->media_type != + blink::ContextMenuDataMediaType::kVideo; + + download::CreateContextMenuDownload(web_contents_.get(), *context_menu_params, + std::string(), is_link); +} #endif // OS_ANDROID content::WebContents* TabImpl::OpenURLFromTab( @@ -975,10 +1040,6 @@ bool TabImpl::OnlyExpandTopControlsAtPageTop() { #endif } -bool TabImpl::EmbedsFullscreenWidget() { - return true; -} - void TabImpl::RequestMediaAccessPermission( content::WebContents* web_contents, const content::MediaStreamRequest& request, @@ -1171,6 +1232,30 @@ void TabImpl::OnUpdateBrowserControlsStateBecauseOfProcessSwitch( // bounce around. UpdateBrowserControlsState(content::BROWSER_CONTROLS_STATE_SHOWN, false); } else { + if (did_commit && current_browser_controls_visibility_constraint_ == + content::BROWSER_CONTROLS_STATE_BOTH) { + // If the current state is BROWSER_CONTROLS_STATE_BOTH, then + // TabImpl::UpdateBrowserControlsState() is going to call + // WebContents::UpdateBrowserControlsState() with both current and + // constraints set to BROWSER_CONTROLS_STATE_BOTH. cc does + // nothing in this case. During a navigation the top-view needs to be + // shown. To force the top-view to show, supply + // BROWSER_CONTROLS_STATE_SHOWN. This path is only hit if top-view + // is configured to only-expand-at-top, as in this case the top-view isn't + // forced shown during a page load. + // + // It's entirely possible the scroll offset is changed as part of the + // loading process (such as happens with back/forward navigation or + // links part way down a page). Trying to detect this and compensate + // here is likely to be racy, so the top-view is always shown. + const bool animate = + !base::FeatureList::IsEnabled(kImmediatelyHideBrowserControlsForTest); + web_contents_->GetMainFrame()->UpdateBrowserControlsState( + content::BROWSER_CONTROLS_STATE_BOTH, + content::BROWSER_CONTROLS_STATE_SHOWN, animate); + // This falls through to call UpdateBrowserControlsState() again to + // ensure the constraint is set back to BOTH. + } UpdateBrowserControlsState( content::BROWSER_CONTROLS_STATE_BOTH, current_browser_controls_visibility_constraint_ != @@ -1199,8 +1284,7 @@ void TabImpl::OnExitFullscreen() { } void TabImpl::UpdateRendererPrefs(bool should_sync_prefs) { - blink::mojom::RendererPreferences* prefs = - web_contents_->GetMutableRendererPrefs(); + blink::RendererPreferences* prefs = web_contents_->GetMutableRendererPrefs(); content::UpdateFontRendererPreferencesFromSystemSettings(prefs); prefs->accept_languages = i18n::GetAcceptLangs(); if (should_sync_prefs) |