diff --git a/build/patches/Add-bookmark-import-export-actions.patch b/build/patches/Add-bookmark-import-export-actions.patch index 3075ca1a..5758cc12 100644 --- a/build/patches/Add-bookmark-import-export-actions.patch +++ b/build/patches/Add-bookmark-import-export-actions.patch @@ -14,15 +14,15 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html chrome/android/java/AndroidManifest.xml | 1 - .../menu/bookmark_toolbar_menu_improved.xml | 14 + .../browser/TabbedModeTabDelegateFactory.java | 5 +- - .../app/bookmarks/BookmarkActivity.java | 32 ++ + .../app/bookmarks/BookmarkActivity.java | 31 ++ .../native_page/NativePageFactory.java | 9 +- chrome/browser/BUILD.gn | 11 +- - .../bookmarks/android/bookmark_bridge.cc | 267 ++++++++++++++++ + .../bookmarks/android/bookmark_bridge.cc | 267 +++++++++++++++++ .../bookmarks/android/bookmark_bridge.h | 30 +- - .../browser/bookmarks/BookmarkBridge.java | 285 ++++++++++++++++++ + .../browser/bookmarks/BookmarkBridge.java | 39 +++ .../browser/bookmarks/BookmarkDelegate.java | 10 + .../bookmarks/BookmarkManagerCoordinator.java | 9 + - .../bookmarks/BookmarkManagerMediator.java | 23 ++ + .../bookmarks/BookmarkManagerMediator.java | 283 ++++++++++++++++++ .../browser/bookmarks/BookmarkPage.java | 9 +- .../browser/bookmarks/BookmarkToolbar.java | 28 ++ .../bookmarks/BookmarkToolbarMediator.java | 4 + @@ -52,7 +52,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html ui/shell_dialogs/select_file_dialog_linux.cc | 4 + ui/shell_dialogs/select_file_dialog_linux.h | 2 + ui/shell_dialogs/select_file_dialog_win.cc | 5 + - 41 files changed, 888 insertions(+), 29 deletions(-) + 41 files changed, 901 insertions(+), 29 deletions(-) create mode 100644 cromite_flags/chrome/browser/about_flags_cc/add-bookmark-import-export-actions.inc create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/add-bookmark-import-export-actions.inc create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_h/add-bookmark-import-export-actions.inc @@ -124,7 +124,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDe diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java --- a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkActivity.java -@@ -28,6 +28,9 @@ import org.chromium.components.embedder_support.util.UrlConstants; +@@ -7,6 +7,7 @@ package org.chromium.chrome.browser.app.bookmarks; + import android.content.ComponentName; + import android.content.Intent; + import android.text.TextUtils; ++import android.os.Bundle; + + import org.chromium.base.IntentUtils; + import org.chromium.build.annotations.Nullable; +@@ -28,6 +29,9 @@ import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType; @@ -134,17 +142,17 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B /** * The activity that displays the bookmark UI on the phone. It keeps a {@link * BookmarkManagerCoordinator} inside of it and creates a snackbar manager. This activity should -@@ -38,6 +41,9 @@ public class BookmarkActivity extends SnackbarActivity { - public static final int EDIT_BOOKMARK_REQUEST_CODE = 14; - public static final String INTENT_VISIT_BOOKMARK_ID = "BookmarkEditActivity.VisitBookmarkId"; +@@ -41,6 +45,9 @@ public class BookmarkActivity extends SnackbarActivity { + private @Nullable BookmarkManagerCoordinator mBookmarkManagerCoordinator; + private @Nullable BookmarkOpener mBookmarkOpener; + private ActivityWindowAndroid mWindowAndroid; + private IntentRequestTracker mIntentRequestTracker; + - private @Nullable BookmarkManagerCoordinator mBookmarkManagerCoordinator; - private @Nullable BookmarkOpener mBookmarkOpener; - -@@ -70,8 +76,25 @@ public class BookmarkActivity extends SnackbarActivity { + @Override + protected void onProfileAvailable(Profile profile) { + super.onProfileAvailable(profile); +@@ -70,6 +77,14 @@ public class BookmarkActivity extends SnackbarActivity { getOnBackPressedDispatcher(), mBookmarkManagerCoordinator, SecondaryActivity.BOOKMARK); @@ -154,23 +162,12 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B + mWindowAndroid = new ActivityWindowAndroid(this, listenToActivityState, + mIntentRequestTracker, /*InsetObserver*/ null, + /* trackOcclusion= */ true); -+ mWindowAndroid.getIntentRequestTracker().restoreInstanceState(savedInstanceState); + mBookmarkManagerCoordinator.setWindow(mWindowAndroid, -+ new ModalDialogManager( -+ new AppModalPresenter(this), ModalDialogManager.ModalDialogType.APP)); ++ getModalDialogManagerSupplier().get()); } -+ @Override -+ protected void onSaveInstanceState(Bundle outState) { -+ super.onSaveInstanceState(outState); -+ -+ mWindowAndroid.getIntentRequestTracker().saveInstanceState(outState); -+ } -+ @Override - protected void onDestroy() { - super.onDestroy(); -@@ -89,6 +112,7 @@ public class BookmarkActivity extends SnackbarActivity { +@@ -89,6 +104,7 @@ public class BookmarkActivity extends SnackbarActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -178,10 +175,17 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B if (requestCode == EDIT_BOOKMARK_REQUEST_CODE && resultCode == RESULT_OK) { BookmarkId bookmarkId = BookmarkId.getBookmarkIdFromString( -@@ -102,6 +126,14 @@ public class BookmarkActivity extends SnackbarActivity { - return new ModalDialogManager(new AppModalPresenter(this), ModalDialogType.APP); +@@ -97,6 +113,21 @@ public class BookmarkActivity extends SnackbarActivity { + } } ++ @Override ++ protected void onSaveInstanceState(Bundle outState) { ++ super.onSaveInstanceState(outState); ++ ++ mWindowAndroid.getIntentRequestTracker().saveInstanceState(outState); ++ } ++ + @Override + public void onRequestPermissionsResult( + int requestCode, String[] permissions, int[] grantResults) { @@ -190,9 +194,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/B + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + - /** - * @return The {@link BookmarkManagerCoordinator} for testing purposes. - */ + @Override + protected ModalDialogManager createModalDialogManager() { + return new ModalDialogManager(new AppModalPresenter(this), ModalDialogType.APP); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java --- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java @@ -665,302 +669,63 @@ diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.h b/chrome/browser diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java -@@ -36,6 +36,48 @@ import org.chromium.url.GURL; +@@ -36,6 +36,9 @@ import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; -+import android.app.Activity; -+import android.content.Intent; -+import android.content.Context; -+import android.content.pm.PackageManager; -+import android.content.DialogInterface; -+import android.content.res.Resources; -+import android.content.ContentResolver; -+import android.net.Uri; -+import android.provider.Browser; -+import android.provider.DocumentsContract; -+import android.Manifest.permission; -+import android.view.View; -+import android.view.LayoutInflater; -+ -+import androidx.appcompat.app.AlertDialog; -+import android.os.Build; -+ -+import java.io.File; -+ -+import org.chromium.base.ContentUriUtils; -+import org.chromium.base.shared_preferences.SharedPreferencesManager; -+import org.chromium.base.task.AsyncTask; -+import org.chromium.chrome.R; -+import org.chromium.chrome.browser.document.ChromeLauncherActivity; -+import org.chromium.chrome.browser.IntentHandler; -+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; -+import org.chromium.chrome.browser.download.DownloadLocationDialogType; -+import org.chromium.chrome.browser.download.settings.DownloadLocationHelperImpl; -+import org.chromium.chrome.browser.download.dialogs.DownloadLocationDialogController; -+import org.chromium.chrome.browser.download.dialogs.DownloadLocationDialogCoordinator; -+import org.chromium.chrome.browser.download.dialogs.DownloadLocationCustomView; -+import org.chromium.chrome.browser.download.DirectoryOption; -+import org.chromium.chrome.browser.profiles.ProfileManager; -+import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; -+import org.chromium.chrome.browser.flags.ChromeFeatureList; -+import org.chromium.ui.base.PageTransition; +import org.chromium.ui.base.WindowAndroid; -+import org.chromium.ui.modelutil.PropertyModel; -+import org.chromium.ui.modaldialog.ModalDialogManager; -+import org.chromium.ui.modaldialog.ModalDialogProperties; -+import org.chromium.ui.modaldialog.DialogDismissalCause; ++import java.util.function.BiConsumer; + /** * Provides the communication channel for Android to fetch and manipulate the bookmark model stored * in native. -@@ -498,6 +540,245 @@ class BookmarkBridge { +@@ -52,6 +55,9 @@ class BookmarkBridge { + private boolean mIsNativeBookmarkModelLoaded; + private boolean mInitializedPartnerBookmarks; + ++ private static final BiConsumer NOOP = (success, bookmarksPath) -> {}; ++ private BiConsumer mOnExportedFunction = NOOP; ++ + // Lazily set pseudo-constants. These should never change at runtime. Used to avoid crossing + // JNI to fetch information. + private @Nullable BookmarkId mRootFolderId; +@@ -498,6 +504,35 @@ class BookmarkBridge { .getTotalBookmarkCount(mNativeBookmarkBridge, id.getId(), id.getType()); } -+ @CalledByNative -+ public void bookmarksExported(WindowAndroid window, String bookmarksPath, boolean success) { -+ Uri uri = Uri.parse(bookmarksPath); -+ -+ if (success == false) { -+ ((Activity)window.getContext().get()).runOnUiThread(new Runnable() { -+ public void run() { -+ window.showError(R.string.saving_file_error); -+ } -+ }); -+ } else { -+ SharedPreferencesManager sharedPrefs = ChromeSharedPreferences.getInstance(); -+ sharedPrefs.writeString(ChromePreferenceKeys.BOOKMARKS_LAST_EXPORT_URI, bookmarksPath); -+ -+ Context context = ContextUtils.getApplicationContext(); -+ -+ Intent intent = new Intent(Intent.ACTION_VIEW, -+ ContentUriUtils.isContentUri(bookmarksPath) ? -+ Uri.parse(bookmarksPath) : Uri.parse("file://" + bookmarksPath)); -+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, -+ context.getPackageName()); -+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -+ intent.putExtra(IntentHandler.EXTRA_PAGE_TRANSITION_TYPE, PageTransition.AUTO_BOOKMARK); -+ -+ // If the bookmark manager is shown in a tab on a phone (rather than in a separate -+ // activity) the component name may be null. Send the intent through -+ // ChromeLauncherActivity instead to avoid crashing. See crbug.com/615012. -+ intent.setClass(context, ChromeLauncherActivity.class); -+ -+ IntentHandler.startActivityForTrustedIntent(intent); -+ } -+ } -+ + /** + * Import bookmarks from a selected file. + * @param window The current window of the bookmarks activity or page. + */ + public void importBookmarks(WindowAndroid window) { + assert mIsNativeBookmarkModelLoaded; -+ BookmarkBridgeJni.get().importBookmarks(mNativeBookmarkBridge, BookmarkBridge.this, window); ++ BookmarkBridgeJni.get().importBookmarks(mNativeBookmarkBridge, ++ BookmarkBridge.this, window); + } + + /** + * Export bookmarks to a path selected by the user. + * @param window The current window of the bookmarks activity or page. + */ -+ public void exportBookmarks(WindowAndroid window, ModalDialogManager modalDialogManager) { ++ public void exportBookmarks(WindowAndroid window, String exportPath, ++ BiConsumer onExportedFunction) { + assert mIsNativeBookmarkModelLoaded; -+ if (ChromeFeatureList.isEnabled(ChromeFeatureList.BOOKMARKS_EXPORT_USESAF) || -+ Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) -+ exportBookmarksImplUseSaf(window); -+ else -+ exportBookmarksImplUseFile(window, modalDialogManager); ++ mOnExportedFunction = onExportedFunction; ++ BookmarkBridgeJni.get().exportBookmarks(mNativeBookmarkBridge, ++ BookmarkBridge.this, window, exportPath); + } + -+ private void exportBookmarksImplUseSaf(WindowAndroid window) { -+ Context context = window.getContext().get(); -+ -+ // standard name for boorkmark file -+ final String standardBoorkmarkName = "bookmarks.html"; -+ -+ // use the fileSelector and saf asking user for the file -+ Intent fileSelector = new Intent(Intent.ACTION_CREATE_DOCUMENT); -+ fileSelector.addCategory(Intent.CATEGORY_OPENABLE); -+ fileSelector.setType("text/html"); -+ fileSelector.putExtra(Intent.EXTRA_TITLE, standardBoorkmarkName); -+ fileSelector.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | -+ Intent.FLAG_GRANT_READ_URI_PERMISSION | -+ Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); -+ -+ // get last exported uri path, if any -+ SharedPreferencesManager sharedPrefs = ChromeSharedPreferences.getInstance(); -+ String bookmarksPath = sharedPrefs.readString(ChromePreferenceKeys.BOOKMARKS_LAST_EXPORT_URI, standardBoorkmarkName); -+ Uri lastSelectedUri = Uri.parse(bookmarksPath); -+ -+ // prepare delegate for file selector -+ DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() { -+ @Override -+ public void onClick(DialogInterface dialog, int button) { -+ if (button == AlertDialog.BUTTON_NEGATIVE) { -+ window.showIntent(fileSelector, -+ new WindowAndroid.IntentCallback() { -+ @Override -+ public void onIntentCompleted(int resultCode, Intent data) { -+ if (data == null) return; -+ Uri filePath = data.getData(); -+ doExportBookmarksImpl(window, filePath); -+ } -+ }, -+ null); -+ } else { -+ if (dialog!=null) dialog.dismiss(); -+ doExportBookmarksImpl(window, lastSelectedUri); -+ } -+ } -+ }; -+ -+ // as a workaround for https://issuetracker.google.com/issues/37136466 -+ // ask to overwrite if is a valid uri and the file is present -+ if (DocumentsContract.isDocumentUri(context, lastSelectedUri)) { -+ AsyncTask checkUriTask = new AsyncTask() { -+ boolean uriExists = false; -+ String actualFilePath = null; -+ -+ @Override -+ protected Void doInBackground() { -+ uriExists = ContentUriUtils.contentUriExists(lastSelectedUri.toString()); -+ if (uriExists) { -+ actualFilePath = ContentUriUtils.getFilePathFromContentUri(lastSelectedUri); -+ // get real actual file name on disk -+ if (actualFilePath==null) actualFilePath = lastSelectedUri.toString(); -+ // set file name to last exported file name -+ fileSelector.putExtra(Intent.EXTRA_TITLE, -+ ContentUriUtils.getDisplayName(lastSelectedUri, context, -+ DocumentsContract.Document.COLUMN_DISPLAY_NAME)); -+ } -+ return null; -+ } -+ -+ @Override -+ protected void onPostExecute(Void result) { -+ // check for permissions -+ if (uriExists) { -+ AlertDialog.Builder alert = -+ new AlertDialog.Builder(context, R.style.ThemeOverlay_BrowserUI_AlertDialog); -+ AlertDialog alertDialog = -+ alert.setTitle(R.string.export_bookmarks_alert_title) -+ .setMessage(context.getString(R.string.export_bookmarks_alert_message, actualFilePath)) -+ .setPositiveButton( -+ R.string.export_bookmarks_alert_message_yes, onClickListener) -+ .setNegativeButton(R.string.export_bookmarks_alert_message_no, onClickListener) -+ .create(); -+ alertDialog.getDelegate().setHandleNativeActionModesEnabled(false); -+ -+ // show dialog asking for overwrite -+ alertDialog.show(); -+ return; -+ } else { -+ onClickListener.onClick(null, AlertDialog.BUTTON_NEGATIVE); -+ } -+ } -+ }; -+ checkUriTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); -+ return; -+ } -+ -+ // actually open the file selector -+ onClickListener.onClick(null, AlertDialog.BUTTON_NEGATIVE); -+ } -+ -+ private void doExportBookmarksImpl(WindowAndroid window, Uri filePath) { -+ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver(); -+ // since we want to persist the uri in settings, ask for persistable permissions -+ resolver.takePersistableUriPermission(filePath, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | -+ Intent.FLAG_GRANT_READ_URI_PERMISSION); -+ -+ BookmarkBridgeJni.get().exportBookmarks(mNativeBookmarkBridge, BookmarkBridge.this, -+ window, filePath.toString()); -+ } -+ -+ private void exportBookmarksImplUseFile(WindowAndroid window, ModalDialogManager modalDialogManager) { -+ Context context = window.getContext().get(); -+ -+ // standard name for boorkmark file -+ final String standardBoorkmarkName = "bookmarks.html"; -+ -+ // use the download ui and standard file saving -+ DownloadLocationDialogController controller = new DownloadLocationDialogController() { -+ @Override -+ public void onDownloadLocationDialogComplete(String returnedPath) {} -+ -+ @Override -+ public void onDownloadLocationDialogCanceled() {} -+ }; -+ -+ DownloadLocationDialogCoordinator dialog = new DownloadLocationDialogCoordinator() { -+ @Override -+ protected void onDirectoryOptionsRetrieved(ArrayList dirs) { -+ if (mDialogModel != null) return; -+ -+ // Actually show the dialog. -+ mCustomView = (DownloadLocationCustomView) LayoutInflater.from(context).inflate( -+ R.layout.download_location_dialog, null); -+ mCustomView.initialize(DownloadLocationDialogType.DEFAULT, /*totalBytes*/ 0, -+ (isChecked) -> {}, -+ new DownloadLocationHelperImpl(mProfile)); -+ mCustomView.setTitle(context.getString(R.string.export_bookmarks_alert_title)); -+ mCustomView.setFileName(standardBoorkmarkName); -+ mCustomView.mDontShowAgain.setVisibility(View.GONE); -+ -+ Resources resources = context.getResources(); -+ mDialogModel = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) -+ .with(ModalDialogProperties.CONTROLLER, this) -+ .with(ModalDialogProperties.CUSTOM_VIEW, mCustomView) -+ .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources, -+ R.string.export_bookmarks) -+ .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, resources, -+ R.string.cancel) -+ .build(); -+ -+ mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.APP); -+ } -+ -+ @Override -+ public void onDismiss(PropertyModel model, int dismissalCause) { -+ switch (dismissalCause) { -+ case DialogDismissalCause.POSITIVE_BUTTON_CLICKED: -+ { -+ String fileName = mCustomView.getFileName(); -+ String directory = mCustomView.getDirectoryOption().location; -+ if (fileName != null && directory != null) { -+ File file = new File(directory, fileName); -+ -+ if (window.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) { -+ BookmarkBridgeJni.get().exportBookmarks(mNativeBookmarkBridge, -+ BookmarkBridge.this, window, file.getPath()); -+ } else { -+ String[] requestPermissions = new String[] {permission.WRITE_EXTERNAL_STORAGE}; -+ window.requestPermissions(requestPermissions, (permissions, grantResults) -> { -+ if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { -+ BookmarkBridgeJni.get().exportBookmarks(mNativeBookmarkBridge, -+ BookmarkBridge.this, window, file.getPath()); -+ } -+ }); -+ }; -+ } -+ } -+ break; -+ } -+ mDialogModel = null; -+ mCustomView = null; -+ } -+ }; -+ dialog.initialize(controller); -+ dialog.showDialog(context, modalDialogManager, /*totalBytes*/ 0, -+ DownloadLocationDialogType.DEFAULT, /*suggestedPath*/ "", -+ ProfileManager.getLastUsedRegularProfile()); ++ @CalledByNative ++ public void bookmarksExported(WindowAndroid window, String bookmarksPath, boolean success) { ++ BiConsumer action = mOnExportedFunction ++ .andThen((x, y) -> mOnExportedFunction = NOOP); ++ action.accept(success, bookmarksPath); + } + /** * Synchronously gets a list of bookmarks that match the specified search query. * -@@ -1120,6 +1401,10 @@ class BookmarkBridge { +@@ -1120,6 +1155,10 @@ class BookmarkBridge { void getChildIds( long nativeBookmarkBridge, long id, int type, List bookmarksList); @@ -1029,7 +794,55 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows import org.chromium.ui.accessibility.AccessibilityState; import org.chromium.ui.listmenu.ListMenu; import org.chromium.ui.listmenu.ListMenuItemProperties; -@@ -84,6 +86,9 @@ class BookmarkManagerMediator +@@ -75,6 +77,47 @@ import java.util.function.BooleanSupplier; + import java.util.function.Consumer; + import java.util.function.Predicate; + ++import android.content.Intent; ++import android.content.pm.PackageManager; ++import android.content.DialogInterface; ++import android.content.res.Resources; ++import android.content.ContentResolver; ++import android.net.Uri; ++import android.provider.Browser; ++import android.provider.DocumentsContract; ++import android.Manifest.permission; ++import android.view.View; ++import android.view.LayoutInflater; ++ ++import androidx.appcompat.app.AlertDialog; ++import android.os.Build; ++ ++import java.io.File; ++ ++import org.chromium.base.ContextUtils; ++import org.chromium.base.ContentUriUtils; ++import org.chromium.base.shared_preferences.SharedPreferencesManager; ++import org.chromium.base.task.AsyncTask; ++import org.chromium.chrome.R; ++import org.chromium.chrome.browser.document.ChromeLauncherActivity; ++import org.chromium.chrome.browser.IntentHandler; ++import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; ++import org.chromium.chrome.browser.download.DownloadLocationDialogType; ++import org.chromium.chrome.browser.download.settings.DownloadLocationHelperImpl; ++import org.chromium.chrome.browser.download.dialogs.DownloadLocationDialogController; ++import org.chromium.chrome.browser.download.dialogs.DownloadLocationDialogCoordinator; ++import org.chromium.chrome.browser.download.dialogs.DownloadLocationCustomView; ++import org.chromium.chrome.browser.download.DirectoryOption; ++import org.chromium.chrome.browser.profiles.ProfileManager; ++import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; ++import org.chromium.chrome.browser.flags.ChromeFeatureList; ++import org.chromium.ui.base.PageTransition; ++import org.chromium.ui.base.WindowAndroid; ++import org.chromium.ui.modelutil.PropertyModel; ++import org.chromium.ui.modaldialog.ModalDialogManager; ++import org.chromium.ui.modaldialog.ModalDialogProperties; ++import org.chromium.ui.modaldialog.DialogDismissalCause; ++ + /** Responsible for BookmarkManager business logic. */ + // TODO(crbug.com/40256938): Remove BookmarkDelegate if possible. + class BookmarkManagerMediator +@@ -84,6 +127,9 @@ class BookmarkManagerMediator private static boolean sPreventLoadingForTesting; @@ -1039,7 +852,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows /** Keeps track of whether drag is enabled / active for bookmark lists. */ private class BookmarkDragStateDelegate implements DragStateDelegate { private BookmarkDelegate mBookmarkDelegate; -@@ -573,6 +578,14 @@ class BookmarkManagerMediator +@@ -573,6 +619,14 @@ class BookmarkManagerMediator mNativePage = nativePage; } @@ -1054,7 +867,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows /** See BookmarkManager(Coordinator)#updateForUrl */ void updateForUrl(String url) { // Bookmark model is null if the manager has been destroyed. -@@ -748,6 +761,16 @@ class BookmarkManagerMediator +@@ -748,6 +802,235 @@ class BookmarkManagerMediator } } @@ -1065,7 +878,226 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows + + @Override + public void exportBookmarks() { -+ mBookmarkModel.exportBookmarks(mWindowAndroid, mModalDialogManager); ++ if (ChromeFeatureList.isEnabled(ChromeFeatureList.BOOKMARKS_EXPORT_USESAF) || ++ Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) { ++ exportBookmarksImplUseSaf(); ++ } else { ++ exportBookmarksImplUseFile(); ++ } ++ } ++ ++ private void exportBookmarksImplUseSaf() { ++ Context context = mWindowAndroid.getContext().get(); ++ ++ // standard name for boorkmark file ++ final String standardBoorkmarkName = "bookmarks.html"; ++ ++ // use the fileSelector and saf asking user for the file ++ Intent fileSelector = new Intent(Intent.ACTION_CREATE_DOCUMENT); ++ fileSelector.addCategory(Intent.CATEGORY_OPENABLE); ++ fileSelector.setType("text/html"); ++ fileSelector.putExtra(Intent.EXTRA_TITLE, standardBoorkmarkName); ++ fileSelector.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | ++ Intent.FLAG_GRANT_READ_URI_PERMISSION | ++ Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); ++ ++ // get last exported uri path, if any ++ SharedPreferencesManager sharedPrefs = ChromeSharedPreferences.getInstance(); ++ String bookmarksPath = sharedPrefs.readString(ChromePreferenceKeys.BOOKMARKS_LAST_EXPORT_URI, standardBoorkmarkName); ++ Uri lastSelectedUri = Uri.parse(bookmarksPath); ++ ++ // prepare delegate for file selector ++ DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() { ++ @Override ++ public void onClick(DialogInterface dialog, int button) { ++ if (button == AlertDialog.BUTTON_NEGATIVE) { ++ mWindowAndroid.showIntent(fileSelector, ++ new WindowAndroid.IntentCallback() { ++ @Override ++ public void onIntentCompleted(int resultCode, Intent data) { ++ if (data == null) return; ++ Uri filePath = data.getData(); ++ doExportBookmarksImpl(filePath); ++ } ++ }, ++ null); ++ } else { ++ if (dialog!=null) dialog.dismiss(); ++ doExportBookmarksImpl(lastSelectedUri); ++ } ++ } ++ }; ++ ++ // as a workaround for https://issuetracker.google.com/issues/37136466 ++ // ask to overwrite if is a valid uri and the file is present ++ if (DocumentsContract.isDocumentUri(context, lastSelectedUri)) { ++ AsyncTask checkUriTask = new AsyncTask() { ++ boolean uriExists = false; ++ String actualFilePath = null; ++ ++ @Override ++ protected Void doInBackground() { ++ uriExists = ContentUriUtils.contentUriExists(lastSelectedUri.toString()); ++ if (uriExists) { ++ actualFilePath = ContentUriUtils.getFilePathFromContentUri(lastSelectedUri); ++ // get real actual file name on disk ++ if (actualFilePath==null) actualFilePath = lastSelectedUri.toString(); ++ // set file name to last exported file name ++ fileSelector.putExtra(Intent.EXTRA_TITLE, ++ ContentUriUtils.getDisplayName(lastSelectedUri, context, ++ DocumentsContract.Document.COLUMN_DISPLAY_NAME)); ++ } ++ return null; ++ } ++ ++ @Override ++ protected void onPostExecute(Void result) { ++ // check for permissions ++ if (uriExists) { ++ AlertDialog.Builder alert = ++ new AlertDialog.Builder(context, R.style.ThemeOverlay_BrowserUI_AlertDialog); ++ AlertDialog alertDialog = ++ alert.setTitle(R.string.export_bookmarks_alert_title) ++ .setMessage(context.getString(R.string.export_bookmarks_alert_message, actualFilePath)) ++ .setPositiveButton( ++ R.string.export_bookmarks_alert_message_yes, onClickListener) ++ .setNegativeButton(R.string.export_bookmarks_alert_message_no, onClickListener) ++ .create(); ++ alertDialog.getDelegate().setHandleNativeActionModesEnabled(false); ++ ++ // show dialog asking for overwrite ++ alertDialog.show(); ++ return; ++ } else { ++ onClickListener.onClick(null, AlertDialog.BUTTON_NEGATIVE); ++ } ++ } ++ }; ++ checkUriTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); ++ return; ++ } ++ ++ // actually open the file selector ++ onClickListener.onClick(null, AlertDialog.BUTTON_NEGATIVE); ++ } ++ ++ private void exportBookmarksImplUseFile() { ++ Context context = mWindowAndroid.getContext().get(); ++ ++ // standard name for boorkmark file ++ final String standardBoorkmarkName = "bookmarks.html"; ++ ++ // use the download ui and standard file saving ++ DownloadLocationDialogController controller = new DownloadLocationDialogController() { ++ @Override ++ public void onDownloadLocationDialogComplete(String returnedPath) {} ++ ++ @Override ++ public void onDownloadLocationDialogCanceled() {} ++ }; ++ ++ DownloadLocationDialogCoordinator dialog = new DownloadLocationDialogCoordinator() { ++ @Override ++ protected void onDirectoryOptionsRetrieved(ArrayList dirs) { ++ if (mDialogModel != null) return; ++ ++ // Actually show the dialog. ++ mCustomView = (DownloadLocationCustomView) LayoutInflater.from(context).inflate( ++ R.layout.download_location_dialog, null); ++ mCustomView.initialize(DownloadLocationDialogType.DEFAULT, /*totalBytes*/ 0, ++ (isChecked) -> {}, ++ new DownloadLocationHelperImpl(mProfile)); ++ mCustomView.setTitle(context.getString(R.string.export_bookmarks_alert_title)); ++ mCustomView.setFileName(standardBoorkmarkName); ++ mCustomView.mDontShowAgain.setVisibility(View.GONE); ++ ++ Resources resources = context.getResources(); ++ mDialogModel = new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) ++ .with(ModalDialogProperties.CONTROLLER, this) ++ .with(ModalDialogProperties.CUSTOM_VIEW, mCustomView) ++ .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources, ++ R.string.export_bookmarks) ++ .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT, resources, ++ R.string.cancel) ++ .build(); ++ ++ mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.APP); ++ } ++ ++ @Override ++ public void onDismiss(PropertyModel model, int dismissalCause) { ++ switch (dismissalCause) { ++ case DialogDismissalCause.POSITIVE_BUTTON_CLICKED: ++ { ++ String fileName = mCustomView.getFileName(); ++ String directory = mCustomView.getDirectoryOption().location; ++ if (fileName != null && directory != null) { ++ File file = new File(directory, fileName); ++ ++ if (mWindowAndroid.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) { ++ doExportBookmarksImpl(file.getPath()); ++ } else { ++ String[] requestPermissions = new String[] {permission.WRITE_EXTERNAL_STORAGE}; ++ mWindowAndroid.requestPermissions(requestPermissions, (permissions, grantResults) -> { ++ if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { ++ doExportBookmarksImpl(file.getPath()); ++ } ++ }); ++ }; ++ } ++ } ++ break; ++ } ++ mDialogModel = null; ++ mCustomView = null; ++ } ++ }; ++ dialog.initialize(controller); ++ dialog.showDialog(context, mModalDialogManager, /*totalBytes*/ 0, ++ DownloadLocationDialogType.DEFAULT, /*suggestedPath*/ "", ++ ProfileManager.getLastUsedRegularProfile()); ++ } ++ ++ private void doExportBookmarksImpl(Uri filePath) { ++ ContentResolver resolver = ContextUtils.getApplicationContext().getContentResolver(); ++ // since we want to persist the uri in settings, ask for persistable permissions ++ resolver.takePersistableUriPermission(filePath, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | ++ Intent.FLAG_GRANT_READ_URI_PERMISSION); ++ ++ doExportBookmarksImpl(filePath.toString()); ++ } ++ ++ private void doExportBookmarksImpl(String filePath) { ++ mBookmarkModel.exportBookmarks(mWindowAndroid, filePath, ++ (success, bookmarksPath) -> { ++ if (!success) { ++ ((Activity)mWindowAndroid.getContext().get()).runOnUiThread(new Runnable() { ++ public void run() { ++ mWindowAndroid.showError(R.string.saving_file_error); ++ } ++ }); ++ } else { ++ SharedPreferencesManager sharedPrefs = ChromeSharedPreferences.getInstance(); ++ sharedPrefs.writeString(ChromePreferenceKeys.BOOKMARKS_LAST_EXPORT_URI, bookmarksPath); ++ ++ Context context = ContextUtils.getApplicationContext(); ++ ++ Intent intent = new Intent(Intent.ACTION_VIEW, ++ ContentUriUtils.isContentUri(bookmarksPath) ? ++ Uri.parse(bookmarksPath) : Uri.parse("file://" + bookmarksPath)); ++ intent.putExtra(Browser.EXTRA_APPLICATION_ID, ++ context.getPackageName()); ++ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ++ intent.putExtra(IntentHandler.EXTRA_PAGE_TRANSITION_TYPE, PageTransition.AUTO_BOOKMARK); ++ ++ // If the bookmark manager is shown in a tab on a phone (rather than in a separate ++ // activity) the component name may be null. Send the intent through ++ // ChromeLauncherActivity instead to avoid crashing. See crbug.com/615012. ++ intent.setClass(context, ChromeLauncherActivity.class); ++ ++ IntentHandler.startActivityForTrustedIntent(intent); ++ } ++ }); + } + @Override @@ -1107,7 +1139,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java -@@ -97,6 +97,17 @@ public class BookmarkToolbar extends SelectableListToolbar +@@ -96,6 +96,17 @@ public class BookmarkToolbar extends SelectableListToolbar setOnMenuItemClickListener(dragEnabled ? null : this); } @@ -1125,7 +1157,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows void setEditButtonVisible(boolean visible) { mEditButtonVisible = visible; getMenu().findItem(R.id.edit_menu_id).setVisible(visible); -@@ -173,6 +184,13 @@ public class BookmarkToolbar extends SelectableListToolbar +@@ -172,6 +183,13 @@ public class BookmarkToolbar extends SelectableListToolbar void setCurrentFolder(BookmarkId folder) { mCurrentFolder = mBookmarkModel.getBookmarkById(folder); @@ -1139,7 +1171,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows } void setNavigateBackRunnable(Runnable navigateBackRunnable) { -@@ -192,6 +210,13 @@ public class BookmarkToolbar extends SelectableListToolbar +@@ -191,6 +209,13 @@ public class BookmarkToolbar extends SelectableListToolbar @Override public boolean onMenuItemClick(MenuItem menuItem) { hideOverflowMenu(); @@ -1153,7 +1185,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows return mMenuIdClickedFunction.apply(menuItem.getItemId()); } -@@ -207,6 +232,9 @@ public class BookmarkToolbar extends SelectableListToolbar +@@ -206,6 +231,9 @@ public class BookmarkToolbar extends SelectableListToolbar protected void showNormalView() { super.showNormalView(); diff --git a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch b/build/patches/Add-menu-item-to-bookmark-all-tabs.patch index dc13ff5a..e39840c0 100644 --- a/build/patches/Add-menu-item-to-bookmark-all-tabs.patch +++ b/build/patches/Add-menu-item-to-bookmark-all-tabs.patch @@ -4,32 +4,32 @@ Subject: Add menu item to bookmark all tabs License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - chrome/android/java/res/menu/main_menu.xml | 7 ++ - .../chrome/browser/ChromeTabbedActivity.java | 24 +++++++ - .../bookmarks/android/bookmark_bridge.cc | 42 ++++++++++++ - .../bookmarks/android/bookmark_bridge.h | 8 +++ - .../browser/bookmarks/BookmarkBridge.java | 66 +++++++++++++++++++ - .../browser/bookmarks/bookmark_html_writer.cc | 14 +++- - .../bookmark_merged_surface_service.cc | 3 + + chrome/android/java/res/menu/main_menu.xml | 7 +++ + .../chrome/browser/ChromeTabbedActivity.java | 43 +++++++++++++++++++ + .../bookmarks/android/bookmark_bridge.cc | 42 ++++++++++++++++++ + .../bookmarks/android/bookmark_bridge.h | 8 ++++ + .../browser/bookmarks/BookmarkBridge.java | 41 ++++++++++++++++++ + .../browser/bookmarks/bookmark_html_writer.cc | 14 +++++- + .../bookmark_merged_surface_service.cc | 3 ++ .../permanent_folder_ordering_tracker.cc | 2 + .../dialogs/DownloadLocationCustomView.java | 4 +- - .../strings/android_chrome_strings.grd | 3 + + .../strings/android_chrome_strings.grd | 3 ++ .../bookmark_ui_operations_helper.cc | 2 + - components/bookmark_bar_strings.grdp | 6 ++ - .../bookmarks/browser/bookmark_codec.cc | 20 +++++- - components/bookmarks/browser/bookmark_codec.h | 7 +- - .../browser/bookmark_load_details.cc | 14 +++- + components/bookmark_bar_strings.grdp | 6 +++ + .../bookmarks/browser/bookmark_codec.cc | 20 +++++++-- + components/bookmarks/browser/bookmark_codec.h | 7 ++- + .../browser/bookmark_load_details.cc | 14 ++++-- .../bookmarks/browser/bookmark_load_details.h | 2 + .../bookmarks/browser/bookmark_model.cc | 3 +- - components/bookmarks/browser/bookmark_model.h | 7 ++ - components/bookmarks/browser/bookmark_node.cc | 11 ++++ - components/bookmarks/browser/bookmark_node.h | 3 + + components/bookmarks/browser/bookmark_model.h | 7 +++ + components/bookmarks/browser/bookmark_node.cc | 11 +++++ + components/bookmarks/browser/bookmark_node.h | 3 ++ .../bookmarks/browser/bookmark_storage.cc | 2 + - .../bookmarks/browser/bookmark_uuids.cc | 3 + + .../bookmarks/browser/bookmark_uuids.cc | 3 ++ components/bookmarks/browser/bookmark_uuids.h | 1 + - components/bookmarks/browser/model_loader.cc | 8 ++- + components/bookmarks/browser/model_loader.cc | 8 +++- .../bookmark_specifics_conversions.cc | 1 + - 25 files changed, 249 insertions(+), 14 deletions(-) + 25 files changed, 243 insertions(+), 14 deletions(-) diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml --- a/chrome/android/java/res/menu/main_menu.xml @@ -66,7 +66,25 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChromePhone; -@@ -3102,6 +3103,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements MismatchedIn +@@ -253,12 +254,17 @@ import org.chromium.chrome.browser.ui.RootUiCoordinator; + import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; + import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils; + import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils; ++import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar; ++import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; ++import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarController; + import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityClient; + import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityExtras.IntentOrigin; + import org.chromium.chrome.browser.undo_tab_close_snackbar.UndoBarController; + import org.chromium.chrome.browser.usage_stats.UsageStatsService; + import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; + import org.chromium.chrome.browser.xr.XrLayoutStateObserver; ++import org.chromium.components.bookmarks.BookmarkId; ++import org.chromium.components.bookmarks.BookmarkItem; + import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; + import org.chromium.components.browser_ui.edge_to_edge.SystemBarColorHelper; + import org.chromium.components.browser_ui.edge_to_edge.TabbedSystemBarColorHelper; +@@ -3103,6 +3109,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements MismatchedIn getTabModelSelectorSupplier().get(), closeAllTabsRunnable); RecordUserAction.record("MobileMenuCloseAllTabs"); @@ -75,7 +93,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct } else if (id == R.id.close_all_incognito_tabs_menu_id) { // Close only incognito tabs Runnable closeAllTabsRunnable = -@@ -3190,6 +3193,27 @@ public class ChromeTabbedActivity extends ChromeActivity implements MismatchedIn +@@ -3191,6 +3199,41 @@ public class ChromeTabbedActivity extends ChromeActivity implements MismatchedIn getTabModalLifetimeHandler().onOmniboxFocusChanged(hasFocus); } @@ -94,9 +112,23 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedAct + if (tab.isNativePage()) { + continue; + } -+ bookmarkModel.addToTabsCollection(this, tab); ++ bookmarkModel.addToTabsCollection(tab); + } -+ bookmarkModel.finishedAddingToTabsCollection(this, getSnackbarManager()); ++ BookmarkId parent = bookmarkModel.getTabsCollectionFolderId(); ++ BookmarkItem bookmarkItem = bookmarkModel.getBookmarkById(parent); ++ String folderName = ""; ++ if (bookmarkItem != null) { ++ folderName = bookmarkItem.getTitle(); ++ } ++ SnackbarController snackbarController = new SnackbarController() { ++ @Override ++ public void onAction(Object actionData) { ++ } ++ }; ++ Snackbar snackbar = Snackbar.make(folderName, snackbarController, Snackbar.TYPE_ACTION, ++ Snackbar.UMA_BOOKMARK_ADDED) ++ .setTemplateText(getString(R.string.bookmark_page_saved_folder)); ++ getSnackbarManager().showSnackbar(snackbar); + }); + } + @@ -212,19 +244,15 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows import org.chromium.base.ObserverList; import org.chromium.base.ThreadUtils; import org.chromium.base.metrics.RecordUserAction; -@@ -26,6 +27,11 @@ import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; +@@ -26,6 +27,7 @@ import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.tab.Tab; -+import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar; -+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; -+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarController; -+import org.chromium.chrome.R; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkItem; import org.chromium.components.bookmarks.BookmarkType; -@@ -85,6 +91,7 @@ import org.chromium.ui.modaldialog.DialogDismissalCause; +@@ -46,6 +48,7 @@ import java.util.function.BiConsumer; class BookmarkBridge { private static OneshotSupplierImpl sPartnerBookmarkIteratorSupplier = new OneshotSupplierImpl<>(); @@ -232,7 +260,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows private final ObserverList mObservers = new ObserverList<>(); private final Profile mProfile; -@@ -419,6 +426,16 @@ class BookmarkBridge { +@@ -383,6 +386,16 @@ class BookmarkBridge { return mMobileFolderId; } @@ -249,12 +277,12 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows /** Returns Id representing the special "other" folder from bookmark model. */ public BookmarkId getOtherFolderId() { ThreadUtils.assertOnUiThread(); -@@ -1140,6 +1157,50 @@ class BookmarkBridge { +@@ -894,6 +907,29 @@ class BookmarkBridge { .addToReadingList(mNativeBookmarkBridge, parentId, title, url); } + // Used to bookmark all tabs in a specific folder, created if not existing -+ public BookmarkId addToTabsCollection(Context context, Tab tab) { ++ public BookmarkId addToTabsCollection(Tab tab) { + BookmarkId parent = getTabsCollectionFolderId(); + BookmarkId existingId = BookmarkBridgeJni.get().getBookmarkIdForTabsCollection( + mNativeBookmarkBridge, tab.getOriginalUrl()); @@ -275,32 +303,11 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows + } + return bookmarkId; + } -+ -+ public void finishedAddingToTabsCollection(Activity activity, SnackbarManager snackbarManager) { -+ BookmarkId parent = getTabsCollectionFolderId(); -+ -+ BookmarkItem bookmarkItem = getBookmarkById(parent); -+ String folderName; -+ if (bookmarkItem != null) { -+ folderName = bookmarkItem.getTitle(); -+ } else { -+ folderName = ""; -+ } -+ SnackbarController snackbarController = new SnackbarController() { -+ @Override -+ public void onAction(Object actionData) { -+ } -+ }; -+ Snackbar snackbar = Snackbar.make(folderName, snackbarController, Snackbar.TYPE_ACTION, -+ Snackbar.UMA_BOOKMARK_ADDED) -+ .setTemplateText(activity.getString(R.string.bookmark_page_saved_folder)); -+ snackbarManager.showSnackbar(snackbar); -+ } + /** * Helper method to mark an item as read. * -@@ -1357,6 +1418,9 @@ class BookmarkBridge { +@@ -1111,6 +1147,9 @@ class BookmarkBridge { BookmarkId getMostRecentlyAddedUserBookmarkIdForUrl( long nativeBookmarkBridge, @JniType("GURL") GURL url); @@ -310,7 +317,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows BookmarkItem getBookmarkById(long nativeBookmarkBridge, long id, int type); void getTopLevelFolderIds( -@@ -1378,6 +1442,8 @@ class BookmarkBridge { +@@ -1132,6 +1171,8 @@ class BookmarkBridge { BookmarkId getRootFolderId(long nativeBookmarkBridge); diff --git a/build/patches/Always-use-new-tab-page-for-default-home-page.patch b/build/patches/Always-use-new-tab-page-for-default-home-page.patch index dc8ae2d2..6237297f 100644 --- a/build/patches/Always-use-new-tab-page-for-default-home-page.patch +++ b/build/patches/Always-use-new-tab-page-for-default-home-page.patch @@ -32,14 +32,14 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/Homepa diff --git a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java --- a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java +++ b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksProviderIterator.java -@@ -65,6 +65,7 @@ public class PartnerBookmarksProviderIterator implements PartnerBookmark.Bookmar - * @param callback The callback to receive the result. - */ - public static void createIfAvailable(Callback<@Nullable BookmarkIterator> callback) { -+ if ((true)) return null; +@@ -68,6 +68,7 @@ public class PartnerBookmarksProviderIterator implements PartnerBookmark.Bookmar new AsyncTask<@Nullable Cursor>() { @Override protected @Nullable Cursor doInBackground() { ++ if ((true)) return null; + try { + return ContextUtils.getApplicationContext() + .getContentResolver() diff --git a/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java b/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java --- a/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java +++ b/chrome/browser/partnercustomizations/java/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizations.java diff --git a/build/patches/Android-fonts-fingerprinting-mitigation.patch b/build/patches/Android-fonts-fingerprinting-mitigation.patch index af42968e..891b1216 100644 --- a/build/patches/Android-fonts-fingerprinting-mitigation.patch +++ b/build/patches/Android-fonts-fingerprinting-mitigation.patch @@ -37,11 +37,11 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../skia/src/ports/SkFontConfigInterface.cpp | 4 + .../ports/SkFontConfigInterface_direct.cpp | 5 + .../src/ports/SkFontConfigInterface_direct.h | 1 + - .../skia/src/ports/SkFontMgr_android.cpp | 277 ++- + .../skia/src/ports/SkFontMgr_android.cpp | 278 ++- .../skia/src/ports/SkFontMgr_android_data.cpp | 1640 +++++++++++++++++ .../src/ports/SkFontMgr_android_parser.cpp | 49 +- .../skia/src/ports/SkFontMgr_android_parser.h | 5 +- - 35 files changed, 2406 insertions(+), 79 deletions(-) + 35 files changed, 2407 insertions(+), 79 deletions(-) create mode 100644 chrome/browser/ui/android/strings/cromite_android_chrome_strings_grd/Android-fonts-fingerprinting-mitigation.grdp create mode 100644 components/component_updater/installer_policies/fonts_pack_component_installer.cc create mode 100644 components/component_updater/installer_policies/fonts_pack_component_installer.h @@ -1069,7 +1069,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia const SkString* cannonicalFamilyName = nullptr; if (!family.fNames.empty()) { cannonicalFamilyName = &family.fNames[0]; -@@ -119,38 +206,59 @@ public: +@@ -119,38 +206,60 @@ public: // TODO? make this lazy for (int i = 0; i < family.fFonts.size(); ++i) { @@ -1101,6 +1101,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia + + std::unique_ptr stream; + if (!custom && !fontFile.fFileName.startsWith('#')) { ++ std::unique_ptr* streamPtr = streamForPath.find(pathName); + if (!streamPtr) { + streamPtr = streamForPath.set(pathName, SkStream::MakeFromFile(pathName.c_str())); + } @@ -1108,7 +1109,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia + SkDEBUGF("Requested font file %s cannot be opened.\n", pathName.c_str()); + continue; + } -+ std::unique_ptr stream = (*streamPtr)->duplicate(); ++ stream = (*streamPtr)->duplicate(); + if (!stream) { + SkDEBUGF("Requested font file %s could not be duplicated.\n", pathName.c_str()); + continue; @@ -1152,7 +1153,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia } uint32_t variant = family.fVariant; -@@ -161,13 +269,25 @@ public: +@@ -161,13 +270,25 @@ public: // The first specified family name overrides the family name found in the font. // TODO: SkTypeface_AndroidSystem::onCreateFamilyNameIterator should return // all of the specified family names in addition to the names found in the font. @@ -1184,7 +1185,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia int weight = fontFile.fWeight != 0 ? fontFile.fWeight : fontStyle.weight(); SkFontStyle::Slant slant = fontStyle.slant(); switch (fontFile.fStyle) { -@@ -178,6 +298,19 @@ public: +@@ -178,6 +299,19 @@ public: } fontStyle = SkFontStyle(weight, fontStyle.width(), slant); @@ -1204,7 +1205,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia fStyles.push_back( SkTypeface_AndroidSystem::Make(proxy, fontStyle, proxy->isFixedPitch(), -@@ -206,15 +339,18 @@ public: +@@ -206,15 +340,18 @@ public: return fStyles[index]; } @@ -1226,7 +1227,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia SkString fFallbackFor; friend struct NameToFamily; -@@ -235,24 +371,26 @@ struct NameToFamily { +@@ -235,24 +372,26 @@ struct NameToFamily { class SkFontMgr_Android : public SkFontMgr { public: @@ -1257,7 +1258,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia } this->buildNameToFamilyMap(families, custom ? custom->fIsolated : false); this->findDefaultStyleSet(); -@@ -310,33 +448,53 @@ protected: +@@ -310,33 +449,53 @@ protected: return sset->matchStyle(style); } @@ -1326,7 +1327,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia } } return nullptr; -@@ -359,7 +517,7 @@ protected: +@@ -359,7 +518,7 @@ protected: for (int bcp47Index = bcp47Count; bcp47Index --> 0;) { SkLanguage lang(bcp47[bcp47Index]); while (!lang.getTag().isEmpty()) { @@ -1335,7 +1336,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia find_family_style_character(currentFamilyName, fFallbackNameToFamilyMap, style, SkToBool(elegant), lang.getTag(), character); -@@ -370,7 +528,7 @@ protected: +@@ -370,7 +529,7 @@ protected: lang = lang.getParent(); } } @@ -1344,7 +1345,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia find_family_style_character(currentFamilyName, fFallbackNameToFamilyMap, style, SkToBool(elegant), SkString(), character); -@@ -421,6 +579,7 @@ protected: +@@ -421,6 +580,7 @@ protected: private: std::unique_ptr fScanner; @@ -1352,7 +1353,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia TArray> fStyleSets; sk_sp fDefaultStyleSet; -@@ -442,7 +601,7 @@ private: +@@ -442,7 +602,7 @@ private: } sk_sp newSet = @@ -1361,7 +1362,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia if (0 == newSet->count()) { return; } -@@ -487,11 +646,11 @@ static char const * const gSystemFontUseStrings[] = { +@@ -487,11 +647,11 @@ static char const * const gSystemFontUseStrings[] = { } // namespace @@ -1376,7 +1377,7 @@ diff --git a/third_party/skia/src/ports/SkFontMgr_android.cpp b/third_party/skia if (custom) { SkASSERT(0 <= custom->fSystemFontUse); SkASSERT(custom->fSystemFontUse < std::size(gSystemFontUseStrings)); -@@ -501,5 +660,5 @@ sk_sp SkFontMgr_New_Android(const SkFontMgr_Android_CustomFonts* cust +@@ -501,5 +661,5 @@ sk_sp SkFontMgr_New_Android(const SkFontMgr_Android_CustomFonts* cust custom->fFontsXml, custom->fFallbackFontsXml); } diff --git a/build/patches/Bromite-auto-updater.patch b/build/patches/Bromite-auto-updater.patch index 149a8792..9e03eaae 100644 --- a/build/patches/Bromite-auto-updater.patch +++ b/build/patches/Bromite-auto-updater.patch @@ -35,11 +35,13 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../omaha/inline/InlineUpdateController.java | 57 ++++ .../safety_hub/SafetyHubFetchService.java | 5 - .../strings/android_chrome_strings.grd | 23 +- - .../endpoint_fetcher/endpoint_fetcher.cc | 120 ++++++-- - .../endpoint_fetcher/endpoint_fetcher.h | 22 ++ + .../ui/lens/lens_overlay_query_controller.cc | 1 + + .../endpoint_fetcher/endpoint_fetcher.cc | 133 ++++++-- + .../endpoint_fetcher/endpoint_fetcher.h | 24 ++ + components/manta/base_provider.cc | 1 + .../Bromite-auto-updater.inc | 3 + .../Bromite-auto-updater.inc | 1 + - 31 files changed, 1223 insertions(+), 95 deletions(-) + 33 files changed, 1240 insertions(+), 95 deletions(-) create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/omaha/CromiteUpdateStatusProvider.java create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/omaha/inline/BromiteInlineUpdateController.java create mode 100644 chrome/browser/endpoint_fetcher/BUILD.gn @@ -1718,6 +1720,17 @@ diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chro New window +diff --git a/chrome/browser/ui/lens/lens_overlay_query_controller.cc b/chrome/browser/ui/lens/lens_overlay_query_controller.cc +--- a/chrome/browser/ui/lens/lens_overlay_query_controller.cc ++++ b/chrome/browser/ui/lens/lens_overlay_query_controller.cc +@@ -771,6 +771,7 @@ LensOverlayQueryController::CreateEndpointFetcher( + /*post_data=*/request_string, + /*headers=*/request_headers, + /*cors_exempt_headers=*/cors_exempt_headers, chrome::GetChannel(), ++ kTrafficAnnotationTag, + /*request_params=*/ + EndpointFetcher::RequestParams::Builder(http_method, + kTrafficAnnotationTag) diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoint_fetcher/endpoint_fetcher.cc --- a/components/endpoint_fetcher/endpoint_fetcher.cc +++ b/components/endpoint_fetcher/endpoint_fetcher.cc @@ -1733,15 +1746,61 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi namespace { const char kContentTypeKey[] = "Content-Type"; const char kDeveloperKey[] = "X-Developer-Key"; -@@ -30,6 +35,7 @@ constexpr base::TimeDelta kDefaultTimeOut = base::Milliseconds(30000); - std::string GetHttpMethodString(const HttpMethod& http_method) { - switch (http_method) { - case HttpMethod::kGet: -+ intercept_redirect_(false), - return "GET"; - case HttpMethod::kPost: +@@ -35,6 +40,8 @@ std::string GetHttpMethodString(const HttpMethod& http_method) { return "POST"; -@@ -207,6 +213,7 @@ EndpointFetcher::EndpointFetcher( + case HttpMethod::kDelete: + return "DELETE"; ++ case HttpMethod::kHead: ++ return "HEAD"; + default: + DCHECK(0) << base::StringPrintf("Unknown HttpMethod %d\n", + static_cast(http_method)); +@@ -49,6 +56,8 @@ HttpMethod GetHttpMethod(const std::string& http_method_string) { + return HttpMethod::kPost; + } else if (http_method_string == "DELETE") { + return HttpMethod::kDelete; ++ } else if (http_method_string == "HEAD") { ++ return HttpMethod::kHead; + } + return HttpMethod::kUndefined; + } +@@ -115,9 +124,11 @@ EndpointFetcher::EndpointFetcher( + const std::vector& headers, + const std::vector& cors_exempt_headers, + version_info::Channel channel, ++ const net::NetworkTrafficAnnotationTag& annotation_tag, + const RequestParams request_params) + : url_loader_factory_(url_loader_factory), + identity_manager_(nullptr), ++ intercept_redirect_(false), + consent_level_(std::nullopt), + sanitize_response_(true), + channel_(channel), +@@ -137,6 +148,7 @@ EndpointFetcher::EndpointFetcher( + const net::NetworkTrafficAnnotationTag& annotation_tag) + : url_loader_factory_(url_loader_factory), + identity_manager_(nullptr), ++ intercept_redirect_(false), + consent_level_(std::nullopt), + sanitize_response_(false), + request_params_(EndpointFetcher::RequestParams::Builder(HttpMethod::kGet, +@@ -161,6 +173,7 @@ EndpointFetcher::EndpointFetcher( + : oauth_consumer_name_(oauth_consumer_name), + url_loader_factory_(url_loader_factory), + identity_manager_(identity_manager), ++ intercept_redirect_(false), + consent_level_(consent_level), + sanitize_response_(true), + request_params_( +@@ -190,6 +203,7 @@ EndpointFetcher::EndpointFetcher( + bool is_oauth_fetch) + : url_loader_factory_(url_loader_factory), + identity_manager_(nullptr), ++ intercept_redirect_(false), + consent_level_(std::nullopt), + sanitize_response_(true), + request_params_( +@@ -207,6 +221,7 @@ EndpointFetcher::EndpointFetcher( EndpointFetcher::EndpointFetcher( const net::NetworkTrafficAnnotationTag& annotation_tag) : identity_manager_(nullptr), @@ -1749,7 +1808,7 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi consent_level_(std::nullopt), sanitize_response_(true), request_params_( -@@ -215,6 +222,23 @@ EndpointFetcher::EndpointFetcher( +@@ -215,6 +230,27 @@ EndpointFetcher::EndpointFetcher( .SetTimeout(kDefaultTimeOut) .Build()) {} @@ -1761,19 +1820,23 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi + int64_t timeout_ms, + const bool intercept_redirect, + const net::NetworkTrafficAnnotationTag& annotation_tag) -+ : url_(url), -+ http_method_(http_method), -+ timeout_(base::Milliseconds(timeout_ms)), -+ intercept_redirect_(intercept_redirect), -+ annotation_tag_(annotation_tag), -+ url_loader_factory_(url_loader_factory), ++ : url_loader_factory_(url_loader_factory), + identity_manager_(nullptr), -+ sanitize_response_(false) {} ++ intercept_redirect_(intercept_redirect), ++ consent_level_(std::nullopt), ++ sanitize_response_(false), ++ request_params_( ++ EndpointFetcher::RequestParams::Builder(GetHttpMethod(http_method), ++ annotation_tag) ++ .SetAuthType(NO_AUTH) ++ .SetTimeout(base::Milliseconds(timeout_ms)) ++ .SetUrl(url) ++ .Build()) {} + EndpointFetcher::~EndpointFetcher() = default; void EndpointFetcher::Fetch(EndpointFetcherCallback endpoint_fetcher_callback) { -@@ -272,12 +296,9 @@ void EndpointFetcher::PerformRequest( +@@ -272,12 +308,9 @@ void EndpointFetcher::PerformRequest( auto resource_request = std::make_unique(); resource_request->method = GetHttpMethodString(request_params_.http_method()); resource_request->url = request_params_.url(); @@ -1789,7 +1852,7 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi if (request_params_.http_method() == HttpMethod::kPost) { resource_request->headers.SetHeader(kContentTypeKey, request_params_.content_type()); -@@ -305,10 +326,27 @@ void EndpointFetcher::PerformRequest( +@@ -305,10 +338,26 @@ void EndpointFetcher::PerformRequest( default: break; } @@ -1803,7 +1866,6 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi // callback simple_url_loader_ = network::SimpleURLLoader::Create( std::move(resource_request), request_params_.annotation_tag()); -+ simple_url_loader_->SetTimeoutDuration(timeout_); + simple_url_loader_->SetAllowHttpErrorResults(true); + + if (!response_) @@ -1817,15 +1879,17 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi if (request_params_.http_method() == HttpMethod::kPost) { simple_url_loader_->AttachStringForUpload( -@@ -320,15 +358,23 @@ void EndpointFetcher::PerformRequest( +@@ -320,15 +369,25 @@ void EndpointFetcher::PerformRequest( } simple_url_loader_->SetRetryOptions(GetMaxRetries(), network::SimpleURLLoader::RETRY_ON_5XX); - simple_url_loader_->SetTimeoutDuration(request_params_.timeout()); - simple_url_loader_->SetAllowHttpErrorResults(true); - network::SimpleURLLoader::BodyAsStringCallbackDeprecated -+ LOG(INFO) << "performing " << http_method_ << " request to " << url_; -+ if (base::EqualsCaseInsensitiveASCII(http_method_, "HEAD")) { ++ LOG(INFO) << "performing " ++ << GetHttpMethodString(request_params_.http_method()) ++ << " request to " << url_; ++ if (request_params_.http_method() == HttpMethod::kHead) { + endpoint_fetcher_callback_ = std::move(endpoint_fetcher_callback); + + simple_url_loader_->DownloadHeadersOnly( @@ -1847,7 +1911,7 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi } void EndpointFetcher::OnResponseFetched( -@@ -406,21 +452,6 @@ void EndpointFetcher::OnSanitizationResult( +@@ -406,21 +465,6 @@ void EndpointFetcher::OnSanitizationResult( std::move(endpoint_fetcher_callback).Run(std::move(response)); } @@ -1869,7 +1933,7 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.cc b/components/endpoi int EndpointFetcher::GetMaxRetries() const { if (!request_params_.max_retries.has_value()) { return kNumRetries; -@@ -445,3 +476,38 @@ UploadProgressCallback EndpointFetcher::GetUploadProgressCallback() const { +@@ -445,3 +489,38 @@ UploadProgressCallback EndpointFetcher::GetUploadProgressCallback() const { std::string EndpointFetcher::GetUrlForTesting() { return request_params_.url().spec(); } @@ -1920,7 +1984,15 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.h b/components/endpoin namespace network { struct ResourceRequest; -@@ -76,6 +78,8 @@ enum AuthType { +@@ -61,6 +63,7 @@ enum class HttpMethod { + kGet = 0, + kPost = 1, + kDelete = 2, ++ kHead = 3, + }; + + enum AuthType { +@@ -76,6 +79,8 @@ enum AuthType { struct EndpointResponse { std::string response; @@ -1929,7 +2001,15 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.h b/components/endpoin int http_status_code{-1}; std::optional error_type; }; -@@ -304,6 +308,14 @@ class EndpointFetcher { +@@ -296,6 +301,7 @@ class EndpointFetcher { + const std::vector& headers, + const std::vector& cors_exempt_headers, + version_info::Channel channel, ++ const net::NetworkTrafficAnnotationTag& annotation_tag, + const RequestParams request_params); + + // Constructor if no authentication is needed. +@@ -304,6 +310,14 @@ class EndpointFetcher { const GURL& url, const net::NetworkTrafficAnnotationTag& annotation_tag); @@ -1944,7 +2024,7 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.h b/components/endpoin // Used for tests. Can be used if caller constructs their own // url_loader_factory and identity_manager. EndpointFetcher( -@@ -360,6 +372,11 @@ class EndpointFetcher { +@@ -360,6 +374,11 @@ class EndpointFetcher { void OnSanitizationResult(std::unique_ptr response, EndpointFetcherCallback endpoint_fetcher_callback, data_decoder::JsonSanitizer::Result result); @@ -1956,16 +2036,22 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.h b/components/endpoin network::mojom::CredentialsMode GetCredentialsMode() const; int GetMaxRetries() const; -@@ -370,6 +387,8 @@ class EndpointFetcher { +@@ -370,12 +389,14 @@ class EndpointFetcher { // network::SimpleURLLoader. const std::string oauth_consumer_name_; signin::ScopeSet oauth_scopes_; + GURL url_; -+ const bool intercept_redirect_; // Members set in constructor const scoped_refptr url_loader_factory_; -@@ -388,6 +407,9 @@ class EndpointFetcher { + // `identity_manager_` can be null if it is not needed for authentication (in + // this case, callers should invoke `PerformRequest` directly). + const raw_ptr identity_manager_; ++ const bool intercept_redirect_; + // `consent_level_` is used together with `identity_manager_`, so it can be + // null if `identity_manager_` is null. + const std::optional consent_level_; +@@ -388,6 +409,9 @@ class EndpointFetcher { access_token_fetcher_; std::unique_ptr simple_url_loader_; @@ -1975,6 +2061,17 @@ diff --git a/components/endpoint_fetcher/endpoint_fetcher.h b/components/endpoin base::WeakPtrFactory weak_ptr_factory_{this}; }; +diff --git a/components/manta/base_provider.cc b/components/manta/base_provider.cc +--- a/components/manta/base_provider.cc ++++ b/components/manta/base_provider.cc +@@ -160,6 +160,7 @@ std::unique_ptr BaseProvider::CreateEndpointFetcherForDemoMode( + /*cors_exempt_headers=*/std::vector(), + // ChromeOS always uses the stable channel API key + version_info::Channel::STABLE, ++ annotation_tag, + EndpointFetcher::RequestParams::Builder(kHttpMethod, annotation_tag) + .Build()); + } diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Bromite-auto-updater.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Bromite-auto-updater.inc new file mode 100644 --- /dev/null diff --git a/build/patches/Chrome-web-store-protection.patch b/build/patches/Chrome-web-store-protection.patch index 87f65d44..882c44fe 100644 --- a/build/patches/Chrome-web-store-protection.patch +++ b/build/patches/Chrome-web-store-protection.patch @@ -18,7 +18,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../developer_private/developer_private_api.h | 3 + .../developer_private_functions_desktop.cc | 1 + .../developer_private_functions_shared.cc | 7 ++- - .../profile_info_generator.cc | 1 + + .../profile_info_generator.cc | 3 + .../webstore_private/webstore_private_api.cc | 15 ++++- .../extensions/chrome_extension_system.cc | 1 + .../extensions/cws_info_service_factory.cc | 3 +- @@ -50,7 +50,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html extensions/common/extension_features.cc | 14 +++++ extensions/common/extension_features.h | 2 + .../definitions/developer_private.d.ts | 2 + - 37 files changed, 251 insertions(+), 108 deletions(-) + 37 files changed, 253 insertions(+), 108 deletions(-) create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Webstore-protection.inc diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp @@ -78,9 +78,9 @@ diff --git a/chrome/browser/extensions/api/developer_private/developer_private_a +#include "chrome/browser/about_flags.h" +#include "chrome/browser/browser_process.h" -+#include "components/flags_ui/pref_service_flags_storage.h" -+#include "components/flags_ui/feature_entry.h" -+#include "components/flags_ui/flags_storage.h" ++#include "components/webui/flags/pref_service_flags_storage.h" ++#include "components/webui/flags/feature_entry.h" ++#include "components/webui/flags/flags_storage.h" + namespace extensions { @@ -165,11 +165,20 @@ diff --git a/chrome/browser/extensions/api/developer_private/developer_private_f diff --git a/chrome/browser/extensions/api/developer_private/profile_info_generator.cc b/chrome/browser/extensions/api/developer_private/profile_info_generator.cc --- a/chrome/browser/extensions/api/developer_private/profile_info_generator.cc +++ b/chrome/browser/extensions/api/developer_private/profile_info_generator.cc -@@ -46,6 +46,7 @@ developer::ProfileInfo CreateProfileInfo(Profile* profile) { +@@ -7,6 +7,7 @@ + #include "build/build_config.h" + #include "chrome/browser/prefs/incognito_mode_prefs.h" + #include "chrome/browser/profiles/profile.h" ++#include "chrome/browser/extensions/api/developer_private/developer_private_api.h" + #include "chrome/common/pref_names.h" + #include "components/policy/core/common/policy_pref_names.h" + #include "components/prefs/pref_service.h" +@@ -46,6 +47,8 @@ developer::ProfileInfo CreateProfileInfo(Profile* profile) { ->DidUserAcknowledgeNoticeGlobally(); #endif // !BUILDFLAG(IS_ANDROID) -+ info->is_extension_autoupdate_enabled = DeveloperPrivateAPI::IsExtensionAutoupdateEnabled(); ++ info.is_extension_autoupdate_enabled = ++ DeveloperPrivateAPI::IsExtensionAutoupdateEnabled(); return info; } diff --git a/build/patches/Content-settings-infrastructure.patch b/build/patches/Content-settings-infrastructure.patch index af40b8f1..a138928e 100644 --- a/build/patches/Content-settings-infrastructure.patch +++ b/build/patches/Content-settings-infrastructure.patch @@ -1071,7 +1071,7 @@ diff --git a/chrome/browser/ui/views/page_info/permission_toggle_row_view.cc b/c + if (choose_button_) { + choose_button_->SetEnabledTextColors(std::nullopt); + if (permission_.setting == CONTENT_SETTING_DEFAULT) { -+ choose_button_->SetTextColorId(views::Button::ButtonState::STATE_NORMAL, ++ choose_button_->SetTextColor(views::Button::ButtonState::STATE_NORMAL, + ui::kColorLabelForeground); + } + } @@ -1110,7 +1110,7 @@ diff --git a/chrome/browser/ui/views/page_info/permission_toggle_row_view.cc b/c + } + choose_button_->SetText(caption); + if (permission_.setting == CONTENT_SETTING_DEFAULT) { -+ choose_button_->SetTextColorId(views::Button::ButtonState::STATE_NORMAL, ++ choose_button_->SetTextColor(views::Button::ButtonState::STATE_NORMAL, + ui::kColorLabelForeground); + } + } diff --git a/build/patches/Disable-all-predictors-code.patch b/build/patches/Disable-all-predictors-code.patch index d4927349..35f4bc98 100644 --- a/build/patches/Disable-all-predictors-code.patch +++ b/build/patches/Disable-all-predictors-code.patch @@ -16,6 +16,8 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../predictors/autocomplete_action_predictor.cc | 2 ++ .../predictors/loading_predictor_config.cc | 4 ++-- chrome/browser/predictors/predictors_features.cc | 3 +-- + .../search_prefetch/field_trial_settings.cc | 4 ++++ + .../search_prefetch_url_loader_interceptor.cc | 1 + .../chrome_browser_main_extra_parts_profiles.cc | 1 - chrome/browser/safe_browsing/BUILD.gn | 1 - ...fication_content_detection_service_factory.cc | 5 +++++ @@ -23,11 +25,12 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../read_anything/read_aloud_app_model.cc | 16 ++++++++++++++-- .../read_anything/read_aloud_app_model.h | 9 ++++++++- .../read_anything_app_controller.cc | 10 ++++++++++ - .../read_anything/read_anything_app_controller.h | 4 ++++ + .../read_anything/read_anything_app_controller.h | 6 ++++++ chrome/utility/BUILD.gn | 2 +- chrome/utility/services.cc | 8 -------- .../integrators/autofill_optimization_guide.cc | 5 +++-- .../omnibox/browser/autocomplete_controller.cc | 4 ++++ + .../omnibox/browser/base_search_provider.cc | 4 ++-- .../optimization_guide/core/hints_fetcher.cc | 1 + .../optimization_guide/core/hints_manager.cc | 5 +++++ .../core/optimization_guide_features.cc | 15 +++++++++------ @@ -38,21 +41,23 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../page_content_annotations_model_manager.cc | 1 + .../notification_content_detection/BUILD.gn | 7 +++++++ components/safe_browsing/core/common/features.cc | 1 + - .../Disable-all-predictors-code.inc | 3 +++ + .../Disable-all-predictors-code.inc | 2 ++ .../Disable-all-predictors-code.inc | 1 + .../Disable-all-predictors-code.inc | 1 + .../features_cc/Disable-all-predictors-code.inc | 3 +++ .../features_cc/Disable-all-predictors-code.inc | 1 + + .../features_cc/Disable-all-predictors-code.inc | 1 + .../features_cc/Disable-all-predictors-code.inc | 2 ++ services/webnn/features.gni | 2 +- .../core/html/parser/html_document_parser.cc | 1 + .../document_speculation_rules.cc | 1 + .../platform/runtime_enabled_features.json5 | 2 +- - 43 files changed, 114 insertions(+), 45 deletions(-) + 47 files changed, 123 insertions(+), 47 deletions(-) create mode 100644 cromite_flags/chrome/browser/browser_features_cc/Disable-all-predictors-code.inc create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Disable-all-predictors-code.inc create mode 100644 cromite_flags/chrome/common/chrome_features_cc/Disable-all-predictors-code.inc create mode 100644 cromite_flags/components/permissions/features_cc/Disable-all-predictors-code.inc + create mode 100644 cromite_flags/net/base/features_cc/Disable-all-predictors-code.inc create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Disable-all-predictors-code.inc create mode 100644 cromite_flags/third_party/blink/common/features_cc/Disable-all-predictors-code.inc @@ -251,6 +256,28 @@ diff --git a/chrome/browser/predictors/predictors_features.cc b/chrome/browser/p } // namespace +diff --git a/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc b/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc +--- a/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc ++++ b/chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.cc +@@ -146,3 +146,7 @@ const base::FeatureParam + kSuppressesSearchPrefetchOnSlowNetworkThreshold{ + &kSuppressesSearchPrefetchOnSlowNetwork, + "slow_network_threshold_for_search_prefetch", base::Milliseconds(208)}; ++ ++SET_CROMITE_FEATURE_DISABLED(kSearchPrefetchServicePrefetching); ++SET_CROMITE_FEATURE_DISABLED(kSearchPrefetchWithNoVarySearchDiskCache); ++SET_CROMITE_FEATURE_DISABLED(kSearchNavigationPrefetch); +diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc +--- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc ++++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_url_loader_interceptor.cc +@@ -84,6 +84,7 @@ SearchPrefetchURLLoader::RequestHandler + SearchPrefetchURLLoaderInterceptor::MaybeCreateLoaderForRequest( + const network::ResourceRequest& tentative_resource_request, + content::FrameTreeNodeId frame_tree_node_id) { ++ if ((true)) return {}; + // Do not intercept non-main frame navigations. + if (!tentative_resource_request.is_outermost_main_frame) { + // Use the is_outermost_main_frame flag instead of obtaining the diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc @@ -511,7 +538,17 @@ diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_contr class ReadAnythingAppControllerTest; class ReadAnythingAppControllerScreen2xDataCollectionModeTest; -@@ -376,7 +378,9 @@ class ReadAnythingAppController +@@ -275,7 +277,9 @@ class ReadAnythingAppController + // available. + void UpdateDependencyParserModel(base::File model_file); + ++#if BUILDFLAG(BUILD_WITH_TFLITE_LIB) + DependencyParserModel& GetDependencyParserModelForTesting(); ++#endif + + // Called when distillation has completed. + void OnAXTreeDistilled(const ui::AXTreeID& tree_id, +@@ -376,7 +380,9 @@ class ReadAnythingAppController // Helpers for logging UmaHistograms based on times recorded in WebUI. void IncrementMetricCount(const std::string& metric); @@ -616,6 +653,26 @@ diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/ // Appends available autocompletion of the given type, subtype, and number to // the existing available autocompletions string, encoding according to the +diff --git a/components/omnibox/browser/base_search_provider.cc b/components/omnibox/browser/base_search_provider.cc +--- a/components/omnibox/browser/base_search_provider.cc ++++ b/components/omnibox/browser/base_search_provider.cc +@@ -99,14 +99,14 @@ BaseSearchProvider::BaseSearchProvider(AutocompleteProvider::Type type, + bool BaseSearchProvider::ShouldPrefetch(const AutocompleteMatch& match) { + // TODO (manukh): `GetAdditionalInfoForDebugging()` shouldn't be used for + // non-debugging purposes. +- return match.GetAdditionalInfoForDebugging(kShouldPrefetchKey) == kTrue; ++ return false; + } + + // static + bool BaseSearchProvider::ShouldPrerender(const AutocompleteMatch& match) { + // TODO (manukh): `GetAdditionalInfoForDebugging()` shouldn't be used for + // non-debugging purposes. +- return match.GetAdditionalInfoForDebugging(kShouldPrerenderKey) == kTrue; ++ return false; + } + + // static diff --git a/components/optimization_guide/core/hints_fetcher.cc b/components/optimization_guide/core/hints_fetcher.cc --- a/components/optimization_guide/core/hints_fetcher.cc +++ b/components/optimization_guide/core/hints_fetcher.cc @@ -811,10 +868,9 @@ diff --git a/cromite_flags/chrome/browser/browser_features_cc/Disable-all-predic new file mode 100644 --- /dev/null +++ b/cromite_flags/chrome/browser/browser_features_cc/Disable-all-predictors-code.inc -@@ -0,0 +1,3 @@ +@@ -0,0 +1,2 @@ +SET_CROMITE_FEATURE_DISABLED(kBookmarkTriggerForPrerender2); +SET_CROMITE_FEATURE_DISABLED(kNewTabPageTriggerForPrerender2); -+SET_CROMITE_FEATURE_DISABLED(kSupportSearchSuggestionForPrerender2); diff --git a/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Disable-all-predictors-code.inc b/cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Disable-all-predictors-code.inc new file mode 100644 --- /dev/null @@ -835,6 +891,12 @@ new file mode 100644 +SET_CROMITE_FEATURE_DISABLED(kPermissionOnDeviceNotificationPredictions); +SET_CROMITE_FEATURE_DISABLED(kPermissionOnDeviceGeolocationPredictions); +SET_CROMITE_FEATURE_DISABLED(kPermissionPredictionsV2); +diff --git a/cromite_flags/net/base/features_cc/Disable-all-predictors-code.inc b/cromite_flags/net/base/features_cc/Disable-all-predictors-code.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/net/base/features_cc/Disable-all-predictors-code.inc +@@ -0,0 +1 @@ ++SET_CROMITE_FEATURE_DISABLED(kHttpCacheNoVarySearch); diff --git a/cromite_flags/services/network/public/cpp/features_cc/Disable-all-predictors-code.inc b/cromite_flags/services/network/public/cpp/features_cc/Disable-all-predictors-code.inc new file mode 100644 --- /dev/null diff --git a/build/patches/Disable-conversion-measurement-api.patch b/build/patches/Disable-conversion-measurement-api.patch index 950be825..c6ed28b0 100644 --- a/build/patches/Disable-conversion-measurement-api.patch +++ b/build/patches/Disable-conversion-measurement-api.patch @@ -38,8 +38,8 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../browser/AttributionOsLevelManager.java | 349 +----------------- .../public/browser/content_browser_client.cc | 7 +- .../public/browser/navigation_controller.cc | 1 - - .../Disable-conversion-measurement-api.inc | 1 + - .../Disable-conversion-measurement-api.inc | 10 + + .../Disable-conversion-measurement-api.inc | 2 + + .../Disable-conversion-measurement-api.inc | 8 + .../attribution/request_headers_internal.cc | 1 + services/network/network_context.cc | 20 - .../network/public/cpp/attribution_utils.cc | 2 + @@ -47,7 +47,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html third_party/blink/renderer/core/page/page.cc | 2 +- .../platform/runtime_enabled_features.json5 | 20 +- ui/events/android/motion_event_android.cc | 8 +- - 36 files changed, 101 insertions(+), 430 deletions(-) + 36 files changed, 100 insertions(+), 430 deletions(-) create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Disable-conversion-measurement-api.inc create mode 100644 cromite_flags/third_party/blink/common/features_cc/Disable-conversion-measurement-api.inc @@ -986,23 +986,22 @@ diff --git a/cromite_flags/services/network/public/cpp/features_cc/Disable-conve new file mode 100644 --- /dev/null +++ b/cromite_flags/services/network/public/cpp/features_cc/Disable-conversion-measurement-api.inc -@@ -0,0 +1 @@ -+// none +@@ -0,0 +1,2 @@ ++SET_CROMITE_FEATURE_DISABLED(kBrowsingTopics); ++SET_CROMITE_FEATURE_DISABLED(kInterestGroupStorage); diff --git a/cromite_flags/third_party/blink/common/features_cc/Disable-conversion-measurement-api.inc b/cromite_flags/third_party/blink/common/features_cc/Disable-conversion-measurement-api.inc new file mode 100644 --- /dev/null +++ b/cromite_flags/third_party/blink/common/features_cc/Disable-conversion-measurement-api.inc -@@ -0,0 +1,10 @@ +@@ -0,0 +1,8 @@ +SET_CROMITE_FEATURE_DISABLED(kAdAuctionSignals); -+SET_CROMITE_FEATURE_DISABLED(kBrowsingTopics); +SET_CROMITE_FEATURE_DISABLED(kBrowsingTopicsDocumentAPI); +SET_CROMITE_FEATURE_DISABLED(kBrowsingTopicsParameters); +SET_CROMITE_FEATURE_DISABLED(kFledge); +SET_CROMITE_FEATURE_DISABLED(kFledgeBiddingAndAuctionServer); -+SET_CROMITE_FEATURE_DISABLED(kInterestGroupStorage); +SET_CROMITE_FEATURE_DISABLED(kPrivateAggregationApi); -+SET_CROMITE_FEATURE_DISABLED(kBiddingAndScoringDebugReportingAPI); +SET_CROMITE_FEATURE_DISABLED(kAllowURNsInIframes); ++SET_CROMITE_FEATURE_DISABLED(kFledgeSampleDebugReports); diff --git a/services/network/attribution/request_headers_internal.cc b/services/network/attribution/request_headers_internal.cc --- a/services/network/attribution/request_headers_internal.cc +++ b/services/network/attribution/request_headers_internal.cc diff --git a/build/patches/Disable-privacy-issues-in-password-manager.patch b/build/patches/Disable-privacy-issues-in-password-manager.patch index 7cf07889..15a5c9a4 100644 --- a/build/patches/Disable-privacy-issues-in-password-manager.patch +++ b/build/patches/Disable-privacy-issues-in-password-manager.patch @@ -7,17 +7,17 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- chrome/android/java/AndroidManifest.xml | 9 --------- .../password_store_android_backend_bridge_helper_impl.cc | 1 + - .../android/password_store_android_local_backend.cc | 6 +++++- .../generated_password_leak_detection_pref.cc | 3 +-- .../password_receiver_service_factory.cc | 2 +- .../password_manager/password_sender_service_factory.cc | 2 +- .../affiliations/core/browser/affiliation_backend.cc | 1 + .../core/browser/affiliation_service_impl.cc | 4 ++++ components/affiliations/core/browser/facet_manager.cc | 4 ++++ + .../affiliation/password_affiliation_source_adapter.cc | 4 ++++ .../leak_detection/leak_detection_check_factory_impl.cc | 5 +++++ .../browser/leak_detection/leak_detection_check_impl.cc | 3 +-- .../Disable-privacy-issues-in-password-manager.inc | 1 + - 12 files changed, 25 insertions(+), 16 deletions(-) + 12 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 cromite_flags/components/password_manager/core/browser/features/password_features_cc/Disable-privacy-issues-in-password-manager.inc diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml @@ -50,22 +50,6 @@ diff --git a/chrome/browser/password_manager/android/password_store_android_back base::android::BuildInfo* info = base::android::BuildInfo::GetInstance(); int current_gms_core_version; if (!base::StringToInt(info->gms_version_code(), ¤t_gms_core_version)) { -diff --git a/chrome/browser/password_manager/android/password_store_android_local_backend.cc b/chrome/browser/password_manager/android/password_store_android_local_backend.cc ---- a/chrome/browser/password_manager/android/password_store_android_local_backend.cc -+++ b/chrome/browser/password_manager/android/password_store_android_local_backend.cc -@@ -29,7 +29,11 @@ PasswordStoreAndroidLocalBackend::PasswordStoreAndroidLocalBackend( - PrefService* prefs) - : PasswordStoreAndroidBackend(std::move(bridge_helper), - std::move(lifecycle_helper), -- prefs) {} -+ prefs) { -+ // This is why we have to explicitly call it here whenever local GMSCore is -+ // created. -+ if ((true)) password_affiliation_adapter.DisableSource(); -+} - - PasswordStoreAndroidLocalBackend::~PasswordStoreAndroidLocalBackend() = default; - diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref.cc b/chrome/browser/password_manager/generated_password_leak_detection_pref.cc --- a/chrome/browser/password_manager/generated_password_leak_detection_pref.cc +++ b/chrome/browser/password_manager/generated_password_leak_detection_pref.cc @@ -142,6 +126,20 @@ diff --git a/components/affiliations/core/browser/facet_manager.cc b/components/ if (IsCachedDataFresh()) { AffiliatedFacetsWithUpdateTime affiliation; if (!backend_->ReadAffiliationsAndBrandingFromDatabase(facet_uri_, +diff --git a/components/password_manager/core/browser/affiliation/password_affiliation_source_adapter.cc b/components/password_manager/core/browser/affiliation/password_affiliation_source_adapter.cc +--- a/components/password_manager/core/browser/affiliation/password_affiliation_source_adapter.cc ++++ b/components/password_manager/core/browser/affiliation/password_affiliation_source_adapter.cc +@@ -27,6 +27,10 @@ PasswordAffiliationSourceAdapter::~PasswordAffiliationSourceAdapter() = default; + + void PasswordAffiliationSourceAdapter::GetFacets( + AffiliationSource::ResultCallback response_callback) { ++ if (((true))) { ++ std::move(response_callback).Run({}); ++ return; ++ } + on_password_forms_received_callback_ = std::move(response_callback); + store_->GetAllLogins(weak_ptr_factory_.GetWeakPtr()); + } diff --git a/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl.cc b/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl.cc --- a/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl.cc +++ b/components/password_manager/core/browser/leak_detection/leak_detection_check_factory_impl.cc diff --git a/build/patches/Disable-privacy-sandbox.patch b/build/patches/Disable-privacy-sandbox.patch index d4ff7aa7..4ceb4155 100644 --- a/build/patches/Disable-privacy-sandbox.patch +++ b/build/patches/Disable-privacy-sandbox.patch @@ -27,11 +27,13 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../shared_storage_document_service_impl.cc | 9 +++++++++ .../features_cc/Disable-privacy-sandbox.inc | 1 + .../Disable-privacy-sandbox.inc | 1 + - .../features_cc/Disable-privacy-sandbox.inc | 2 ++ + .../features_cc/Disable-privacy-sandbox.inc | 1 + + .../features_cc/Disable-privacy-sandbox.inc | 1 + third_party/blink/common/features.cc | 1 + - 19 files changed, 48 insertions(+), 28 deletions(-) + 20 files changed, 48 insertions(+), 28 deletions(-) create mode 100644 cromite_flags/content/common/features_cc/Disable-privacy-sandbox.inc create mode 100644 cromite_flags/content/public/common/content_features_cc/Disable-privacy-sandbox.inc + create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Disable-privacy-sandbox.inc create mode 100644 cromite_flags/third_party/blink/common/features_cc/Disable-privacy-sandbox.inc diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc @@ -328,13 +330,18 @@ new file mode 100644 +++ b/cromite_flags/content/public/common/content_features_cc/Disable-privacy-sandbox.inc @@ -0,0 +1 @@ +SET_CROMITE_FEATURE_DISABLED(kPrivacySandboxAdsAPIsOverride); +diff --git a/cromite_flags/services/network/public/cpp/features_cc/Disable-privacy-sandbox.inc b/cromite_flags/services/network/public/cpp/features_cc/Disable-privacy-sandbox.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/services/network/public/cpp/features_cc/Disable-privacy-sandbox.inc +@@ -0,0 +1 @@ ++SET_CROMITE_FEATURE_DISABLED(kSharedStorageAPI); diff --git a/cromite_flags/third_party/blink/common/features_cc/Disable-privacy-sandbox.inc b/cromite_flags/third_party/blink/common/features_cc/Disable-privacy-sandbox.inc new file mode 100644 --- /dev/null +++ b/cromite_flags/third_party/blink/common/features_cc/Disable-privacy-sandbox.inc -@@ -0,0 +1,2 @@ +@@ -0,0 +1 @@ +SET_CROMITE_FEATURE_DISABLED(kFencedFrames); -+SET_CROMITE_FEATURE_DISABLED(kSharedStorageAPI); diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc diff --git a/build/patches/Disable-speechSynthesis-getVoices-API.patch b/build/patches/Disable-speechSynthesis-getVoices-API.patch index 54be7b49..49a5c5ce 100644 --- a/build/patches/Disable-speechSynthesis-getVoices-API.patch +++ b/build/patches/Disable-speechSynthesis-getVoices-API.patch @@ -11,18 +11,18 @@ Require: Timezone-customization.patch License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- - .../renderer/chrome_content_renderer_client.cc | 2 +- - .../renderer/content_settings_agent_impl.cc | 9 ++++++++- - .../renderer/content_settings_agent_impl.h | 2 ++ - content/browser/speech/tts_android.cc | 2 +- - content/browser/speech/tts_win.cc | 2 +- - .../Disable-speechSynthesis-getVoices-API.inc | 8 ++++++++ - .../Disable-speechSynthesis-getVoices-API.inc | 2 ++ - .../Disable-speechSynthesis-getVoices-API.inc | 3 +++ - .../Disable-speechSynthesis-getVoices-API.inc | 1 + - .../platform/web_content_settings_client.h | 2 ++ - .../renderer/modules/speech/speech_synthesis.cc | 17 ++++++++++++++--- - 11 files changed, 43 insertions(+), 7 deletions(-) + .../renderer/chrome_content_renderer_client.cc | 2 +- + .../renderer/content_settings_agent_impl.cc | 9 ++++++++- + .../renderer/content_settings_agent_impl.h | 2 ++ + content/browser/speech/tts_android.cc | 2 +- + content/browser/speech/tts_win.cc | 2 +- + .../Disable-speechSynthesis-getVoices-API.inc | 8 ++++++++ + .../Disable-speechSynthesis-getVoices-API.inc | 2 ++ + .../Disable-speechSynthesis-getVoices-API.inc | 3 +++ + .../Disable-speechSynthesis-getVoices-API.inc | 1 + + .../platform/web_content_settings_client.h | 2 ++ + .../modules/speech/speech_synthesis.cc | 18 +++++++++++++++--- + 11 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Disable-speechSynthesis-getVoices-API.inc create mode 100644 cromite_flags/media/base/media_switches_cc/Disable-speechSynthesis-getVoices-API.inc create mode 100644 cromite_flags/third_party/blink/common/features_cc/Disable-speechSynthesis-getVoices-API.inc @@ -151,7 +151,15 @@ diff --git a/third_party/blink/public/platform/web_content_settings_client.h b/t diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis.cc b/third_party/blink/renderer/modules/speech/speech_synthesis.cc --- a/third_party/blink/renderer/modules/speech/speech_synthesis.cc +++ b/third_party/blink/renderer/modules/speech/speech_synthesis.cc -@@ -35,6 +35,7 @@ +@@ -28,6 +28,7 @@ + #include + + #include "build/build_config.h" ++#include "third_party/blink/public/common/features.h" + #include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h" + #include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h" + #include "third_party/blink/public/common/privacy_budget/identifiable_token.h" +@@ -35,6 +36,7 @@ #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h" #include "third_party/blink/public/platform/browser_interface_broker_proxy.h" #include "third_party/blink/public/platform/platform.h" @@ -159,7 +167,7 @@ diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis.cc b/thi #include "third_party/blink/renderer/bindings/modules/v8/v8_speech_synthesis_error_event_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_speech_synthesis_event_init.h" #include "third_party/blink/renderer/core/dom/document.h" -@@ -93,9 +94,19 @@ SpeechSynthesis::SpeechSynthesis(LocalDOMWindow& window) +@@ -93,9 +95,19 @@ SpeechSynthesis::SpeechSynthesis(LocalDOMWindow& window) void SpeechSynthesis::OnSetVoiceList( Vector mojom_voices) { voice_list_.clear(); diff --git a/build/patches/Enable-ImprovedBookmarks-by-default.patch b/build/patches/Enable-ImprovedBookmarks-by-default.patch index f0d1a386..cbd3d09e 100644 --- a/build/patches/Enable-ImprovedBookmarks-by-default.patch +++ b/build/patches/Enable-ImprovedBookmarks-by-default.patch @@ -6,10 +6,10 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- chrome/android/java/res/layout/bookmark_search_box_row.xml | 4 ++-- .../chrome/browser/bookmarks/BookmarkManagerOpenerImpl.java | 2 +- - .../browser/bookmarks/BookmarkSearchBoxRowViewBinder.java | 1 + + .../browser/bookmarks/BookmarkSearchBoxRowViewBinder.java | 2 ++ .../chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java | 2 +- components/bookmarks/browser/bookmark_node.cc | 3 +-- - 5 files changed, 6 insertions(+), 6 deletions(-) + 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/chrome/android/java/res/layout/bookmark_search_box_row.xml b/chrome/android/java/res/layout/bookmark_search_box_row.xml --- a/chrome/android/java/res/layout/bookmark_search_box_row.xml @@ -40,7 +40,15 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/Bookm diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowViewBinder.java -@@ -33,6 +33,7 @@ class BookmarkSearchBoxRowViewBinder { +@@ -5,6 +5,7 @@ + package org.chromium.chrome.browser.bookmarks; + + import android.view.View; ++import android.view.ViewGroup; + + import androidx.annotation.DrawableRes; + import androidx.annotation.StringRes; +@@ -33,6 +34,7 @@ class BookmarkSearchBoxRowViewBinder { private void bindInternal(PropertyModel model, View view, PropertyKey key) { BookmarkSearchBoxRow row = (BookmarkSearchBoxRow) view; ChipView shoppingChip = view.findViewById(R.id.shopping_filter_chip); diff --git a/build/patches/Enable-network-isolation-features.patch b/build/patches/Enable-network-isolation-features.patch index 1b886067..74e15573 100644 --- a/build/patches/Enable-network-isolation-features.patch +++ b/build/patches/Enable-network-isolation-features.patch @@ -9,10 +9,12 @@ PartitionNelAndReportingByNetworkIsolationKey, kSplitCacheByNavigationInitiator License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - .../browser/net/profile_network_context_service.cc | 2 +- - .../Enable-network-isolation-features.inc | 12 ++++++++++++ - .../Enable-network-isolation-features.inc | 1 + - 3 files changed, 14 insertions(+), 1 deletion(-) + .../browser/net/profile_network_context_service.cc | 2 +- + .../Enable-network-isolation-features.inc | 10 ++++++++++ + .../Enable-network-isolation-features.inc | 1 + + net/http/http_cache.cc | 14 +++++++++----- + net/http/http_cache.h | 2 +- + 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 cromite_flags/net/base/features_cc/Enable-network-isolation-features.inc create mode 100644 cromite_flags/services/network/public/cpp/features_cc/Enable-network-isolation-features.inc @@ -32,7 +34,7 @@ diff --git a/cromite_flags/net/base/features_cc/Enable-network-isolation-feature new file mode 100644 --- /dev/null +++ b/cromite_flags/net/base/features_cc/Enable-network-isolation-features.inc -@@ -0,0 +1,12 @@ +@@ -0,0 +1,10 @@ +SET_CROMITE_FEATURE_ENABLED(kSplitCodeCacheByNetworkIsolationKey); +SET_CROMITE_FEATURE_ENABLED(kPartitionConnectionsByNetworkIsolationKey); + @@ -40,15 +42,75 @@ new file mode 100644 + +// enable http cache partition +SET_CROMITE_FEATURE_ENABLED(kSplitCacheByNetworkIsolationKey); ++// but disable cache for cross-site main frame navigation ++SET_CROMITE_FEATURE_ENABLED(kSplitCacheByCrossSiteMainFrameNavigationBoolean); + -+// most restricted option (ByNavigationInitiator) used -+// it generates a cache key isolating all requests per initiator. -+// requests with initiators with an opaque origin are not cached -+SET_CROMITE_FEATURE_ENABLED(kSplitCacheByNavigationInitiator); diff --git a/cromite_flags/services/network/public/cpp/features_cc/Enable-network-isolation-features.inc b/cromite_flags/services/network/public/cpp/features_cc/Enable-network-isolation-features.inc new file mode 100644 --- /dev/null +++ b/cromite_flags/services/network/public/cpp/features_cc/Enable-network-isolation-features.inc @@ -0,0 +1 @@ +SET_CROMITE_FEATURE_ENABLED(kSplitAuthCacheByNetworkIsolationKey); +diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc +--- a/net/http/http_cache.cc ++++ b/net/http/http_cache.cc +@@ -633,7 +633,7 @@ bool HttpCache::CanGenerateCacheKeyForRequest(const HttpRequestInfo* request) { + + // static + // Generate a key that can be used inside the cache. +-std::string HttpCache::GenerateCacheKey( ++std::string HttpCache::GenerateCacheKey2( + const GURL& url, + int load_flags, + const NetworkIsolationKey& network_isolation_key, +@@ -671,8 +671,8 @@ std::string HttpCache::GenerateCacheKey( + const bool is_initiator_cross_site = + initiator_site != net::SchemefulSite(url); + if (is_initiator_cross_site) { +- is_cross_site_main_frame_navigation_prefix = +- kCrossSiteMainFrameNavigationPrefix; ++ DLOG(INFO) << "---initiator_site cs=" << base::StrCat({"ni_", initiator_site.Serialize(), " "}); ++ return ""; + } + } + isolation_key = base::StrCat( +@@ -687,9 +687,11 @@ std::string HttpCache::GenerateCacheKey( + // Strip out the reference, username, and password sections of the URL and + // concatenate with the credential_key, the post_key, and the network + // isolation key if we are splitting the cache. +- return base::StringPrintf("%c/%" PRId64 "/%s%s", credential_key, ++ auto key = base::StringPrintf("%c/%" PRId64 "/%s%s", credential_key, + upload_data_identifier, isolation_key.c_str(), + HttpUtil::SpecForRequest(url).c_str()); ++ DLOG(INFO) << "---key=" << key; ++ return key; + } + + // static +@@ -712,10 +714,12 @@ HttpCache::GenerateCacheKeyForRequestWithAlternateURL( + const int64_t upload_data_identifier = + request->upload_data_stream ? request->upload_data_stream->identifier() + : int64_t(0); +- return GenerateCacheKey( ++ auto key = GenerateCacheKey2( + url, request->load_flags, request->network_isolation_key, + upload_data_identifier, request->is_subframe_document_resource, + request->is_main_frame_navigation, request->initiator); ++ if (key.empty()) return std::nullopt; ++ return key; + } + + // static +diff --git a/net/http/http_cache.h b/net/http/http_cache.h +--- a/net/http/http_cache.h ++++ b/net/http/http_cache.h +@@ -509,7 +509,7 @@ class NET_EXPORT HttpCache : public HttpTransactionFactory { + // Generates a cache key given the various pieces used to construct the key. + // Must not be called if a corresponding `CanGenerateCacheKeyForRequest` + // returns false. +- static std::string GenerateCacheKey( ++ static std::string GenerateCacheKey2( + const GURL& url, + int load_flags, + const NetworkIsolationKey& network_isolation_key, -- diff --git a/build/patches/Enable-search-engine-settings-desktop-ui.patch b/build/patches/Enable-search-engine-settings-desktop-ui.patch index 6135fb3a..91158a1b 100644 --- a/build/patches/Enable-search-engine-settings-desktop-ui.patch +++ b/build/patches/Enable-search-engine-settings-desktop-ui.patch @@ -12,10 +12,11 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html chrome/app/settings_strings.grdp | 3 + chrome/app/settings_strings_android.grdp | 260 ++++++++++++++++++ chrome/browser/BUILD.gn | 3 + - .../chrome_browser_interface_binders.cc | 12 + + .../chrome_browser_interface_binders.cc | 3 + + .../chrome_browser_interface_binders_webui.cc | 21 ++ chrome/browser/resources/BUILD.gn | 6 + chrome/browser/resources/settings/BUILD.gn | 2 +- - .../resources/settings/page_visibility.ts | 43 ++- + .../resources/settings/page_visibility.ts | 40 ++- .../search_engine_edit_dialog.html | 6 + .../search_engine_edit_dialog.ts | 6 +- .../search_engines_browser_proxy.ts | 8 +- @@ -26,7 +27,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../settings/settings_ui/settings_ui.html | 6 + .../resources/settings_shared/BUILD.gn | 2 +- chrome/browser/search/background/BUILD.gn | 4 +- - .../browser/search_engines/android/BUILD.gn | 2 + + .../browser/search_engines/android/BUILD.gn | 1 + .../java/res/layout/search_engine_layout.xml | 25 ++ .../settings/SearchEngineSettings.java | 21 ++ chrome/browser/ui/BUILD.gn | 18 ++ @@ -37,7 +38,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../template_url_table_model.cc | 9 +- .../search_engines/template_url_table_model.h | 6 +- .../browser/ui/webui/chrome_web_ui_configs.cc | 8 + - chrome/browser/ui/webui/favicon_source.cc | 16 ++ + chrome/browser/ui/webui/favicon_source.cc | 14 + chrome/browser/ui/webui/favicon_source.h | 2 + .../webui/settings/search_engines_handler.cc | 28 +- .../webui/settings/search_engines_handler.h | 3 +- @@ -69,14 +70,14 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../cr_components/managed_dialog/BUILD.gn | 2 +- .../cr_components/managed_footnote/BUILD.gn | 2 +- .../cr_components/theme_color_picker/BUILD.gn | 2 +- - ui/webui/resources/cr_elements/BUILD.gn | 4 +- + ui/webui/resources/cr_elements/BUILD.gn | 6 +- .../cr_elements/cr_dialog/cr_dialog.css | 2 +- .../resources/cr_elements/cr_shared_vars.css | 4 + ui/webui/resources/css/BUILD.gn | 2 +- ui/webui/resources/images/BUILD.gn | 2 +- ui/webui/resources/js/BUILD.gn | 2 +- ui/webui/resources/js/load_time_data.ts | 17 +- - 69 files changed, 1146 insertions(+), 68 deletions(-) + 70 files changed, 1153 insertions(+), 69 deletions(-) create mode 100644 chrome/app/settings_strings_android.grdp create mode 100644 chrome/browser/search_engines/android/java/res/layout/search_engine_layout.xml create mode 100644 chrome/browser/ui/webui/settings/settings_localized_strings_provider_android.cc @@ -430,10 +431,37 @@ diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc -@@ -84,6 +84,18 @@ +@@ -84,6 +84,9 @@ #endif #if BUILDFLAG(IS_ANDROID) ++#include "ui/webui/resources/cr_components/help_bubble/help_bubble.mojom.h" ++#include "ui/webui/resources/cr_components/customize_color_scheme_mode/customize_color_scheme_mode.mojom.h" ++#include "chrome/browser/ui/webui/settings/settings_ui_android.h" + #include "chrome/browser/android/dom_distiller/distiller_ui_handle_android.h" + #include "chrome/browser/facilitated_payments/payment_link_handler_binder.h" + #include "chrome/browser/offline_pages/android/offline_page_auto_fetcher.h" +diff --git a/chrome/browser/chrome_browser_interface_binders_webui.cc b/chrome/browser/chrome_browser_interface_binders_webui.cc +--- a/chrome/browser/chrome_browser_interface_binders_webui.cc ++++ b/chrome/browser/chrome_browser_interface_binders_webui.cc +@@ -61,6 +61,12 @@ + #include "chrome/browser/ui/webui/whats_new/whats_new_ui.h" + #endif + ++#if BUILDFLAG(IS_ANDROID) ++#include "ui/webui/resources/cr_components/customize_color_scheme_mode/customize_color_scheme_mode.mojom.h" ++#include "ui/webui/resources/cr_components/help_bubble/help_bubble.mojom.h" ++#include "chrome/browser/ui/webui/settings/settings_ui.h" ++#endif ++ + #if BUILDFLAG(IS_ANDROID) + #include "chrome/browser/ui/webui/feed_internals/feed_internals.mojom.h" + #include "chrome/browser/ui/webui/feed_internals/feed_internals_ui.h" +@@ -460,6 +466,15 @@ void PopulateChromeWebUIFrameBinders( + OnDeviceTranslationInternalsUI>(map); + #endif + ++#if BUILDFLAG(IS_ANDROID) + RegisterWebUIControllerInterfaceBinder< + help_bubble::mojom::HelpBubbleHandlerFactory, settings::SettingsUI>(map); + @@ -442,13 +470,29 @@ diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser + CustomizeColorSchemeModeHandlerFactory, settings::SettingsUI>(map); +#endif + + #if !BUILDFLAG(IS_ANDROID) + RegisterWebUIControllerInterfaceBinder< + search_engine_choice::mojom::PageHandlerFactory, SearchEngineChoiceUI>( +@@ -562,6 +577,9 @@ void PopulateChromeWebUIFrameBinders( + RegisterWebUIControllerInterfaceBinder(map); + +#if BUILDFLAG(IS_ANDROID) -+#include "ui/webui/resources/cr_components/help_bubble/help_bubble.mojom.h" -+#include "ui/webui/resources/cr_components/customize_color_scheme_mode/customize_color_scheme_mode.mojom.h" -+#include "chrome/browser/ui/webui/settings/settings_ui_android.h" - #include "chrome/browser/android/dom_distiller/distiller_ui_handle_android.h" - #include "chrome/browser/facilitated_payments/payment_link_handler_binder.h" - #include "chrome/browser/offline_pages/android/offline_page_auto_fetcher.h" ++#error "Check this patch" ++#endif + RegisterWebUIControllerInterfaceBinder< + customize_color_scheme_mode::mojom:: + CustomizeColorSchemeModeHandlerFactory, +@@ -582,6 +600,9 @@ void PopulateChromeWebUIFrameBinders( + CertificateManagerUI>(map); + #endif // BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) + ++#if BUILDFLAG(IS_ANDROID) ++#error "Check this patch" ++#endif + RegisterWebUIControllerInterfaceBinder< + help_bubble::mojom::HelpBubbleHandlerFactory, UserEducationInternalsUI, + settings::SettingsUI, ReadingListUI, NewTabPageUI, CustomizeChromeUI, diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn @@ -480,7 +524,7 @@ diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resourc diff --git a/chrome/browser/resources/settings/page_visibility.ts b/chrome/browser/resources/settings/page_visibility.ts --- a/chrome/browser/resources/settings/page_visibility.ts +++ b/chrome/browser/resources/settings/page_visibility.ts -@@ -42,8 +42,49 @@ export interface PrivacyPageVisibility { +@@ -42,8 +42,46 @@ export interface PrivacyPageVisibility { searchPrediction: boolean; } @@ -490,9 +534,6 @@ diff --git a/chrome/browser/resources/settings/page_visibility.ts b/chrome/brows + chrome.autofillPrivate = { + isUserEligibleForAutofillImprovements(): Promise { + return Promise.resolve(false); -+ }, -+ hasUserAnnotationsEntries(): Promise { -+ return Promise.resolve(false); + } + }; + @@ -776,7 +817,7 @@ diff --git a/chrome/browser/search/background/BUILD.gn b/chrome/browser/search/b diff --git a/chrome/browser/search_engines/android/BUILD.gn b/chrome/browser/search_engines/android/BUILD.gn --- a/chrome/browser/search_engines/android/BUILD.gn +++ b/chrome/browser/search_engines/android/BUILD.gn -@@ -80,12 +80,14 @@ android_resources("java_resources") { +@@ -80,6 +80,7 @@ android_resources("java_resources") { "java/res/layout/blocking_choice_dialog.xml", "java/res/layout/default_search_engine_dialog_view.xml", "java/res/layout/search_engine_choice_header.xml", @@ -784,13 +825,6 @@ diff --git a/chrome/browser/search_engines/android/BUILD.gn b/chrome/browser/sea "java/res/layout/search_engine_recent_title.xml", "java/res/layout/search_engine_with_logo.xml", "java/res/values/dimens.xml", - "java/res/values/ids.xml", - ] - deps = [ -+ "//chrome/browser/search/background:ntp_background_proto", - "//chrome/browser/ui/android/strings:ui_strings_grd", - "//components/browser_ui/styles/android:java_resources", - "//components/browser_ui/widget/android:java_resources", diff --git a/chrome/browser/search_engines/android/java/res/layout/search_engine_layout.xml b/chrome/browser/search_engines/android/java/res/layout/search_engine_layout.xml new file mode 100644 --- /dev/null @@ -1108,17 +1142,7 @@ diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/u diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui/favicon_source.cc --- a/chrome/browser/ui/webui/favicon_source.cc +++ b/chrome/browser/ui/webui/favicon_source.cc -@@ -13,7 +13,9 @@ - #include "chrome/browser/favicon/favicon_service_factory.h" - #include "chrome/browser/favicon/favicon_utils.h" - #include "chrome/browser/favicon/history_ui_favicon_request_handler_factory.h" -+#if !BUILDFLAG(IS_ANDROID) - #include "chrome/browser/history/top_sites_factory.h" -+#endif - #include "chrome/browser/profiles/profile.h" - #include "chrome/common/url_constants.h" - #include "chrome/common/webui_url_constants.h" -@@ -22,9 +24,11 @@ +@@ -22,9 +22,11 @@ #include "components/history/core/browser/top_sites.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" @@ -1130,7 +1154,7 @@ diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/resource/resource_bundle.h" #include "ui/base/resource/resource_scale_factor.h" -@@ -226,6 +230,7 @@ bool FaviconSource::ShouldServiceRequest( +@@ -226,6 +228,7 @@ bool FaviconSource::ShouldServiceRequest( render_process_id); } @@ -1138,7 +1162,7 @@ diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui ui::NativeTheme* FaviconSource::GetNativeTheme( const content::WebContents::Getter& wc_getter) { #if BUILDFLAG(IS_ANDROID) -@@ -234,6 +239,7 @@ ui::NativeTheme* FaviconSource::GetNativeTheme( +@@ -234,6 +237,7 @@ ui::NativeTheme* FaviconSource::GetNativeTheme( return webui::GetNativeThemeDeprecated(wc_getter.Run()); #endif } @@ -1146,7 +1170,7 @@ diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui void FaviconSource::OnFaviconDataAvailable( content::URLDataSource::GotDataCallback callback, -@@ -257,7 +263,11 @@ void FaviconSource::SendDefaultResponse( +@@ -257,7 +261,11 @@ void FaviconSource::SendDefaultResponse( parsed.device_scale_factor, parsed.force_light_mode ? false @@ -1158,7 +1182,7 @@ diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui return; } int icon_size = std::ceil(parsed.size_in_dip * parsed.device_scale_factor); -@@ -277,7 +287,11 @@ void FaviconSource::SendDefaultResponse( +@@ -277,7 +285,11 @@ void FaviconSource::SendDefaultResponse( SendDefaultResponse(std::move(callback), 16, 1.0f, force_light_mode ? false @@ -1170,7 +1194,7 @@ diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui } void FaviconSource::SendDefaultResponse( -@@ -287,6 +301,7 @@ void FaviconSource::SendDefaultResponse( +@@ -287,6 +299,7 @@ void FaviconSource::SendDefaultResponse( bool dark_mode) { int resource_id; switch (size_in_dip) { @@ -1178,7 +1202,7 @@ diff --git a/chrome/browser/ui/webui/favicon_source.cc b/chrome/browser/ui/webui case 64: resource_id = dark_mode ? IDR_DEFAULT_FAVICON_DARK_64 : IDR_DEFAULT_FAVICON_64; -@@ -295,6 +310,7 @@ void FaviconSource::SendDefaultResponse( +@@ -295,6 +308,7 @@ void FaviconSource::SendDefaultResponse( resource_id = dark_mode ? IDR_DEFAULT_FAVICON_DARK_32 : IDR_DEFAULT_FAVICON_32; break; @@ -2266,6 +2290,15 @@ diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_ele web_component_files += [ "cr_a11y_announcer/cr_a11y_announcer.ts" ] non_web_component_files += [ +@@ -144,7 +144,7 @@ build_webui("build") { + ] + } + +- if (!is_android && !is_ios) { ++ if (!is_ios) { + non_web_component_files += [ + "cr_container_shadow_mixin.ts", + "cr_radio_button/cr_radio_button_mixin.ts", @@ -240,7 +240,7 @@ build_webui("build") { "../js:build_ts", "//third_party/lit/v3_0:build_ts", diff --git a/build/patches/Experimental-user-scripts-support.patch b/build/patches/Experimental-user-scripts-support.patch index 44891ce9..a67fe711 100644 --- a/build/patches/Experimental-user-scripts-support.patch +++ b/build/patches/Experimental-user-scripts-support.patch @@ -2578,7 +2578,7 @@ new file mode 100644 --- /dev/null +++ b/components/user_scripts/browser/resources/browser_resources.grd @@ -0,0 +1,14 @@ -+ ++ + + + @@ -2592,7 +2592,6 @@ new file mode 100644 + + + -\ No newline at end of file diff --git a/components/user_scripts/browser/resources/user-script-ui/BUILD.gn b/components/user_scripts/browser/resources/user-script-ui/BUILD.gn new file mode 100644 --- /dev/null @@ -7587,7 +7586,7 @@ new file mode 100755 +++ b/components/user_scripts/renderer/resources/user_scripts_renderer_resources.grd @@ -0,0 +1,14 @@ + -+ ++ + + + diff --git a/build/patches/Eyeo-Adblock-for-Cromite.patch b/build/patches/Eyeo-Adblock-for-Cromite.patch index aebd1cc7..84b75420 100644 --- a/build/patches/Eyeo-Adblock-for-Cromite.patch +++ b/build/patches/Eyeo-Adblock-for-Cromite.patch @@ -9,7 +9,7 @@ suit Cromite logic. .../adblock_chrome_content_browser_client.cc | 6 + .../adblock_chrome_content_browser_client.h | 4 + chrome/browser/adblock/android/BUILD.gn | 2 +- - .../adblock/android/adblock_strings.grd | 54 +- + .../adblock/android/adblock_strings.grd | 56 +- .../java/res/layout/adblock_custom_item.xml | 14 +- .../layout/adblock_filter_lists_list_item.xml | 15 + ...ences.xml => eyeo_adblock_preferences.xml} | 42 +- @@ -80,10 +80,10 @@ suit Cromite logic. .../converter/parser/url_filter_options.cc | 21 +- .../serializer/flatbuffer_serializer.cc | 102 +- components/adblock/core/features.cc | 6 +- - .../core/net/adblock_resource_request_impl.cc | 21 +- + .../core/net/adblock_resource_request_impl.cc | 26 +- components/adblock/core/resources/.gitignore | 2 +- components/adblock/core/resources/BUILD.gn | 5 +- - .../core/resources/adblock_resources.grd | 3 - + .../core/resources/adblock_resources.grd | 5 +- .../core/resources/elemhide_for_selector.jst | 4 +- .../adblock/core/resources/elemhideemu.jst | 2 + .../resources/snippets/dist/dependencies.jst | 1690 ++++++ @@ -125,7 +125,7 @@ suit Cromite logic. .../renderer/core/exported/web_document.cc | 13 +- .../blink/renderer/core/html/html_element.cc | 8 +- .../definitions/adblock_private.d.ts | 14 + - 120 files changed, 9154 insertions(+), 610 deletions(-) + 120 files changed, 9157 insertions(+), 616 deletions(-) rename chrome/browser/adblock/android/java/res/xml/{adblock_preferences.xml => eyeo_adblock_preferences.xml} (59%) create mode 100644 chrome/browser/resources/settings/adblock_page/adblock_page.html create mode 100644 chrome/browser/resources/settings/adblock_page/adblock_page.ts @@ -226,6 +226,15 @@ diff --git a/chrome/browser/adblock/android/BUILD.gn b/chrome/browser/adblock/an diff --git a/chrome/browser/adblock/android/adblock_strings.grd b/chrome/browser/adblock/android/adblock_strings.grd --- a/chrome/browser/adblock/android/adblock_strings.grd +++ b/chrome/browser/adblock/android/adblock_strings.grd +@@ -15,7 +15,7 @@ + You should have received a copy of the GNU General Public License + along with eyeo Chromium SDK. If not, see . + --> +- ++ + + + @@ -186,10 +186,52 @@ @@ -4382,6 +4391,19 @@ diff --git a/components/adblock/core/net/adblock_resource_request_impl.cc b/comp auto request = std::make_unique(); request->url = url_; request->method = MethodToString(); +@@ -181,11 +166,8 @@ void AdblockResourceRequestImpl::OnDownloadFinished( + return; + } + +- GURL::Replacements strip_query; +- strip_query.ClearQuery(); +- GURL url = url_.ReplaceComponents(strip_query); + response_callback_.Run( +- url, std::move(downloaded_file), ++ url_, std::move(downloaded_file), + loader_->ResponseInfo() ? loader_->ResponseInfo()->headers : nullptr); + // response_callback_ may delete this, do not call any member variables now. + } diff --git a/components/adblock/core/resources/.gitignore b/components/adblock/core/resources/.gitignore --- a/components/adblock/core/resources/.gitignore +++ b/components/adblock/core/resources/.gitignore @@ -4413,6 +4435,15 @@ diff --git a/components/adblock/core/resources/BUILD.gn b/components/adblock/cor diff --git a/components/adblock/core/resources/adblock_resources.grd b/components/adblock/core/resources/adblock_resources.grd --- a/components/adblock/core/resources/adblock_resources.grd +++ b/components/adblock/core/resources/adblock_resources.grd +@@ -15,7 +15,7 @@ + You should have received a copy of the GNU General Public License + along with eyeo Chromium SDK. If not, see . + --> +- ++ + + + @@ -30,9 +30,6 @@ diff --git a/build/patches/Keep-Manta-Service-Disabled.patch b/build/patches/Keep-Manta-Service-Disabled.patch index f029a185..995292b9 100644 --- a/build/patches/Keep-Manta-Service-Disabled.patch +++ b/build/patches/Keep-Manta-Service-Disabled.patch @@ -3,13 +3,13 @@ Date: Tue, 31 Oct 2023 16:20:12 +0000 Subject: Keep Manta Service Disabled --- - components/manta/features.cc | 2 ++ - 1 file changed, 2 insertions(+) + components/manta/features.cc | 7 +++++++ + 1 file changed, 7 insertions(+) diff --git a/components/manta/features.cc b/components/manta/features.cc --- a/components/manta/features.cc +++ b/components/manta/features.cc -@@ -9,6 +9,7 @@ +@@ -9,36 +9,43 @@ namespace manta::features { BASE_FEATURE(kMantaService, "MantaService", base::FEATURE_ENABLED_BY_DEFAULT); @@ -17,7 +17,11 @@ diff --git a/components/manta/features.cc b/components/manta/features.cc // Enables Anchovy Prod Server BASE_FEATURE(kAnchovyUseProdServer, -@@ -19,6 +20,7 @@ BASE_FEATURE(kAnchovyUseProdServer, + "AnchovyUseProdServer", + base::FEATURE_ENABLED_BY_DEFAULT); ++SET_CROMITE_FEATURE_DISABLED(kAnchovyUseProdServer); + + // Enables Orca Prod Server BASE_FEATURE(kOrcaUseProdServer, "OrcaUseProdServer", base::FEATURE_ENABLED_BY_DEFAULT); @@ -25,4 +29,28 @@ diff --git a/components/manta/features.cc b/components/manta/features.cc // Enables Scanner Prod Server BASE_FEATURE(kScannerUseProdServer, + "ScannerUseProdServer", + base::FEATURE_ENABLED_BY_DEFAULT); ++SET_CROMITE_FEATURE_DISABLED(kScannerUseProdServer); + + // Enables SeaPen Prod Server + BASE_FEATURE(kSeaPenUseProdServer, + "SeaPenUseProdServer", + base::FEATURE_ENABLED_BY_DEFAULT); ++SET_CROMITE_FEATURE_DISABLED(kSeaPenUseProdServer); + + // Enables Mahi Prod Server + BASE_FEATURE(kMahiUseProdServer, + "MahiUseProdServer", + base::FEATURE_ENABLED_BY_DEFAULT); ++SET_CROMITE_FEATURE_DISABLED(kMahiUseProdServer); + + // Enables Walrus Prod Server + BASE_FEATURE(kWalrusUseProdServer, + "WalrusUseProdServer", + base::FEATURE_ENABLED_BY_DEFAULT); ++SET_CROMITE_FEATURE_DISABLED(kWalrusUseProdServer); + + bool IsMantaServiceEnabled() { + return base::FeatureList::IsEnabled(kMantaService); -- diff --git a/build/patches/Keep-empty-tabs-between-sessions.patch b/build/patches/Keep-empty-tabs-between-sessions.patch index afb05208..1d437500 100644 --- a/build/patches/Keep-empty-tabs-between-sessions.patch +++ b/build/patches/Keep-empty-tabs-between-sessions.patch @@ -5,9 +5,22 @@ Subject: Keep empty tabs between sessions Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- + .../browser/multiwindow/MultiWindowUtils.java | 2 +- .../browser/tabmodel/TabPersistentStore.java | 15 --------------- - 1 file changed, 15 deletions(-) + 2 files changed, 1 insertion(+), 16 deletions(-) +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java +@@ -915,7 +915,7 @@ public class MultiWindowUtils implements ActivityStateListener { + for (TabModel model : models) { + for (int i = 0; i < model.getCount(); i++) { + Tab tab = model.getTabAt(i); +- if (!TabPersistentStore.shouldSkipTab(tab)) { ++ if ((true)) { + totalCount++; + } + } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java diff --git a/build/patches/Move-navigation-bar-to-bottom.patch b/build/patches/Move-navigation-bar-to-bottom.patch index 41442c83..c0d2f180 100644 --- a/build/patches/Move-navigation-bar-to-bottom.patch +++ b/build/patches/Move-navigation-bar-to-bottom.patch @@ -325,8 +325,8 @@ diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser public static final WritableObjectPropertyKey> WIDTH_PX_CALLBACK = new WritableObjectPropertyKey<>(); -+ public static final PropertyModel.WritableIntPropertyKey PRIMARY_COLOR = -+ new PropertyModel.WritableIntPropertyKey(); ++ public static final WritableObjectPropertyKey PRIMARY_COLOR = ++ new WritableObjectPropertyKey<>(); + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] { @@ -1311,9 +1311,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage. import org.chromium.url.GURL; +import org.chromium.chrome.browser.flags.ChromeFeatureList; - import java.util.List; - -@@ -768,11 +769,16 @@ public class NewTabPage + import androidx.annotation.NonNull; + import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener; +@@ -772,11 +773,16 @@ public class NewTabPage final int topControlsDistanceToRest = mBrowserControlsStateProvider.getContentOffset() - mBrowserControlsStateProvider.getTopControlsHeight(); @@ -1332,7 +1332,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage. if (topMargin != layoutParams.topMargin || bottomMargin != layoutParams.bottomMargin) { layoutParams.topMargin = topMargin; -@@ -788,9 +794,7 @@ public class NewTabPage +@@ -792,9 +798,7 @@ public class NewTabPage * strip. */ private int getToolbarExtraYOffset() { diff --git a/build/patches/Multiple-fingerprinting-mitigations.patch b/build/patches/Multiple-fingerprinting-mitigations.patch index 7d9fa8f7..f7038e7e 100644 --- a/build/patches/Multiple-fingerprinting-mitigations.patch +++ b/build/patches/Multiple-fingerprinting-mitigations.patch @@ -606,7 +606,7 @@ diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image.cc #include "v8/include/v8.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" -+#include "third_party/skia/include/private/SkColorData.h" ++#include "third_party/skia/src/core/SkColorData.h" + namespace blink { diff --git a/build/patches/Partition-HSTS-cache-by-NAK.patch b/build/patches/Partition-HSTS-cache-by-NAK.patch index 603e34f2..f813766e 100644 --- a/build/patches/Partition-HSTS-cache-by-NAK.patch +++ b/build/patches/Partition-HSTS-cache-by-NAK.patch @@ -13,6 +13,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../web_package/signed_exchange_loader.h | 2 + .../signed_exchange_prefetch_handler.cc | 2 +- .../signed_exchange_request_handler.cc | 1 + + .../Partition-HSTS-cache-by-NAK.inc | 1 + net/http/transport_security_state.cc | 103 ++++++++++++------ net/http/transport_security_state.h | 39 ++++--- net/quic/crypto/proof_verifier_chromium.cc | 5 +- @@ -22,10 +23,11 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html net/spdy/spdy_session.h | 3 +- .../url_request_context_builder.cc | 14 --- net/url_request/url_request_http_job.cc | 5 +- - services/network/network_context.cc | 31 ++++-- - services/network/network_context.h | 13 ++- - .../public/mojom/network_context.mojom | 9 +- - 21 files changed, 173 insertions(+), 102 deletions(-) + services/network/network_context.cc | 37 ++++--- + services/network/network_context.h | 15 ++- + .../public/mojom/network_context.mojom | 10 +- + 22 files changed, 181 insertions(+), 104 deletions(-) + create mode 100644 cromite_flags/net/base/features_cc/Partition-HSTS-cache-by-NAK.inc diff --git a/chrome/browser/ssl/https_upgrades_interceptor.cc b/chrome/browser/ssl/https_upgrades_interceptor.cc --- a/chrome/browser/ssl/https_upgrades_interceptor.cc @@ -217,6 +219,12 @@ diff --git a/content/browser/web_package/signed_exchange_request_handler.cc b/co frame_tree_node_id_, accept_langs_, false /* keep_entry_for_prefetch_cache */); +diff --git a/cromite_flags/net/base/features_cc/Partition-HSTS-cache-by-NAK.inc b/cromite_flags/net/base/features_cc/Partition-HSTS-cache-by-NAK.inc +new file mode 100644 +--- /dev/null ++++ b/cromite_flags/net/base/features_cc/Partition-HSTS-cache-by-NAK.inc +@@ -0,0 +1 @@ ++SET_CROMITE_FEATURE_DISABLED(kHstsTopLevelNavigationsOnly); diff --git a/net/http/transport_security_state.cc b/net/http/transport_security_state.cc --- a/net/http/transport_security_state.cc +++ b/net/http/transport_security_state.cc @@ -802,7 +810,32 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont pending_cert_verify->ocsp_result = ocsp_result; pending_cert_verify->sct_list = sct_list; pending_cert_verify->ct_verification_mode = ct_verification_mode; -@@ -2121,17 +2123,19 @@ void NetworkContext::SetCorsOriginAccessListsForOrigin( +@@ -2082,20 +2084,22 @@ void NetworkContext::VerifyCertInternal( + void NetworkContext::VerifyCert( + const scoped_refptr& certificate, + const net::HostPortPair& host_port, ++ const net::NetworkAnonymizationKey& network_anonymization_key, + const std::string& ocsp_result, + const std::string& sct_list, + VerifyCertCallback callback) { +- VerifyCertInternal(certificate, host_port, ocsp_result, sct_list, ++ VerifyCertInternal(certificate, host_port, network_anonymization_key, ocsp_result, sct_list, + CTVerificationMode::kTlsCertificate, std::move(callback)); + } + + void NetworkContext::VerifyCertForSignedExchange( + const scoped_refptr& certificate, + const net::HostPortPair& host_port, ++ const net::NetworkAnonymizationKey& network_anonymization_key, + const std::string& ocsp_result, + const std::string& sct_list, + VerifyCertCallback callback) { +- VerifyCertInternal(certificate, host_port, ocsp_result, sct_list, ++ VerifyCertInternal(certificate, host_port, network_anonymization_key, ocsp_result, sct_list, + CTVerificationMode::kSignedExchange, std::move(callback)); + } + +@@ -2121,17 +2125,19 @@ void NetworkContext::SetCorsOriginAccessListsForOrigin( std::move(callback).Run(); } @@ -825,7 +858,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont bool is_top_level_nav, IsHSTSActiveForHostCallback callback) { net::TransportSecurityState* security_state = -@@ -2143,10 +2147,10 @@ void NetworkContext::IsHSTSActiveForHost(const std::string& host, +@@ -2143,10 +2149,10 @@ void NetworkContext::IsHSTSActiveForHost(const std::string& host, } std::move(callback).Run( @@ -838,7 +871,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont GetHSTSStateCallback callback) { base::Value::Dict result; -@@ -2184,10 +2188,10 @@ void NetworkContext::GetHSTSState(const std::string& domain, +@@ -2184,10 +2190,10 @@ void NetworkContext::GetHSTSState(const std::string& domain, net::TransportSecurityState::STSState dynamic_sts_state; net::TransportSecurityState::PKPState dynamic_pkp_state; bool found_sts_dynamic = transport_security_state->GetDynamicSTSState( @@ -851,7 +884,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont if (found_sts_dynamic) { result.Set("dynamic_upgrade_mode", static_cast(dynamic_sts_state.upgrade_mode)); -@@ -2225,6 +2229,7 @@ void NetworkContext::GetHSTSState(const std::string& domain, +@@ -2225,6 +2231,7 @@ void NetworkContext::GetHSTSState(const std::string& domain, } void NetworkContext::DeleteDynamicDataForHost( @@ -859,7 +892,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont const std::string& host, DeleteDynamicDataForHostCallback callback) { net::TransportSecurityState* transport_security_state = -@@ -2235,7 +2240,7 @@ void NetworkContext::DeleteDynamicDataForHost( +@@ -2235,7 +2242,7 @@ void NetworkContext::DeleteDynamicDataForHost( } std::move(callback).Run( @@ -868,7 +901,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont } void NetworkContext::EnableStaticKeyPinningForTesting( -@@ -2279,7 +2284,7 @@ void NetworkContext::PreconnectSockets( +@@ -2279,7 +2286,7 @@ void NetworkContext::PreconnectSockets( DCHECK(!require_network_anonymization_key_ || !network_anonymization_key.IsEmpty()); @@ -877,7 +910,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont // |PreconnectSockets| may receive arguments from the renderer, which is not // guaranteed to validate them. -@@ -3092,7 +3097,9 @@ void NetworkContext::OnConnectionError() { +@@ -3092,7 +3099,9 @@ void NetworkContext::OnConnectionError() { } } @@ -888,7 +921,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont // TODO(lilyhoughton) This needs to be gotten rid of once explicit // construction with a URLRequestContext is no longer supported. -@@ -3118,6 +3125,7 @@ GURL NetworkContext::GetHSTSRedirectForPreconnect(const GURL& original_url) { +@@ -3118,6 +3127,7 @@ GURL NetworkContext::GetHSTSRedirectForPreconnect(const GURL& original_url) { // top-level navigation so we need to disallow HSTS upgrades for every // preconnect. if (!url_request_context_->transport_security_state()->ShouldUpgradeToSSL( @@ -896,7 +929,7 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont original_url.host(), /*is_top_level_nav=*/false)) { RecordHSTSPreconnectUpgradeReason( HSTSRedirectUpgradeReason::kNotUpgradedNoHSTSPin); -@@ -3167,7 +3175,8 @@ void NetworkContext::OnVerifyCertComplete(uint64_t cert_verify_id, int result) { +@@ -3167,7 +3177,8 @@ void NetworkContext::OnVerifyCertComplete(uint64_t cert_verify_id, int result) { url_request_context_->transport_security_state()->CheckPublicKeyPins( pending_cert_verify->host_port.host(), pending_cert_verify->result->is_issued_by_known_root, @@ -909,7 +942,14 @@ diff --git a/services/network/network_context.cc b/services/network/network_cont diff --git a/services/network/network_context.h b/services/network/network_context.h --- a/services/network/network_context.h +++ b/services/network/network_context.h -@@ -414,19 +414,22 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext +@@ -408,25 +408,29 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext + mojo::PendingReceiver receiver) override; + void VerifyCert(const scoped_refptr& certificate, + const net::HostPortPair& host_port, ++ const net::NetworkAnonymizationKey& network_anonymization_key, + const std::string& ocsp_result, + const std::string& sct_list, + VerifyCertCallback callback) override; void VerifyCertForSignedExchange( const scoped_refptr& certificate, const net::HostPortPair& host_port, @@ -935,7 +975,7 @@ diff --git a/services/network/network_context.h b/services/network/network_conte const std::string& host, DeleteDynamicDataForHostCallback callback) override; void SetCorsOriginAccessListsForOrigin( -@@ -769,7 +772,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext +@@ -769,7 +773,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext mojo::PendingRemote cookie_observer, net::FirstPartySetMetadata first_party_set_metadata); @@ -945,7 +985,15 @@ diff --git a/services/network/network_context.h b/services/network/network_conte #if BUILDFLAG(IS_P2P_ENABLED) void DestroySocketManager(P2PSocketManager* socket_manager); -@@ -975,6 +979,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext +@@ -781,6 +786,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext + void VerifyCertInternal( + const scoped_refptr& certificate, + const net::HostPortPair& host_port, ++ const net::NetworkAnonymizationKey& network_anonymization_key, + const std::string& ocsp_result, + const std::string& sct_list, + CTVerificationMode ct_verification_mode, +@@ -975,6 +981,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext VerifyCertCallback callback; scoped_refptr certificate; net::HostPortPair host_port; @@ -956,7 +1004,15 @@ diff --git a/services/network/network_context.h b/services/network/network_conte diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom -@@ -1530,24 +1530,25 @@ interface NetworkContext { +@@ -1522,6 +1522,7 @@ interface NetworkContext { + // Checks the given certificate against the CertVerifier and CTVerifier. + VerifyCert(X509Certificate certificate, + HostPortPair host_port, ++ NetworkAnonymizationKey network_anonymization_key, + string ocsp_response, + string sct_list) + => (int32 error_code, CertVerifyResult cv_result, bool pkp_bypassed); +@@ -1530,24 +1531,25 @@ interface NetworkContext { // This implementation is specific for use by Signed Exchange. VerifyCertForSignedExchange(X509Certificate certificate, HostPortPair host_port, @@ -985,7 +1041,7 @@ diff --git a/services/network/public/mojom/network_context.mojom b/services/netw // Sets allowed and blocked origins respectively for the URLLoaderFactory // consumers to access beyond the same-origin policy. The list is managed per -@@ -1566,7 +1567,7 @@ interface NetworkContext { +@@ -1566,7 +1568,7 @@ interface NetworkContext { // Deletes any dynamic data stored for |host| from the transport // security state. Returns true iff an entry was deleted. // See net::TransportSecurityState::DeleteDynamicDataForHost for more detail. diff --git a/build/patches/Remove-binary-blob-integrations.patch b/build/patches/Remove-binary-blob-integrations.patch index 7af8e115..1fb6a20a 100644 --- a/build/patches/Remove-binary-blob-integrations.patch +++ b/build/patches/Remove-binary-blob-integrations.patch @@ -108,9 +108,9 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html third_party/android_deps/BUILD.gn | 704 +----------------- .../preconditions/javatests/BUILD.gn | 1 - .../gms/ChromiumPlayServicesAvailability.java | 10 +- - third_party/androidx/customizations.gni | 13 +- + third_party/androidx/customizations.gni | 14 +- third_party/cardboard/BUILD.gn | 4 - - 86 files changed, 126 insertions(+), 2291 deletions(-) + 86 files changed, 127 insertions(+), 2291 deletions(-) create mode 100644 components/webauthn/android/java/src/org/chromium/components/webauthn/ConditionalUiState.java diff --git a/android_webview/expectations/system_webview_bundle.AndroidManifest.expected b/android_webview/expectations/system_webview_bundle.AndroidManifest.expected @@ -4579,12 +4579,13 @@ diff --git a/third_party/androidx/customizations.gni b/third_party/androidx/cust _androidx_prebuilt(target_name) { forward_variables_from(invoker, "*") target_type = "android_aar_prebuilt" -@@ -172,6 +172,17 @@ template("androidx_android_aar_prebuilt") { +@@ -172,6 +172,18 @@ template("androidx_android_aar_prebuilt") { } } +template("androidx_android_aar_prebuilt") { -+ if (target_name == "androidx_credentials_credentials_play_services_auth_java") { ++ if (target_name == "androidx_credentials_credentials_play_services_auth_java" ++ || target_name == "androidx_credentials_registry_registry_provider_play_services_java") { + forward_variables_from(invoker, "*") + not_needed(["deps", "aar_path", "info_path", "enable_bytecode_checks"]) + } else { diff --git a/build/patches/Remove-support-for-device-memory-and-cpu-recovery.patch b/build/patches/Remove-support-for-device-memory-and-cpu-recovery.patch index c14ea396..62bbc45c 100644 --- a/build/patches/Remove-support-for-device-memory-and-cpu-recovery.patch +++ b/build/patches/Remove-support-for-device-memory-and-cpu-recovery.patch @@ -4,7 +4,7 @@ Subject: Remove support for device memory and cpu recovery License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- - .../v8_memory/web_memory_impl.cc | 8 ++++++++ + .../v8_memory/web_memory_impl.cc | 6 ++++++ ...ort-for-device-memory-and-cpu-recovery.inc | 3 +++ ...ort-for-device-memory-and-cpu-recovery.inc | 2 ++ .../browser/blob/blob_memory_controller.cc | 20 ++++++++++--------- @@ -14,7 +14,7 @@ License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html .../measure_memory_controller.cc | 5 +++++ .../blink/renderer/core/timing/memory_info.cc | 14 ++++++++++--- .../core/timing/window_performance.cc | 2 +- - 10 files changed, 68 insertions(+), 18 deletions(-) + 10 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 cromite_flags/third_party/blink/common/features_cc/Remove-support-for-device-memory-and-cpu-recovery.inc create mode 100644 cromite_flags/third_party/blink/common/features_h/Remove-support-for-device-memory-and-cpu-recovery.inc @@ -29,15 +29,13 @@ diff --git a/components/performance_manager/v8_memory/web_memory_impl.cc b/compo namespace performance_manager { -@@ -111,6 +112,13 @@ WebMeasureMemorySecurityChecker::Create() { +@@ -111,6 +112,11 @@ WebMeasureMemorySecurityChecker::Create() { bool WebMeasureMemorySecurityCheckerImpl::IsMeasureMemoryAllowed( const FrameNode* frame) const { + if (!base::FeatureList::IsEnabled( + blink::features::kWebMeasureMemoryViaPerformanceManager)) { -+ std::move(bad_message_callback) -+ .Run("WebMeasureMemoryViaPerformanceManager feature is disabled"); -+ return; ++ return false; + } + // TODO(crbug.com/40132061): The frame may have navigated since it sent the diff --git a/build/patches/Remove-voice-recognition-integration.patch b/build/patches/Remove-voice-recognition-integration.patch index 9734db98..0fcf1f97 100644 --- a/build/patches/Remove-voice-recognition-integration.patch +++ b/build/patches/Remove-voice-recognition-integration.patch @@ -11,8 +11,8 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../SearchActivityLocationBarLayout.java | 8 --- .../tabbed_mode/TabbedRootUiCoordinator.java | 2 +- .../browser/toolbar/ToolbarManager.java | 5 -- - .../ui/AdaptiveToolbarUiCoordinator.java | 41 ------------ - .../chrome/browser/ui/RootUiCoordinator.java | 19 ------ + .../ui/AdaptiveToolbarUiCoordinator.java | 48 -------------- + .../chrome/browser/ui/RootUiCoordinator.java | 18 ----- chrome/browser/ui/android/omnibox/BUILD.gn | 1 - .../chrome/browser/omnibox/LocationBar.java | 6 -- .../omnibox/LocationBarCoordinator.java | 13 ---- @@ -24,7 +24,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../suggestions/AutocompleteMediator.java | 8 --- .../omnibox/voice/VoiceRecognitionUtil.java | 1 + chrome/browser/ui/android/toolbar/BUILD.gn | 1 - - 20 files changed, 9 insertions(+), 253 deletions(-) + 20 files changed, 9 insertions(+), 259 deletions(-) diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java @@ -228,7 +228,16 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/Toolbar diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveToolbarUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveToolbarUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveToolbarUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveToolbarUiCoordinator.java -@@ -40,7 +40,6 @@ import org.chromium.chrome.browser.share.ShareButtonController; +@@ -26,8 +26,6 @@ import org.chromium.chrome.browser.dom_distiller.ReaderModeToolbarButtonControll + import org.chromium.chrome.browser.flags.ChromeFeatureList; + import org.chromium.chrome.browser.identity_disc.IdentityDiscController; + import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; +-import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; +-import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler.VoiceInteractionSource; + import org.chromium.chrome.browser.price_insights.PriceInsightsButtonController; + import org.chromium.chrome.browser.price_tracking.CurrentTabPriceTrackingStateSupplier; + import org.chromium.chrome.browser.price_tracking.PriceTrackingBottomSheetContentCoordinator; +@@ -40,7 +38,6 @@ import org.chromium.chrome.browser.share.ShareButtonController; import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.toolbar.ButtonDataProvider; @@ -236,7 +245,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveTool import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveButtonActionMenuCoordinator; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarBehavior; import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarButtonController; -@@ -68,7 +67,6 @@ public class AdaptiveToolbarUiCoordinator { +@@ -68,7 +65,6 @@ public class AdaptiveToolbarUiCoordinator { private CurrentTabPriceTrackingStateSupplier mCurrentTabPriceTrackingStateSupplier; private ContextualPageActionController mContextualPageActionController; private AdaptiveToolbarButtonController mAdaptiveToolbarButtonController; @@ -244,7 +253,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveTool private BottomSheetController mBottomSheetController; private ObservableSupplier mProfileSupplier; private Supplier mScrimSupplier; -@@ -232,45 +230,6 @@ public class AdaptiveToolbarUiCoordinator { +@@ -232,45 +228,6 @@ public class AdaptiveToolbarUiCoordinator { mButtonDataProviders = List.of(identityDiscController, adaptiveToolbarButtonController); } @@ -290,6 +299,18 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/AdaptiveTool /** * Returns the list of {@link ButtonDataProvider}. The order in which the providers determines * which one will be shown first. +@@ -279,11 +236,6 @@ public class AdaptiveToolbarUiCoordinator { + return mButtonDataProviders; + } + +- /** Returns {@link VoiceToolbarButtonController} used for voice search button. */ +- public VoiceToolbarButtonController getVoiceToolbarButtonController() { +- return mVoiceToolbarButtonController; +- } +- + /** Destroy internally used objects. */ + public void destroy() { + if (mCurrentTabPriceTrackingStateSupplier != null) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java @@ -301,15 +322,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi import org.chromium.chrome.browser.paint_preview.DemoPaintPreview; import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer; import org.chromium.chrome.browser.password_manager.PasswordManagerLauncher; -@@ -130,7 +129,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector; - import org.chromium.chrome.browser.theme.TopUiThemeColorProvider; - import org.chromium.chrome.browser.toolbar.ToolbarIntentMetadata; - import org.chromium.chrome.browser.toolbar.ToolbarManager; --import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarBehavior; - import org.chromium.chrome.browser.toolbar.top.ToolbarActionModeCallback; - import org.chromium.chrome.browser.toolbar.top.ToolbarControlContainer; - import org.chromium.chrome.browser.ui.appmenu.AppMenuBlocker; -@@ -285,7 +283,6 @@ public class RootUiCoordinator +@@ -285,7 +284,6 @@ public class RootUiCoordinator private LayoutManagerImpl mLayoutManager; protected OneshotSupplier mIntentMetadataOneshotSupplier; protected OneshotSupplierImpl mPromoShownOneshotSupplier = new OneshotSupplierImpl<>(); @@ -317,7 +330,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi private MediaCaptureOverlayController mCaptureController; private @Nullable ScrollCaptureManager mScrollCaptureManager; protected final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; -@@ -612,9 +609,6 @@ public class RootUiCoordinator +@@ -612,9 +610,6 @@ public class RootUiCoordinator } if (mToolbarManager != null) { @@ -327,7 +340,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordi mToolbarManager.destroy(); mToolbarManager = null; } -@@ -1488,23 +1482,10 @@ public class RootUiCoordinator +@@ -1488,23 +1483,10 @@ public class RootUiCoordinator if (!mSupportsAppMenuSupplier.getAsBoolean()) { mToolbarManager.getToolbar().disableMenuButton(); } diff --git a/build/patches/Restore-BookmarkToolbar-setCurrentFolder.patch b/build/patches/Restore-BookmarkToolbar-setCurrentFolder.patch index a1fb6712..ac22d56b 100644 --- a/build/patches/Restore-BookmarkToolbar-setCurrentFolder.patch +++ b/build/patches/Restore-BookmarkToolbar-setCurrentFolder.patch @@ -6,17 +6,17 @@ restore https://chromium-review.googlesource.com/c/chromium/src/+/5554182 License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html --- - .../chrome/browser/bookmarks/BookmarkToolbar.java | 14 ++++++++++++++ - .../bookmarks/BookmarkToolbarCoordinator.java | 1 + - .../browser/bookmarks/BookmarkToolbarMediator.java | 1 + - .../bookmarks/BookmarkToolbarProperties.java | 9 +++++++++ - .../bookmarks/BookmarkToolbarViewBinder.java | 4 ++++ - 5 files changed, 29 insertions(+) + .../chrome/browser/bookmarks/BookmarkToolbar.java | 13 +++++++++++++ + .../bookmarks/BookmarkToolbarCoordinator.java | 1 + + .../browser/bookmarks/BookmarkToolbarMediator.java | 1 + + .../bookmarks/BookmarkToolbarProperties.java | 9 +++++++++ + .../bookmarks/BookmarkToolbarViewBinder.java | 4 ++++ + 5 files changed, 28 insertions(+) diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbar.java -@@ -10,10 +10,13 @@ import android.view.MenuItem; +@@ -10,10 +10,12 @@ import android.view.MenuItem; import android.view.View.OnClickListener; import androidx.annotation.IdRes; @@ -24,13 +24,12 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener; import androidx.core.view.MenuCompat; -+import org.chromium.chrome.R; import org.chromium.chrome.browser.bookmarks.BookmarkUiState.BookmarkUiMode; +import org.chromium.components.bookmarks.BookmarkItem; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.browser_ui.util.ToolbarUtils; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar; -@@ -29,8 +32,10 @@ import java.util.function.Function; +@@ -29,8 +31,10 @@ import java.util.function.Function; */ public class BookmarkToolbar extends SelectableListToolbar implements OnMenuItemClickListener, OnClickListener { @@ -41,7 +40,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows private boolean mEditButtonVisible; private boolean mNewFolderButtonVisible; private boolean mNewFolderButtonEnabled; -@@ -58,6 +63,11 @@ public class BookmarkToolbar extends SelectableListToolbar +@@ -58,6 +62,11 @@ public class BookmarkToolbar extends SelectableListToolbar setOnMenuItemClickListener(this); } @@ -53,7 +52,7 @@ diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/brows void setSelectionDelegate(SelectionDelegate selectionDelegate) { mSelectionDelegate = selectionDelegate; getMenu().setGroupEnabled(R.id.selection_mode_menu_group, true); -@@ -161,6 +171,10 @@ public class BookmarkToolbar extends SelectableListToolbar +@@ -161,6 +170,10 @@ public class BookmarkToolbar extends SelectableListToolbar getMenu().findItem(id).setChecked(true); } diff --git a/build/patches/Restore-Simplified-NTP-launch.patch b/build/patches/Restore-Simplified-NTP-launch.patch index 78aabddc..1ccf717e 100644 --- a/build/patches/Restore-Simplified-NTP-launch.patch +++ b/build/patches/Restore-Simplified-NTP-launch.patch @@ -15,12 +15,16 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../android/java/res/layout/ntp_shortcuts.xml | 65 ++++++ chrome/android/java/res/values/attrs.xml | 4 + chrome/android/java/res/values/dimens.xml | 2 + + .../chrome/browser/ChromeTabbedActivity.java | 3 +- + .../browser/TabbedModeTabDelegateFactory.java | 9 +- .../feedback/ChromeFeedbackCollector.java | 1 + .../feedback/SimplifiedNtpFeedbackSource.java | 38 ++++ .../identity_disc/IdentityDiscController.java | 5 +- + .../native_page/NativePageFactory.java | 19 +- .../NativePageNavigationDelegateImpl.java | 2 +- + .../chrome/browser/ntp/NewTabPage.java | 8 +- .../chrome/browser/ntp/NewTabPageLayout.java | 25 ++- - .../SuggestionsNavigationDelegate.java | 17 ++ + .../SuggestionsNavigationDelegate.java | 27 ++- .../mostvisited/MostVisitedSitesBridge.java | 2 +- .../tile/MostVisitedTilesCoordinator.java | 7 +- .../tile/MostVisitedTilesGridLayout.java | 193 ++++++++++++++++++ @@ -33,7 +37,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html .../Restore-Simplified-NTP-launch.inc | 12 ++ .../Restore-Simplified-NTP-launch.inc | 5 + .../Restore-Simplified-NTP-launch.inc | 1 + - 27 files changed, 399 insertions(+), 31 deletions(-) + 31 files changed, 437 insertions(+), 42 deletions(-) create mode 100644 chrome/android/java/res/layout/ntp_shortcuts.xml create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/feedback/SimplifiedNtpFeedbackSource.java create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java @@ -253,6 +257,66 @@ diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res 20dp @dimen/signin_promo_lateral_paddings 17dp +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +@@ -2780,7 +2780,8 @@ public class ChromeTabbedActivity extends ChromeActivity implements MismatchedIn + getToolbarManager().getTabStripHeightSupplier(), + mModuleRegistrySupplier, + mEdgeToEdgeControllerSupplier, +- getStartupMetricsTracker()); ++ getStartupMetricsTracker(), ++ mBookmarkManagerOpenerSupplier); + } + return mTabDelegateFactory; + } +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/TabbedModeTabDelegateFactory.java +@@ -15,6 +15,7 @@ import org.chromium.base.supplier.OneshotSupplier; + import org.chromium.base.supplier.Supplier; + import org.chromium.chrome.browser.app.ChromeActivity; + import org.chromium.chrome.browser.app.tab_activity_glue.ActivityTabWebContentsDelegateAndroid; ++import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener; + import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; + import org.chromium.chrome.browser.compositor.CompositorViewHolder; + import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator; +@@ -82,6 +83,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory { + private final OneshotSupplier mModuleRegistrySupplier; + private final ObservableSupplier mEdgeToEdgeControllerSupplier; + private final StartupMetricsTracker mStartupMetricsTracker; ++ private final ObservableSupplier mBookmarkManagerOpenerSupplier; + + private NativePageFactory mNativePageFactory; + +@@ -111,7 +113,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory { + @NonNull ObservableSupplier tabStripHeightSupplier, + @NonNull OneshotSupplier moduleRegistrySupplier, + @NonNull ObservableSupplier edgeToEdgeControllerSupplier, +- StartupMetricsTracker startupMetricsTracker) { ++ StartupMetricsTracker startupMetricsTracker, ++ @NonNull ObservableSupplier bookmarkManagerOpenerSupplier) { + mActivity = activity; + mAppBrowserControlsVisibilityDelegate = appBrowserControlsVisibilityDelegate; + mShareDelegateSupplier = shareDelegateSupplier; +@@ -138,6 +141,7 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory { + mModuleRegistrySupplier = moduleRegistrySupplier; + mEdgeToEdgeControllerSupplier = edgeToEdgeControllerSupplier; + mStartupMetricsTracker = startupMetricsTracker; ++ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier; + } + + @Override +@@ -204,7 +208,8 @@ public class TabbedModeTabDelegateFactory implements TabDelegateFactory { + mTabStripHeightSupplier, + mModuleRegistrySupplier, + mEdgeToEdgeControllerSupplier, +- mStartupMetricsTracker); ++ mStartupMetricsTracker, ++ mBookmarkManagerOpenerSupplier); + } + return mNativePageFactory.createNativePage(url, candidatePage, tab, pdfInfo); + } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java --- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollector.java @@ -322,6 +386,93 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/I } private ButtonSpec buttonSpecWithDrawableAndDescription( +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java +@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.AlwaysIncognitoLinkInterceptor; + import org.chromium.chrome.browser.app.ChromeActivity; + import org.chromium.chrome.browser.app.download.home.DownloadPage; + import org.chromium.chrome.browser.bookmarks.BookmarkPage; ++import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener; + import org.chromium.chrome.browser.browser_controls.BrowserControlsMarginSupplier; + import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; + import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; +@@ -78,6 +79,7 @@ public class NativePageFactory { + private final OneshotSupplier mModuleRegistrySupplier; + private final ObservableSupplier mEdgeToEdgeControllerSupplier; + private final StartupMetricsTracker mStartupMetricsTracker; ++ private final ObservableSupplier mBookmarkManagerOpenerSupplier; + private NewTabPageUma mNewTabPageUma; + + private NativePageBuilder mNativePageBuilder; +@@ -100,7 +102,8 @@ public class NativePageFactory { + @NonNull ObservableSupplier tabStripHeightSupplier, + @NonNull OneshotSupplier moduleRegistrySupplier, + @NonNull ObservableSupplier edgeToEdgeControllerSupplier, +- @NonNull StartupMetricsTracker startupMetricsTracker) { ++ @NonNull StartupMetricsTracker startupMetricsTracker, ++ @NonNull ObservableSupplier bookmarkManagerOpenerSupplier) { + mActivity = activity; + mBottomSheetController = sheetController; + mBrowserControlsManager = browserControlsManager; +@@ -118,6 +121,7 @@ public class NativePageFactory { + mModuleRegistrySupplier = moduleRegistrySupplier; + mEdgeToEdgeControllerSupplier = edgeToEdgeControllerSupplier; + mStartupMetricsTracker = startupMetricsTracker; ++ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier; + } + + private NativePageBuilder getBuilder() { +@@ -141,7 +145,8 @@ public class NativePageFactory { + mTabStripHeightSupplier, + mModuleRegistrySupplier, + mEdgeToEdgeControllerSupplier, +- mStartupMetricsTracker); ++ mStartupMetricsTracker, ++ mBookmarkManagerOpenerSupplier); + } + return mNativePageBuilder; + } +@@ -174,9 +179,10 @@ public class NativePageFactory { + private final OneshotSupplier mModuleRegistrySupplier; + private final ObservableSupplier mEdgeToEdgeControllerSupplier; + private final StartupMetricsTracker mStartupMetricsTracker; ++ private final ObservableSupplier mBookmarkManagerOpenerSupplier; + + public NativePageBuilder( +- Activity activity, ++ ChromeActivity activity, + Supplier uma, + BottomSheetController sheetController, + BrowserControlsManager browserControlsManager, +@@ -193,7 +199,8 @@ public class NativePageFactory { + ObservableSupplier tabStripHeightSupplier, + OneshotSupplier moduleRegistrySupplier, + ObservableSupplier edgeToEdgeControllerSupplier, +- StartupMetricsTracker startupMetricsTracker) { ++ StartupMetricsTracker startupMetricsTracker, ++ @NonNull ObservableSupplier bookmarkManagerOpenerSupplier) { + mActivity = activity; + mUma = uma; + mBottomSheetController = sheetController; +@@ -212,6 +219,7 @@ public class NativePageFactory { + mModuleRegistrySupplier = moduleRegistrySupplier; + mEdgeToEdgeControllerSupplier = edgeToEdgeControllerSupplier; + mStartupMetricsTracker = startupMetricsTracker; ++ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier; + } + + protected NativePage buildNewTabPage(Tab tab, String url) { +@@ -245,7 +253,8 @@ public class NativePageFactory { + mTabStripHeightSupplier, + mModuleRegistrySupplier, + mEdgeToEdgeControllerSupplier, +- mStartupMetricsTracker); ++ mStartupMetricsTracker, ++ mBookmarkManagerOpenerSupplier); + } + + protected NativePage buildBookmarksPage(Tab tab) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java --- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageNavigationDelegateImpl.java @@ -334,6 +485,38 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/Nat protected final TabModelSelector mTabModelSelector; protected final Tab mTab; +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +@@ -117,6 +117,9 @@ import org.chromium.ui.base.DeviceFormFactor; + import org.chromium.ui.base.WindowAndroid; + import org.chromium.url.GURL; + ++import androidx.annotation.NonNull; ++import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener; ++ + import java.util.List; + + /** Provides functionality when the user interacts with the NTP. */ +@@ -475,7 +478,8 @@ public class NewTabPage + ObservableSupplier tabStripHeightSupplier, + OneshotSupplier moduleRegistrySupplier, + ObservableSupplier edgeToEdgeControllerSupplier, +- StartupMetricsTracker startupMetricsTracker) { ++ StartupMetricsTracker startupMetricsTracker, ++ @NonNull ObservableSupplier bookmarkManagerOpenerSupplier) { + mConstructedTimeNs = System.nanoTime(); + TraceEvent.begin(TAG); + +@@ -499,7 +503,7 @@ public class NewTabPage + + SuggestionsNavigationDelegate navigationDelegate = + new SuggestionsNavigationDelegate( +- activity, profile, nativePageHost, tabModelSelector, mTab); ++ activity, profile, nativePageHost, tabModelSelector, mTab, bookmarkManagerOpenerSupplier); + mNewTabPageManager = + new NewTabPageManagerImpl( + navigationDelegate, profile, nativePageHost, snackbarManager); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java @@ -414,24 +597,38 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageL diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsNavigationDelegate.java -@@ -22,6 +22,11 @@ import org.chromium.ui.base.PageTransition; +@@ -22,16 +22,41 @@ import org.chromium.ui.base.PageTransition; import org.chromium.ui.mojom.WindowOpenDisposition; import org.chromium.url.GURL; ++import androidx.annotation.NonNull; ++import org.chromium.base.supplier.ObservableSupplier; +import org.chromium.chrome.browser.bookmarks.BookmarkUtils; +import org.chromium.chrome.browser.download.DownloadUtils; +import org.chromium.chrome.browser.download.DownloadOpenSource; +import org.chromium.chrome.browser.profiles.OtrProfileId; ++import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener; + /** Extension of {@link NativePageNavigationDelegate} with suggestions-specific methods. */ public class SuggestionsNavigationDelegate extends NativePageNavigationDelegateImpl { -@@ -34,6 +39,18 @@ public class SuggestionsNavigationDelegate extends NativePageNavigationDelegateI ++ private final @NonNull ObservableSupplier mBookmarkManagerOpenerSupplier; ++ + public SuggestionsNavigationDelegate( + Activity activity, + Profile profile, + NativePageHost host, + TabModelSelector tabModelSelector, +- Tab tab) { ++ Tab tab, ++ @NonNull ObservableSupplier bookmarkManagerOpenerSupplier) { super(activity, profile, host, tabModelSelector, tab); - } - ++ mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier; ++ } ++ + public void navigateToBookmarks() { -+ BookmarkUtils.showBookmarkManager(mActivity, mTab.isIncognito()); ++ mBookmarkManagerOpenerSupplier.get() ++ .showBookmarkManager(mActivity, mTab.getProfile()); + } + + public void navigateToDownloadManager() { @@ -440,11 +637,9 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/Sug + otrProfileID = mProfile.getOtrProfileId(); + } + DownloadUtils.showDownloadManager(mActivity, mTab, otrProfileID, DownloadOpenSource.NEW_TAB_PAGE); -+ } -+ + } + /** - * Opens the suggestions page without recording metrics. - * diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java diff --git a/build/patches/Restore-adaptive-button-in-top-toolbar-customization.patch b/build/patches/Restore-adaptive-button-in-top-toolbar-customization.patch index da6633da..22fad924 100644 --- a/build/patches/Restore-adaptive-button-in-top-toolbar-customization.patch +++ b/build/patches/Restore-adaptive-button-in-top-toolbar-customization.patch @@ -7,28 +7,23 @@ Voice button and legacy share/voice functionality is not restored. License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html --- - .../chrome/browser/settings/MainSettings.java | 15 ++------------- - .../segmentation_platform_config.cc | 1 + - .../adaptive/AdaptiveToolbarButtonController.java | 2 +- - .../toolbar/adaptive/AdaptiveToolbarPrefs.java | 2 +- - .../adaptive/AdaptiveToolbarStatePredictor.java | 4 ++++ - ...RadioButtonGroupAdaptiveToolbarPreference.java | 11 ++--------- - ...aptive-button-in-top-toolbar-customization.inc | 1 + - 7 files changed, 12 insertions(+), 24 deletions(-) + .../chrome/browser/settings/MainSettings.java | 9 +-------- + .../segmentation_platform_config.cc | 1 + + .../adaptive/AdaptiveToolbarButtonController.java | 2 +- + .../toolbar/adaptive/AdaptiveToolbarPrefs.java | 2 +- + .../adaptive/AdaptiveToolbarStatePredictor.java | 4 ++++ + .../RadioButtonGroupAdaptiveToolbarPreference.java | 11 ++--------- + ...e-adaptive-button-in-top-toolbar-customization.inc | 1 + + 7 files changed, 11 insertions(+), 19 deletions(-) create mode 100644 cromite_flags/chrome/browser/flags/android/chrome_feature_list_cc/Restore-adaptive-button-in-top-toolbar-customization.inc diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java --- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java -@@ -288,19 +288,8 @@ public class MainSettings extends ChromeBaseSettingsFragment - if (!ChromeFeatureList.sAndroidAppearanceSettings.isEnabled()) { - removePreferenceIfPresent(PREF_APPEARANCE); - -- // LINT.IfChange(InitPrefToolbarShortcut) -- new AdaptiveToolbarStatePredictor( -- getContext(), -- getProfile(), -- /* androidPermissionDelegate= */ null, +@@ -293,14 +293,7 @@ public class MainSettings extends ChromeBaseSettingsFragment + getContext(), + getProfile(), + /* androidPermissionDelegate= */ null, - /* behavior= */ null) - .recomputeUiState( - uiState -> { @@ -37,8 +32,7 @@ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSe - removePreferenceIfPresent(PREF_TOOLBAR_SHORTCUT); - } - }); -+ -+ new AdaptiveToolbarStatePredictor(getContext(), getProfile(), null); ++ /* behavior= */ null); // LINT.ThenChange(//chrome/android/java/src/org/chromium/chrome/browser/appearance/settings/AppearanceSettingsFragment.java:InitPrefToolbarShortcut) // LINT.IfChange(InitPrefUiTheme) diff --git a/build/patches/User-agent-customization.patch b/build/patches/User-agent-customization.patch index 9d077782..09b28b27 100644 --- a/build/patches/User-agent-customization.patch +++ b/build/patches/User-agent-customization.patch @@ -61,7 +61,7 @@ diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webv std::string GetProduct() { - return embedder_support::GetProductAndVersion(); -+ return embedder_support::GetProductAndVersion(UserAgentReductionEnterprisePolicyState::kForceEnabled); ++ return embedder_support::GetProductAndVersion(embedder_support::UserAgentReductionEnterprisePolicyState::kForceEnabled); } std::string GetUserAgent() { @@ -751,7 +751,7 @@ diff --git a/chrome/browser/android/content/content_utils.cc b/chrome/browser/an blink::UserAgentOverride spoofed_ua; spoofed_ua.ua_string_override = content::BuildUserAgentFromOSAndProduct( - kLinuxInfoStr, embedder_support::GetProductAndVersion()); -+ kLinuxInfoStr, embedder_support::GetProductAndVersion(UserAgentReductionEnterprisePolicyState::kForceEnabled)); ++ kLinuxInfoStr, embedder_support::GetProductAndVersion(embedder_support::UserAgentReductionEnterprisePolicyState::kForceEnabled)); spoofed_ua.ua_metadata_override = metadata; spoofed_ua.ua_metadata_override->platform = "Linux"; spoofed_ua.ua_metadata_override->platform_version = diff --git a/build/patches/WIN-Fix-log-to-file.patch b/build/patches/WIN-Fix-log-to-file.patch index 80039efb..8c345988 100644 --- a/build/patches/WIN-Fix-log-to-file.patch +++ b/build/patches/WIN-Fix-log-to-file.patch @@ -6,9 +6,9 @@ Allows log activation without opening the console window. Log rotation enabled by default. --- chrome/common/logging_chrome.cc | 11 ++++++++--- - chrome/common/logging_chrome.h | 5 ++++- + chrome/common/logging_chrome.h | 6 +++++- content/app/content_main.cc | 9 ++++++--- - 3 files changed, 18 insertions(+), 7 deletions(-) + 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/chrome/common/logging_chrome.cc b/chrome/common/logging_chrome.cc --- a/chrome/common/logging_chrome.cc @@ -63,7 +63,7 @@ diff --git a/chrome/common/logging_chrome.cc b/chrome/common/logging_chrome.cc diff --git a/chrome/common/logging_chrome.h b/chrome/common/logging_chrome.h --- a/chrome/common/logging_chrome.h +++ b/chrome/common/logging_chrome.h -@@ -34,9 +34,12 @@ LoggingDestination DetermineLoggingDestination( +@@ -34,10 +34,14 @@ LoggingDestination DetermineLoggingDestination( // write new logs to the latest log file. Otherwise, we reuse the existing file // if exists. base::FilePath SetUpLogFile(const base::FilePath& target_path, bool new_log); @@ -74,9 +74,11 @@ diff --git a/chrome/common/logging_chrome.h b/chrome/common/logging_chrome.h bool RotateLogFile(const base::FilePath& target_path); +#endif ++#if BUILDFLAG(IS_CHROMEOS) #if defined(UNIT_TEST) // Expose the following methods only for tests. -@@ -67,7 +70,7 @@ base::FilePath GetLogFileName(const base::CommandLine& command_line); + +@@ -67,7 +71,7 @@ base::FilePath GetLogFileName(const base::CommandLine& command_line); // otherwise. bool DialogsAreSuppressed(); diff --git a/build/patches/bromite-build-utils.patch b/build/patches/bromite-build-utils.patch index 6bdc2937..f86be8bd 100644 --- a/build/patches/bromite-build-utils.patch +++ b/build/patches/bromite-build-utils.patch @@ -514,7 +514,7 @@ new file mode 100755 +#include "chrome/browser/browser_process.h" +#include "chrome/browser/about_flags.h" +#include "chrome/browser/flags/jni_headers/CromiteNativeUtils_jni.h" -+#include "components/flags_ui/pref_service_flags_storage.h" ++#include "components/webui/flags/pref_service_flags_storage.h" + +#include "base/android/jni_string.h" +