Add TabHepler in c++ instead of java world

Global desktop mode setting is applied to webcontents only when tab
is created. We can know this by whether checking last committed
entry is null or not.
With this, we don't need to modify Tab.java.
This commit is contained in:
Simon Hong
2019-10-03 06:33:46 +09:00
parent df28319e93
commit 0ee81e2180
15 changed files with 167 additions and 143 deletions
@@ -17,7 +17,6 @@ import org.chromium.chrome.browser.preferences.BraveSearchEngineUtils;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.DesktopModeTabHelper;
/**
* Brave's extension for ChromeActivity
@@ -44,12 +43,6 @@ public abstract class BraveActivity extends ChromeActivity {
@Override
public boolean onMenuOrKeyboardAction(int id, boolean fromMenu) {
if (super.onMenuOrKeyboardAction(id, fromMenu)) {
if (id == R.id.request_desktop_site_id || id == R.id.request_desktop_site_check_id) {
// If user selects desktop site opiton explicitly vi app menu, respect it.
// Current tab will ignore global desktop mode.
ignoreDesktopModeForTab(getActivityTab());
}
return true;
}
@@ -102,13 +95,6 @@ public abstract class BraveActivity extends ChromeActivity {
}
}
private void ignoreDesktopModeForTab(Tab tab) {
assert tab != null;
DesktopModeTabHelper helper = DesktopModeTabHelper.get(tab);
if (helper != null)
helper.ignoreDesktopMode();
}
private boolean isNoRestoreState() {
return ContextUtils.getAppSharedPreferences().getBoolean(PREF_CLOSE_TABS_ON_EXIT, false);
}
@@ -5,19 +5,22 @@
package org.chromium.chrome.browser.preferences.website;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
import org.chromium.chrome.browser.preferences.PreferenceUtils;
import org.chromium.chrome.browser.profiles.Profile;
@JNINamespace("chrome::android")
public class DesktopModePreferences
extends PreferenceFragmentCompat implements Preference.OnPreferenceChangeListener {
public static final String DESKTOP_MODE_KEY = "desktop_mode";
private Profile mProfile;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -26,17 +29,25 @@ public class DesktopModePreferences
ChromeSwitchPreferenceCompat desktopModePref =
(ChromeSwitchPreferenceCompat) findPreference(DESKTOP_MODE_KEY);
desktopModePref.setChecked(
ContextUtils.getAppSharedPreferences().getBoolean(DESKTOP_MODE_KEY, false));
desktopModePref.setChecked(DesktopModePreferencesJni.get().getDesktopModeEnabled(getProfile()));
desktopModePref.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
SharedPreferences.Editor sharedPreferencesEditor =
ContextUtils.getAppSharedPreferences().edit();
sharedPreferencesEditor.putBoolean(DESKTOP_MODE_KEY, (boolean) newValue);
sharedPreferencesEditor.apply();
DesktopModePreferencesJni.get().setDesktopModeEnabled((boolean) newValue, getProfile());
return true;
}
private Profile getProfile() {
if (mProfile == null)
mProfile = Profile.getLastUsedProfile();
return mProfile;
}
@NativeMethods
interface Natives {
void setDesktopModeEnabled(boolean enabled, Profile profile);
boolean getDesktopModeEnabled(Profile profile);
}
}
@@ -1,19 +0,0 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.tab;
import org.chromium.chrome.browser.tab.TabUma.TabCreationState;
/**
* Helper class that initializes various tab UserData objects.
*/
public final class BraveTabHelpers {
private BraveTabHelpers() {}
static void initWebContentsHelpers(Tab tab) {
DesktopModeTabHelper.from(tab);
}
}
@@ -1,85 +0,0 @@
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.chromium.chrome.browser.tab;
import android.content.SharedPreferences;
import android.support.annotation.Nullable;
import org.chromium.base.ContextUtils;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsObserver;
import org.chromium.chrome.browser.preferences.website.DesktopModePreferences;
public class DesktopModeTabHelper extends TabWebContentsUserData {
private static final Class<DesktopModeTabHelper> USER_DATA_KEY = DesktopModeTabHelper.class;
private final boolean mDesktopModeEnabled;
private DesktopModeWebContentsObsever mWebContentsObserver;
private class DesktopModeWebContentsObsever extends WebContentsObserver {
private final DesktopModeTabHelper mHelper;
public DesktopModeWebContentsObsever(WebContents webContents, DesktopModeTabHelper helper) {
super(webContents);
mHelper = helper;
}
@Override
public void navigationEntryCommitted() {
updateDesktopMode();
}
private void updateDesktopMode() {
mWebContents.get().getNavigationController().setUseDesktopUserAgent(
mHelper.mDesktopModeEnabled, false);
}
}
static DesktopModeTabHelper from(Tab tab) {
DesktopModeTabHelper helper = get(tab);
if (helper == null) {
helper = tab.getUserDataHost().setUserData(USER_DATA_KEY, new DesktopModeTabHelper(tab));
}
return helper;
}
@Nullable
public static DesktopModeTabHelper get(Tab tab) {
return tab != null ? tab.getUserDataHost().getUserData(USER_DATA_KEY) : null;
}
private DesktopModeTabHelper(Tab tab) {
super(tab);
// This initial setting will be used during the life time of this tab.
mDesktopModeEnabled = ContextUtils.getAppSharedPreferences().getBoolean(
DesktopModePreferences.DESKTOP_MODE_KEY, false);
}
@Override
public void initWebContents(WebContents webContents) {
assert mWebContentsObserver == null;
mWebContentsObserver = new DesktopModeWebContentsObsever(webContents, this);
}
@Override
public void cleanupWebContents(WebContents webContents) {
if (mWebContentsObserver == null)
return;
mWebContentsObserver.destroy();
mWebContentsObserver = null;
}
public void ignoreDesktopMode() {
if (mWebContentsObserver == null)
return;
// Don't override user agent anymore by initial desktop mode setting after
// user explicitly toggle desktop view mode.
mWebContentsObserver.destroy();
mWebContentsObserver = null;
}
}