Release 68.0.3440.110

This commit is contained in:
csagan5 2018-08-14 23:50:50 +02:00
parent 3de200030f
commit eb4cbebe2a
No known key found for this signature in database
GPG key ID: 64190A51D85DC0C5
5 changed files with 1289 additions and 605 deletions

View file

@ -1,9 +1,13 @@
# 68.0.3440.110
* add import action to Bookmarks activity page
* use different user-agent version based on Android OS version
# 68.0.3440.90
* reduce rects randomisation by factor of 100
* use a fixed user-agent (fixes https://github.com/bromite/bromite/issues/103)
# 68.0.3440.87
* add export button to Bookmarks activity page
* add export action to Bookmarks activity page
# 68.0.3440.81
* fix issue with filters with an excluded domain option

File diff suppressed because it is too large Load diff

View file

@ -4,32 +4,60 @@ Subject: User Agent: anonymize
Use a fixed device name and Chrome product version.
---
components/version_info/version_info.cc | 2 +-
content/common/user_agent.cc | 20 +++-----------------
2 files changed, 4 insertions(+), 18 deletions(-)
components/version_info/version_info.cc | 17 ++++++++++++-
content/common/user_agent.cc | 45 +++++++++++++++++++--------------
2 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/components/version_info/version_info.cc b/components/version_info/version_info.cc
--- a/components/version_info/version_info.cc
+++ b/components/version_info/version_info.cc
@@ -13,7 +13,7 @@
@@ -7,13 +7,28 @@
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/version.h"
+#include "base/sys_info.h"
#include "build/build_config.h"
#include "components/version_info/version_info_values.h"
namespace version_info {
std::string GetProductNameAndVersionForUserAgent() {
- return "Chrome/" + GetVersionNumber();
+ return "Chrome/68.0.3440.85";
+ int32_t major, minor, bugfix;
+ base::SysInfo::OperatingSystemVersionNumbers(&major,
+ &minor,
+ &bugfix);
+ switch (major) {
+ case 7:
+ return "Chrome/63.0.3239.111";
+ case 6:
+ return "Chrome/63.0.3239.83";
+ case 5:
+ case 4:
+ return "Chrome/62.0.3202.84";
+ }
+ // version 8 and above
+ return "Chrome/67.0.3396.87";
}
std::string GetProductName() {
diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc
--- a/content/common/user_agent.cc
+++ b/content/common/user_agent.cc
@@ -61,25 +61,11 @@ std::string BuildOSCpuInfo() {
@@ -59,26 +59,33 @@ std::string BuildOSCpuInfo() {
architecture_token = "; Win64; IA64";
}
#elif defined(OS_ANDROID)
std::string android_version_str = base::SysInfo::OperatingSystemVersion();
- std::string android_version_str = base::SysInfo::OperatingSystemVersion();
+ int32_t major, minor, bugfix;
+ base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &bugfix);
+ std::string android_version_str = base::StringPrintf("%d.%d.%d", major, minor, bugfix);
- std::string android_info_str;
+ // Send information about the device and buld ID.
+ // Use a common device/build ID based on Android major version.
std::string android_info_str;
-
// Send information about the device.
- // Send information about the device.
- bool semicolon_inserted = false;
- std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename();
- std::string android_device_name = base::SysInfo::HardwareModelName();
@ -37,21 +65,38 @@ diff --git a/content/common/user_agent.cc b/content/common/user_agent.cc
- android_info_str += "; " + android_device_name;
- semicolon_inserted = true;
- }
+ std::string android_info_str = "SM-G920T";
// Append the build ID.
-
- // Append the build ID.
- std::string android_build_id = base::SysInfo::GetAndroidBuildID();
- if (android_build_id.size() > 0) {
- if (!semicolon_inserted) {
- android_info_str += ";";
- }
- android_info_str += " Build/" + android_build_id;
- }
+ android_info_str += " Build/MMB29M";
+ switch (major) {
+ case 7:
+ // Chrome/63.0.3239.111
+ android_info_str = "SM-J730GM Build/NRD90M";
+ break;
+ case 6:
+ // Chrome/63.0.3239.83
+ android_info_str = "SM-G532G Build/MMB29T";
+ break;
+ case 5:
+ // Chrome/62.0.3202.84
+ android_info_str = "A37fw Build/LMY47V";
+ break;
+ case 4:
+ // Chrome/62.0.3202.84
+ android_info_str = "SM-G7102 Build/KOT49H";
+ break;
+ default: // version 8 and above
+ android_info_str = "SM-G950U Build/R16NW";
+ break;
}
#elif (defined(OS_POSIX) && !defined(OS_MACOSX)) || defined(OS_FUCHSIA)
// Should work on any Posix system.
struct utsname unixinfo;
@@ -115,7 +101,7 @@ std::string BuildOSCpuInfo() {
@@ -115,7 +122,7 @@ std::string BuildOSCpuInfo() {
os_minor_version,
os_bugfix_version
#elif defined(OS_ANDROID)

View file

@ -0,0 +1,817 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Wed, 1 Aug 2018 09:19:40 +0200
Subject: Add bookmark import/export actions in bookmarks activity and page
---
.../java/res/menu/bookmark_action_bar_menu.xml | 14 ++
.../browser/bookmarks/BookmarkActionBar.java | 12 ++
.../chrome/browser/bookmarks/BookmarkActivity.java | 19 ++
.../chrome/browser/bookmarks/BookmarkBridge.java | 21 ++
.../chrome/browser/bookmarks/BookmarkDelegate.java | 10 +
.../chrome/browser/bookmarks/BookmarkManager.java | 20 ++
.../chrome/browser/bookmarks/BookmarkPage.java | 1 +
.../java/strings/android_chrome_strings.grd | 6 +
chrome/browser/BUILD.gn | 8 +-
.../browser/android/bookmarks/bookmark_bridge.cc | 219 +++++++++++++++++++++
chrome/browser/android/bookmarks/bookmark_bridge.h | 19 +-
chrome/browser/importer/profile_writer.cc | 2 +
chrome/common/BUILD.gn | 3 +
chrome/utility/BUILD.gn | 7 +-
chrome/utility/importer/bookmark_html_reader.cc | 27 ++-
chrome/utility/importer/bookmark_html_reader.h | 9 +
16 files changed, 387 insertions(+), 10 deletions(-)
diff --git a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
--- a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
+++ b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
@@ -22,6 +22,20 @@
app:showAsAction="ifRoom"
app:iconTint="@color/dark_mode_tint" />
<item
+ android:id="@+id/import_menu_id"
+ android:icon="@drawable/folder_open"
+ android:title="@string/import_bookmarks"
+ android:visible="true"
+ app:showAsAction="ifRoom"
+ app:iconTint="@color/dark_mode_tint" />
+ <item
+ android:id="@+id/export_menu_id"
+ android:icon="@drawable/save"
+ android:title="@string/export_bookmarks"
+ android:visible="true"
+ app:showAsAction="ifRoom"
+ app:iconTint="@color/dark_mode_tint" />
+ <item
android:id="@+id/close_menu_id"
android:icon="@drawable/btn_close"
android:title="@string/bookmark_action_bar_close"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
@@ -82,6 +82,12 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
} else if (menuItem.getItemId() == R.id.search_menu_id) {
mDelegate.openSearchUI();
return true;
+ } else if (menuItem.getItemId() == R.id.import_menu_id) {
+ mDelegate.importBookmarks();
+ return true;
+ } else if (menuItem.getItemId() == R.id.export_menu_id) {
+ mDelegate.exportBookmarks();
+ return true;
}
SelectionDelegate<BookmarkId> selectionDelegate = mDelegate.getSelectionDelegate();
@@ -125,6 +131,8 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
void showLoadingUi() {
setTitle(null);
setNavigationButton(NAVIGATION_BUTTON_NONE);
+ getMenu().findItem(R.id.import_menu_id).setVisible(false);
+ getMenu().findItem(R.id.export_menu_id).setVisible(false);
getMenu().findItem(R.id.search_menu_id).setVisible(false);
getMenu().findItem(R.id.edit_menu_id).setVisible(false);
}
@@ -134,6 +142,8 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
super.showNormalView();
if (mDelegate == null) {
+ getMenu().findItem(R.id.import_menu_id).setVisible(false);
+ getMenu().findItem(R.id.export_menu_id).setVisible(false);
getMenu().findItem(R.id.search_menu_id).setVisible(false);
getMenu().findItem(R.id.edit_menu_id).setVisible(false);
}
@@ -166,6 +176,8 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
public void onFolderStateSet(BookmarkId folder) {
mCurrentFolder = mDelegate.getModel().getBookmarkById(folder);
+ getMenu().findItem(R.id.import_menu_id).setVisible(true);
+ getMenu().findItem(R.id.export_menu_id).setVisible(true);
getMenu().findItem(R.id.search_menu_id).setVisible(true);
getMenu().findItem(R.id.edit_menu_id).setVisible(mCurrentFolder.isEditable());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActivity.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActivity.java
@@ -12,6 +12,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.SnackbarActivity;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.components.bookmarks.BookmarkId;
+import org.chromium.ui.base.ActivityWindowAndroid;
/**
* The activity that displays the bookmark UI on the phone. It keeps a {@link BookmarkManager}
@@ -21,6 +22,7 @@ import org.chromium.components.bookmarks.BookmarkId;
public class BookmarkActivity extends SnackbarActivity {
private BookmarkManager mBookmarkManager;
+ private ActivityWindowAndroid mWindowAndroid;
static final int EDIT_BOOKMARK_REQUEST_CODE = 14;
public static final String INTENT_VISIT_BOOKMARK_ID = "BookmarkEditActivity.VisitBookmarkId";
@@ -32,6 +34,22 @@ public class BookmarkActivity extends SnackbarActivity {
if (TextUtils.isEmpty(url)) url = UrlConstants.BOOKMARKS_URL;
mBookmarkManager.updateForUrl(url);
setContentView(mBookmarkManager.getView());
+
+ final boolean listenToActivityState = true;
+ mWindowAndroid = new ActivityWindowAndroid(this, listenToActivityState);
+ mWindowAndroid.restoreInstanceState(savedInstanceState);
+ mBookmarkManager.setWindow(mWindowAndroid);
+ // Set up the animation placeholder to be the SurfaceView. This disables the
+ // SurfaceView's 'hole' clipping during animations that are notified to the window.
+// mWindowAndroid.setAnimationPlaceholderView(
+// mBookmarkManager.getContentViewRenderView().getSurfaceView());
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ mWindowAndroid.saveInstanceState(outState);
}
@Override
@@ -48,6 +66,7 @@ public class BookmarkActivity extends SnackbarActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
+ mWindowAndroid.onActivityResult(requestCode, resultCode, data);
if (requestCode == EDIT_BOOKMARK_REQUEST_CODE && resultCode == RESULT_OK) {
BookmarkId bookmarkId = BookmarkId.getBookmarkIdFromString(data.getStringExtra(
INTENT_VISIT_BOOKMARK_ID));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkType;
import org.chromium.components.url_formatter.UrlFormatter;
+import org.chromium.ui.base.WindowAndroid;
import java.util.ArrayList;
import java.util.List;
@@ -508,6 +509,24 @@ public class BookmarkBridge {
}
/**
+ * Import bookmarks from a selected file.
+ * @param window The current window of the bookmarks activity or page.
+ */
+ public void importBookmarks(WindowAndroid window) {
+ assert mIsNativeBookmarkModelLoaded;
+ nativeImportBookmarks(mNativeBookmarkBridge, window);
+ }
+
+ /**
+ * Export bookmarks to a path selected by the user.
+ * @param window The current window of the bookmarks activity or page.
+ */
+ public void exportBookmarks() {
+ assert mIsNativeBookmarkModelLoaded;
+ nativeExportBookmarks(mNativeBookmarkBridge);
+ }
+
+ /**
* Synchronously gets a list of bookmarks that match the specified search query.
* @param query Keyword used for searching bookmarks.
* @param maxNumberOfResult Maximum number of result to fetch.
@@ -906,6 +925,8 @@ public class BookmarkBridge {
boolean getFolders, boolean getBookmarks, List<BookmarkId> bookmarksList);
private native BookmarkId nativeGetChildAt(long nativeBookmarkBridge, long id, int type,
int index);
+ private native void nativeImportBookmarks(long nativeBookmarkBridge, WindowAndroid window);
+ private native void nativeExportBookmarks(long nativeBookmarkBridge);
private native int nativeGetTotalBookmarkCount(long nativeBookmarkBridge, long id, int type);
private native void nativeSetBookmarkTitle(long nativeBookmarkBridge, long id, int type,
String title);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
@@ -69,6 +69,16 @@ interface BookmarkDelegate {
void openSearchUI();
/**
+ * Imports bookmarks from user-selected file.
+ */
+ void importBookmarks();
+
+ /**
+ * Exports bookmarks to downloads directory.
+ */
+ void exportBookmarks();
+
+ /**
* Dismisses the search UI.
*/
void closeSearchUI();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
@@ -22,6 +22,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.BasicNativePage;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkItem;
import org.chromium.chrome.browser.bookmarks.BookmarkBridge.BookmarkModelObserver;
+import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.favicon.LargeIconBridge;
import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksReader;
import org.chromium.chrome.browser.profiles.Profile;
@@ -30,6 +31,7 @@ import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
import org.chromium.chrome.browser.widget.selection.SelectableListToolbar.SearchDelegate;
import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
import org.chromium.components.bookmarks.BookmarkId;
+import org.chromium.ui.base.ActivityWindowAndroid;
import java.util.Stack;
@@ -53,6 +55,7 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate,
private Activity mActivity;
private ViewGroup mMainView;
private BookmarkModel mBookmarkModel;
+ private ActivityWindowAndroid mWindowAndroid;
private BookmarkUndoController mUndoController;
private final ObserverList<BookmarkUIObserver> mUIObservers = new ObserverList<>();
private BasicNativePage mNativePage;
@@ -269,6 +272,13 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate,
}
/**
+ * Sets the Android window that is used by further intents created by the bookmark activity.
+ */
+ public void setWindow(ActivityWindowAndroid window) {
+ mWindowAndroid = window;
+ }
+
+ /**
* @return Current URL representing the UI state of bookmark manager. If no state has been shown
* yet in this session, on phone return last used state stored in preference; on tablet
* return the url previously set by {@link #updateForUrl(String)}.
@@ -416,6 +426,16 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate,
}
@Override
+ public void importBookmarks() {
+ mBookmarkModel.importBookmarks(mWindowAndroid);
+ }
+
+ @Override
+ public void exportBookmarks() {
+ mBookmarkModel.exportBookmarks();
+ }
+
+ @Override
public void openSearchUI() {
setState(BookmarkUIState.createSearchState());
mSelectableListLayout.onStartSearch();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPage.java
@@ -35,6 +35,7 @@ public class BookmarkPage extends BasicNativePage {
mManager = new BookmarkManager(
activity, false, ((SnackbarManageable) activity).getSnackbarManager());
mManager.setBasicNativePage(this);
+ mManager.setWindow(activity.getWindowAndroid());
mTitle = activity.getString(R.string.bookmarks);
}
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -209,6 +209,12 @@ CHAR-LIMIT guidelines:
<message name="IDS_SEARCH" desc="The label for a search button.">
Search
</message>
+ <message name="IDS_IMPORT_BOOKMARKS" desc="The label for the import bookmarks button.">
+ Import
+ </message>
+ <message name="IDS_EXPORT_BOOKMARKS" desc="The label for an export bookmarks button.">
+ Export
+ </message>
<message name="IDS_SHOW_INFO" desc="The label for a info button to show info.">
Show Info
</message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -135,6 +135,10 @@ jumbo_split_static_library("browser") {
"bitmap_fetcher/bitmap_fetcher_service.h",
"bitmap_fetcher/bitmap_fetcher_service_factory.cc",
"bitmap_fetcher/bitmap_fetcher_service_factory.h",
+ "importer/profile_writer.cc",
+ "importer/profile_writer.h",
+ "bookmarks/bookmark_html_writer.cc",
+ "bookmarks/bookmark_html_writer.h",
"bookmarks/bookmark_model_factory.cc",
"bookmarks/bookmark_model_factory.h",
"bookmarks/bookmark_stats.cc",
@@ -2422,8 +2426,6 @@ jumbo_split_static_library("browser") {
"banners/app_banner_infobar_delegate_desktop.h",
"banners/app_banner_manager_desktop.cc",
"banners/app_banner_manager_desktop.h",
- "bookmarks/bookmark_html_writer.cc",
- "bookmarks/bookmark_html_writer.h",
"certificate_viewer.h",
"chrome_browser_field_trials_desktop.cc",
"chrome_browser_field_trials_desktop.h",
@@ -2510,8 +2512,6 @@ jumbo_split_static_library("browser") {
"importer/importer_uma.h",
"importer/in_process_importer_bridge.cc",
"importer/in_process_importer_bridge.h",
- "importer/profile_writer.cc",
- "importer/profile_writer.h",
"lifetime/browser_close_manager.cc",
"lifetime/browser_close_manager.h",
"lifetime/termination_notification.cc",
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc
--- a/chrome/browser/android/bookmarks/bookmark_bridge.cc
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -9,18 +9,29 @@
#include <memory>
+#include "base/android/content_uri_utils.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
+#include "base/android/path_utils.h"
#include "base/containers/stack.h"
#include "base/containers/stack_container.h"
#include "base/i18n/string_compare.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/utility/importer/bookmark_html_reader.h"
+#include "chrome/browser/bookmarks/bookmark_html_writer.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
+#include "chrome/browser/importer/profile_writer.h"
+#include "chrome/browser/platform_util.h"
+#include "chrome/browser/ui/chrome_select_file_policy.h"
#include "chrome/browser/profiles/incognito_helpers.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_android.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/browser/undo/bookmark_undo_service_factory.h"
+#include "chrome/common/importer/imported_bookmark_entry.h"
+#include "chrome/common/importer/importer_data_types.h"
+#include "chrome/common/url_constants.h"
#include "components/bookmarks/browser/bookmark_model.h"
#include "components/bookmarks/browser/bookmark_utils.h"
#include "components/bookmarks/browser/scoped_group_bookmark_actions.h"
@@ -30,11 +41,14 @@
#include "components/bookmarks/managed/managed_bookmark_service.h"
#include "components/prefs/pref_service.h"
#include "components/query_parser/query_parser.h"
+#include "components/search_engines/template_url.h"
#include "components/signin/core/browser/signin_manager.h"
#include "components/undo/bookmark_undo_service.h"
#include "components/undo/undo_manager.h"
+#include "components/url_formatter/url_fixer.h"
#include "content/public/browser/browser_thread.h"
#include "jni/BookmarkBridge_jni.h"
+#include "ui/android/window_android.h"
using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString;
@@ -53,6 +67,57 @@ using bookmarks::BookmarkPermanentNode;
using bookmarks::BookmarkType;
using content::BrowserThread;
+namespace internal {
+
+// Returns true if |url| has a valid scheme that we allow to import. We
+// filter out the URL with a unsupported scheme.
+bool CanImportURL(const GURL& url) {
+ // The URL is not valid.
+ if (!url.is_valid())
+ return false;
+
+ // Filter out the URLs with unsupported schemes.
+ const char* const kInvalidSchemes[] = {"wyciwyg", "place"};
+ for (size_t i = 0; i < arraysize(kInvalidSchemes); ++i) {
+ if (url.SchemeIs(kInvalidSchemes[i]))
+ return false;
+ }
+
+ // Check if |url| is about:blank.
+ if (url == url::kAboutBlankURL)
+ return true;
+
+ // If |url| starts with chrome:// or about:, check if it's one of the URLs
+ // that we support.
+ if (url.SchemeIs(content::kChromeUIScheme) ||
+ url.SchemeIs(url::kAboutScheme)) {
+ if (url.host_piece() == chrome::kChromeUIUberHost ||
+ url.host_piece() == chrome::kChromeUIAboutHost)
+ return true;
+
+ GURL fixed_url(url_formatter::FixupURL(url.spec(), std::string()));
+ for (size_t i = 0; i < chrome::kNumberOfChromeHostURLs; ++i) {
+ if (fixed_url.DomainIs(chrome::kChromeHostURLs[i]))
+ return true;
+ }
+
+ for (size_t i = 0; i < chrome::kNumberOfChromeDebugURLs; ++i) {
+ if (fixed_url == chrome::kChromeDebugURLs[i])
+ return true;
+ }
+
+ // If url has either chrome:// or about: schemes but wasn't found in the
+ // above lists, it means we don't support it, so we don't allow the user
+ // to import it.
+ return false;
+ }
+
+ // Otherwise, we assume the url has a valid (importable) scheme.
+ return true;
+}
+
+} // internal
+
namespace {
class BookmarkTitleComparer {
@@ -129,6 +194,10 @@ BookmarkBridge::~BookmarkBridge() {
bookmark_model_->RemoveObserver(this);
if (partner_bookmarks_shim_)
partner_bookmarks_shim_->RemoveObserver(this);
+ // There may be pending file dialogs, we need to tell them that we've gone
+ // away so they don't try and call back to us.
+ if (select_file_dialog_)
+ select_file_dialog_->ListenerDestroyed();
}
void BookmarkBridge::Destroy(JNIEnv*, const JavaParamRef<jobject>&) {
@@ -470,6 +539,156 @@ jint BookmarkBridge::GetTotalBookmarkCount(
return count;
}
+void BookmarkBridge::ImportBookmarks(JNIEnv* env,
+ const JavaParamRef<jobject>& obj,
+ const JavaParamRef<jobject>& java_window) {
+ DCHECK(IsLoaded());
+
+ ui::WindowAndroid* window =
+ ui::WindowAndroid::FromJavaWindowAndroid(java_window);
+ CHECK(window);
+
+ select_file_dialog_ = ui::SelectFileDialog::Create(
+ this, std::make_unique<ChromeSelectFilePolicy>(nullptr));
+
+ //NOTE: extension and description are not used on Android
+ ui::SelectFileDialog::FileTypeInfo file_type_info;
+ file_type_info.extensions.resize(1);
+ file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("html"));
+ file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("htm"));
+ file_type_info.extension_description_overrides.push_back(base::ASCIIToUTF16("Netscape Bookmark"));
+ file_type_info.allowed_paths =
+ ui::SelectFileDialog::FileTypeInfo::NATIVE_OR_DRIVE_PATH;
+
+ const base::FilePath file_path;
+
+ select_file_dialog_->SelectFile(
+ ui::SelectFileDialog::SELECT_OPEN_FILE,
+ base::string16(),
+ file_path,
+ NULL,
+ 0,
+ base::FilePath::StringType(),
+ window,
+ NULL);
+}
+
+void ExporterCallback(Profile* profile, const base::FilePath& path) {
+ bookmark_html_writer::WriteBookmarks(profile, path, NULL);
+ //NOTE: nothing will be written if write permission has not been granted before
+ LOG(INFO) << "Bookmarks exported successfully in " << path;
+}
+
+void BookmarkBridge::ExportBookmarks(JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ DCHECK(IsLoaded());
+ base::FilePath path;
+ if (!base::android::GetDownloadsDirectory(&path)) {
+ LOG(ERROR) << "Could not retrieve downloads directory for bookmarks export";
+ return;
+ }
+
+ path = path.Append(FILE_PATH_LITERAL("bookmarks.html"));
+
+// base::PostTaskWithTraits(FROM_HERE, {base::MayBlock()},
+// base::BindOnce(&ExporterCallback, profile_, path));
+ ExporterCallback(profile_, path);
+}
+
+// Attempts to create a TemplateURL from the provided data. |title| is optional.
+// If TemplateURL creation fails, returns null.
+std::unique_ptr<TemplateURL> CreateTemplateURL(const base::string16& url,
+ const base::string16& keyword,
+ const base::string16& title) {
+ if (url.empty() || keyword.empty())
+ return nullptr;
+ TemplateURLData data;
+ data.SetKeyword(keyword);
+ // We set short name by using the title if it exists.
+ // Otherwise, we use the shortcut.
+ data.SetShortName(title.empty() ? keyword : title);
+ data.SetURL(TemplateURLRef::DisplayURLToURLRef(url));
+ return std::make_unique<TemplateURL>(data);
+}
+
+void ImporterCallback(Profile* profile, const base::FilePath& path, const std::string& contents) {
+ // this import logic comes from BookmarksFileImporter class
+ std::vector<ImportedBookmarkEntry> bookmarks;
+ std::vector<importer::SearchEngineInfo> search_engines;
+
+ bookmark_html_reader::ImportBookmarksFile(
+ base::Callback<bool(void)>(),
+ base::Bind(internal::CanImportURL),
+ contents,
+ &bookmarks,
+ &search_engines,
+ nullptr);
+
+ // writing to profile will begin extensive changes and use the same bookmarks model for persisting changes
+ auto *writer = new ProfileWriter(profile);
+
+ if (!bookmarks.empty()) {
+ writer->AddBookmarks(bookmarks, base::ASCIIToUTF16("Imported"));
+ }
+ if (!search_engines.empty()) {
+ TemplateURLService::OwnedTemplateURLVector owned_template_urls;
+ for (const auto& search_engine : search_engines) {
+ std::unique_ptr<TemplateURL> owned_template_url = CreateTemplateURL(
+ search_engine.url, search_engine.keyword, search_engine.display_name);
+ if (owned_template_url)
+ owned_template_urls.push_back(std::move(owned_template_url));
+ }
+ writer->AddKeywords(std::move(owned_template_urls), false);
+ }
+
+ LOG(INFO) << "Imported " << bookmarks.size() << " bookmarks and " <<
+ search_engines.size() << " search engines from " << path;
+}
+
+void BookmarkBridge::FileSelected(const base::FilePath& path, int index,
+ void* params) {
+ base::File file;
+ if (path.IsContentUri()) {
+ file = base::OpenContentUriForRead(path);
+ } else {
+ file.Initialize(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+ }
+ if (!file.IsValid()) {
+ LOG(ERROR) << "Cannot open bookmarks file for import";
+ return;
+ }
+
+ auto fileLength = file.GetLength();
+ if (-1 == fileLength) {
+ LOG(ERROR) << "Cannot read bookmarks file length";
+ return;
+ }
+
+ if (fileLength > 10 * 1024 * 1024) {
+ LOG(ERROR) << "Bookmarks file is too big";
+ return;
+ }
+
+ std::vector<char> buffer(fileLength);
+ if (-1 == file.ReadAtCurrentPos(buffer.data(), fileLength)) {
+ LOG(ERROR) << "Could not read bookmarks file";
+ return;
+ }
+
+ if (buffer.empty()) {
+ LOG(ERROR) << "Empty bookmarks file";
+ return;
+ }
+
+ std::string content(buffer.begin(), buffer.end());
+// base::PostTaskWithTraits(FROM_HERE, {base::MayBlock()},
+// base::BindOnce(&ImporterCallback, profile_, path, content));
+ ImporterCallback(profile_, path, content);
+}
+
+void BookmarkBridge::FileSelectionCanceled(void* params) {
+}
+
void BookmarkBridge::SetBookmarkTitle(JNIEnv* env,
const JavaParamRef<jobject>& obj,
jlong id,
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.h b/chrome/browser/android/bookmarks/bookmark_bridge.h
--- a/chrome/browser/android/bookmarks/bookmark_bridge.h
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.h
@@ -13,6 +13,8 @@
#include "components/bookmarks/browser/base_bookmark_model_observer.h"
#include "components/bookmarks/common/android/bookmark_id.h"
#include "components/prefs/pref_change_registrar.h"
+#include "components/search_engines/template_url.h"
+#include "ui/shell_dialogs/select_file_dialog.h"
namespace bookmarks {
class BookmarkModel;
@@ -26,7 +28,8 @@ class Profile;
// bookmark page. This fetches the bookmarks, title, urls, folder
// hierarchy.
class BookmarkBridge : public bookmarks::BaseBookmarkModelObserver,
- public PartnerBookmarksShim::Observer {
+ public PartnerBookmarksShim::Observer,
+ public ui::SelectFileDialog::Listener {
public:
BookmarkBridge(JNIEnv* env,
const base::android::JavaRef<jobject>& obj,
@@ -36,6 +39,12 @@ class BookmarkBridge : public bookmarks::BaseBookmarkModelObserver,
bool IsDoingExtensiveChanges(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
+ // SelectFileDialog::Listener implementation.
+ void FileSelected(const base::FilePath& path,
+ int index,
+ void* params) override;
+ void FileSelectionCanceled(void* params) override;
+
jboolean IsEditBookmarksEnabled(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj);
@@ -116,6 +125,13 @@ class BookmarkBridge : public bookmarks::BaseBookmarkModelObserver,
jlong id,
jint type);
+ void ImportBookmarks(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jobject>& java_window);
+
+ void ExportBookmarks(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj);
+
void SetBookmarkTitle(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong id,
@@ -267,6 +283,7 @@ class BookmarkBridge : public bookmarks::BaseBookmarkModelObserver,
std::unique_ptr<bookmarks::ScopedGroupBookmarkActions>
grouped_bookmark_actions_;
PrefChangeRegistrar pref_change_registrar_;
+ scoped_refptr<ui::SelectFileDialog> select_file_dialog_;
// Information about the Partner bookmarks (must check for IsLoaded()).
// This is owned by profile.
diff --git a/chrome/browser/importer/profile_writer.cc b/chrome/browser/importer/profile_writer.cc
--- a/chrome/browser/importer/profile_writer.cc
+++ b/chrome/browser/importer/profile_writer.cc
@@ -109,12 +109,14 @@ void ProfileWriter::AddHistoryPage(const history::URLRows& page,
HistoryServiceFactory::GetForProfile(profile_,
ServiceAccessType::EXPLICIT_ACCESS)
->AddPagesWithDetails(page, visit_source);
+#if !defined(OS_ANDROID)
// Measure the size of the history page after Auto Import on first run.
if (first_run::IsChromeFirstRun() &&
visit_source == history::SOURCE_IE_IMPORTED) {
UMA_HISTOGRAM_COUNTS("Import.ImportedHistorySize.AutoImportFromIE",
page.size());
}
+#endif
}
void ProfileWriter::AddHomepage(const GURL& home_page) {
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -434,6 +434,9 @@ static_library("common") {
sources += [
"media/chrome_media_drm_bridge_client.cc",
"media/chrome_media_drm_bridge_client.h",
+ ## Bromite dependencies for bookmark import functionality
+ "importer/imported_bookmark_entry.cc",
+ "importer/imported_bookmark_entry.h",
]
} else {
# Non-Android.
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -55,8 +55,6 @@ static_library("utility") {
if (!is_android) {
sources += [
- "importer/bookmark_html_reader.cc",
- "importer/bookmark_html_reader.h",
"importer/bookmarks_file_importer.cc",
"importer/bookmarks_file_importer.h",
"importer/edge_database_reader_win.cc",
@@ -160,6 +158,11 @@ static_library("utility") {
]
}
+ sources += [
+ "importer/bookmark_html_reader.cc",
+ "importer/bookmark_html_reader.h",
+ ]
+
if (use_nss_certs) {
sources += [
"importer/nss_decryptor_system_nss.cc",
diff --git a/chrome/utility/importer/bookmark_html_reader.cc b/chrome/utility/importer/bookmark_html_reader.cc
--- a/chrome/utility/importer/bookmark_html_reader.cc
+++ b/chrome/utility/importer/bookmark_html_reader.cc
@@ -17,7 +17,9 @@
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "chrome/common/importer/imported_bookmark_entry.h"
+#if !defined(OS_ANDROID)
#include "chrome/utility/importer/favicon_reencode.h"
+#endif
#include "components/search_engines/search_terms_data.h"
#include "components/search_engines/template_url.h"
#include "net/base/data_url.h"
@@ -56,6 +58,7 @@ bool GetAttribute(const std::string& attribute_list,
return true;
}
+#if !defined(OS_ANDROID)
// Given the URL of a page and a favicon data URL, adds an appropriate record
// to the given favicon usage vector.
void DataURLToFaviconUsage(const GURL& link_url,
@@ -86,6 +89,7 @@ void DataURLToFaviconUsage(const GURL& link_url,
favicons->push_back(usage);
}
+#endif
} // namespace
@@ -108,12 +112,10 @@ static std::string stripDt(const std::string& lineDt) {
void ImportBookmarksFile(
const base::Callback<bool(void)>& cancellation_callback,
const base::Callback<bool(const GURL&)>& valid_url_callback,
- const base::FilePath& file_path,
+ const std::string& content,
std::vector<ImportedBookmarkEntry>* bookmarks,
std::vector<importer::SearchEngineInfo>* search_engines,
favicon_base::FaviconUsageDataList* favicons) {
- std::string content;
- base::ReadFileToString(file_path, &content);
std::vector<std::string> lines = base::SplitString(
content, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
@@ -126,6 +128,7 @@ void ImportBookmarksFile(
std::vector<base::string16> path;
size_t toolbar_folder_index = 0;
std::string charset = "UTF-8"; // If no charset is specified, assume utf-8.
+
for (size_t i = 0;
i < lines.size() &&
(cancellation_callback.is_null() || !cancellation_callback.Run());
@@ -218,10 +221,12 @@ void ImportBookmarksFile(
}
bookmarks->push_back(entry);
+#if !defined(OS_ANDROID)
// Save the favicon. DataURLToFaviconUsage will handle the case where
// there is no favicon.
if (favicons)
DataURLToFaviconUsage(url, favicon, favicons);
+#endif
continue;
}
@@ -278,6 +283,22 @@ void ImportBookmarksFile(
}
}
+void ImportBookmarksFile(
+ const base::Callback<bool(void)>& cancellation_callback,
+ const base::Callback<bool(const GURL&)>& valid_url_callback,
+ const base::FilePath& file_path,
+ std::vector<ImportedBookmarkEntry>* bookmarks,
+ std::vector<importer::SearchEngineInfo>* search_engines,
+ favicon_base::FaviconUsageDataList* favicons) {
+ std::string content;
+ if (!base::ReadFileToString(file_path, &content)) {
+ LOG(ERROR) << "Could not directly read bookmarks import file";
+ return;
+ }
+
+ ImportBookmarksFile(cancellation_callback, valid_url_callback, content, bookmarks, search_engines, favicons);
+}
+
bool CanImportURLAsSearchEngine(const GURL& url,
std::string* search_engine_url) {
std::string url_spec = url.possibly_invalid_spec();
diff --git a/chrome/utility/importer/bookmark_html_reader.h b/chrome/utility/importer/bookmark_html_reader.h
--- a/chrome/utility/importer/bookmark_html_reader.h
+++ b/chrome/utility/importer/bookmark_html_reader.h
@@ -51,6 +51,15 @@ void ImportBookmarksFile(
std::vector<importer::SearchEngineInfo>* search_engines,
favicon_base::FaviconUsageDataList* favicons);
+void ImportBookmarksFile(
+ const base::Callback<bool(void)>& cancellation_callback,
+ const base::Callback<bool(const GURL&)>& valid_url_callback,
+ const std::string& content,
+ std::vector<ImportedBookmarkEntry>* bookmarks,
+ std::vector<importer::SearchEngineInfo>* search_engines,
+ favicon_base::FaviconUsageDataList* favicons);
+
+
// Returns true if |url| should be imported as a search engine, i.e. because it
// has replacement terms. Chrome treats such bookmarks as search engines rather
// than true bookmarks.
--
2.7.4

View file

@ -1,235 +0,0 @@
From: csagan5 <32685696+csagan5@users.noreply.github.com>
Date: Wed, 1 Aug 2018 09:19:40 +0200
Subject: Add export button to Bookmarks activity page
---
chrome/android/java/res/menu/bookmark_action_bar_menu.xml | 7 +++++++
.../chrome/browser/bookmarks/BookmarkActionBar.java | 6 ++++++
.../chromium/chrome/browser/bookmarks/BookmarkBridge.java | 10 ++++++++++
.../chromium/chrome/browser/bookmarks/BookmarkDelegate.java | 5 +++++
.../chromium/chrome/browser/bookmarks/BookmarkManager.java | 5 +++++
chrome/android/java/strings/android_chrome_strings.grd | 3 +++
chrome/browser/BUILD.gn | 4 ++--
chrome/browser/android/bookmarks/bookmark_bridge.cc | 13 +++++++++++++
chrome/browser/android/bookmarks/bookmark_bridge.h | 3 +++
chrome/utility/BUILD.gn | 7 +++++--
10 files changed, 59 insertions(+), 4 deletions(-)
diff --git a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
--- a/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
+++ b/chrome/android/java/res/menu/bookmark_action_bar_menu.xml
@@ -15,6 +15,13 @@
app:showAsAction="ifRoom"
app:iconTint="@color/dark_mode_tint" />
<item
+ android:id="@+id/export_menu_id"
+ android:icon="@drawable/ic_file_download_white_24dp"
+ android:title="@string/export"
+ android:visible="true"
+ app:showAsAction="ifRoom"
+ app:iconTint="@color/dark_mode_tint" />
+ <item
android:id="@+id/search_menu_id"
android:icon="@drawable/ic_search"
android:title="@string/search"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkActionBar.java
@@ -82,6 +82,9 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
} else if (menuItem.getItemId() == R.id.search_menu_id) {
mDelegate.openSearchUI();
return true;
+ } else if (menuItem.getItemId() == R.id.export_menu_id) {
+ mDelegate.exportBookmarks();
+ return true;
}
SelectionDelegate<BookmarkId> selectionDelegate = mDelegate.getSelectionDelegate();
@@ -125,6 +128,7 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
void showLoadingUi() {
setTitle(null);
setNavigationButton(NAVIGATION_BUTTON_NONE);
+ getMenu().findItem(R.id.export_menu_id).setVisible(false);
getMenu().findItem(R.id.search_menu_id).setVisible(false);
getMenu().findItem(R.id.edit_menu_id).setVisible(false);
}
@@ -134,6 +138,7 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
super.showNormalView();
if (mDelegate == null) {
+ getMenu().findItem(R.id.export_menu_id).setVisible(false);
getMenu().findItem(R.id.search_menu_id).setVisible(false);
getMenu().findItem(R.id.edit_menu_id).setVisible(false);
}
@@ -166,6 +171,7 @@ public class BookmarkActionBar extends SelectableListToolbar<BookmarkId>
public void onFolderStateSet(BookmarkId folder) {
mCurrentFolder = mDelegate.getModel().getBookmarkById(folder);
+ getMenu().findItem(R.id.export_menu_id).setVisible(true);
getMenu().findItem(R.id.search_menu_id).setVisible(true);
getMenu().findItem(R.id.edit_menu_id).setVisible(mCurrentFolder.isEditable());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -508,6 +508,15 @@ public class BookmarkBridge {
}
/**
+ * Export bookmarks to the specified path.
+ * @param path The path of the bookmarks HTML export.
+ */
+ public void exportBookmarks() {
+ assert mIsNativeBookmarkModelLoaded;
+ nativeExportBookmarks(mNativeBookmarkBridge);
+ }
+
+ /**
* Synchronously gets a list of bookmarks that match the specified search query.
* @param query Keyword used for searching bookmarks.
* @param maxNumberOfResult Maximum number of result to fetch.
@@ -906,6 +915,7 @@ public class BookmarkBridge {
boolean getFolders, boolean getBookmarks, List<BookmarkId> bookmarksList);
private native BookmarkId nativeGetChildAt(long nativeBookmarkBridge, long id, int type,
int index);
+ private native void nativeExportBookmarks(long nativeBookmarkBridge);
private native int nativeGetTotalBookmarkCount(long nativeBookmarkBridge, long id, int type);
private native void nativeSetBookmarkTitle(long nativeBookmarkBridge, long id, int type,
String title);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkDelegate.java
@@ -69,6 +69,11 @@ interface BookmarkDelegate {
void openSearchUI();
/**
+ * Exports the bookmarks.
+ */
+ void exportBookmarks();
+
+ /**
* Dismisses the search UI.
*/
void closeSearchUI();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
@@ -416,6 +416,11 @@ public class BookmarkManager implements BookmarkDelegate, SearchDelegate,
}
@Override
+ public void exportBookmarks() {
+ mBookmarkModel.exportBookmarks();
+ }
+
+ @Override
public void openSearchUI() {
setState(BookmarkUIState.createSearchState());
mSelectableListLayout.onStartSearch();
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -209,6 +209,9 @@ CHAR-LIMIT guidelines:
<message name="IDS_SEARCH" desc="The label for a search button.">
Search
</message>
+ <message name="IDS_EXPORT" desc="The label for an export button.">
+ Export
+ </message>
<message name="IDS_SHOW_INFO" desc="The label for a info button to show info.">
Show Info
</message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -135,6 +135,8 @@ jumbo_split_static_library("browser") {
"bitmap_fetcher/bitmap_fetcher_service.h",
"bitmap_fetcher/bitmap_fetcher_service_factory.cc",
"bitmap_fetcher/bitmap_fetcher_service_factory.h",
+ "bookmarks/bookmark_html_writer.cc",
+ "bookmarks/bookmark_html_writer.h",
"bookmarks/bookmark_model_factory.cc",
"bookmarks/bookmark_model_factory.h",
"bookmarks/bookmark_stats.cc",
@@ -2422,8 +2424,6 @@ jumbo_split_static_library("browser") {
"banners/app_banner_infobar_delegate_desktop.h",
"banners/app_banner_manager_desktop.cc",
"banners/app_banner_manager_desktop.h",
- "bookmarks/bookmark_html_writer.cc",
- "bookmarks/bookmark_html_writer.h",
"certificate_viewer.h",
"chrome_browser_field_trials_desktop.cc",
"chrome_browser_field_trials_desktop.h",
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc
--- a/chrome/browser/android/bookmarks/bookmark_bridge.cc
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -11,9 +11,11 @@
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
+#include "base/android/path_utils.h"
#include "base/containers/stack.h"
#include "base/containers/stack_container.h"
#include "base/i18n/string_compare.h"
+#include "chrome/browser/bookmarks/bookmark_html_writer.h"
#include "chrome/browser/bookmarks/bookmark_model_factory.h"
#include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
#include "chrome/browser/profiles/incognito_helpers.h"
@@ -470,6 +472,17 @@ jint BookmarkBridge::GetTotalBookmarkCount(
return count;
}
+void BookmarkBridge::ExportBookmarks(JNIEnv* env,
+ const JavaParamRef<jobject>& obj) {
+ DCHECK(IsLoaded());
+ base::FilePath path;
+ if (!base::android::GetDownloadsDirectory(&path)) {
+ return;
+ }
+
+ bookmark_html_writer::WriteBookmarks(profile_, path.Append(FILE_PATH_LITERAL("bookmarks.html")), NULL);
+}
+
void BookmarkBridge::SetBookmarkTitle(JNIEnv* env,
const JavaParamRef<jobject>& obj,
jlong id,
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.h b/chrome/browser/android/bookmarks/bookmark_bridge.h
--- a/chrome/browser/android/bookmarks/bookmark_bridge.h
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.h
@@ -116,6 +116,9 @@ class BookmarkBridge : public bookmarks::BaseBookmarkModelObserver,
jlong id,
jint type);
+ void ExportBookmarks(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& obj);
+
void SetBookmarkTitle(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj,
jlong id,
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -55,8 +55,6 @@ static_library("utility") {
if (!is_android) {
sources += [
- "importer/bookmark_html_reader.cc",
- "importer/bookmark_html_reader.h",
"importer/bookmarks_file_importer.cc",
"importer/bookmarks_file_importer.h",
"importer/edge_database_reader_win.cc",
@@ -160,6 +158,11 @@ static_library("utility") {
]
}
+ sources += [
+ "importer/bookmark_html_reader.cc",
+ "importer/bookmark_html_reader.h",
+ ]
+
if (use_nss_certs) {
sources += [
"importer/nss_decryptor_system_nss.cc",
--
2.7.4