summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjianli <jianli@chromium.org>2016-01-19 20:11:07 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-20 04:12:26 +0000
commit33ced7a1ea60824e88c132d727dd864b37b0e6e2 (patch)
tree1f309fff93c417ce6d324e5f01574798ef0e749c
parent78f86e4a1f05241ed5dae1d67faeeec8e87a4351 (diff)
downloadchromium_src-33ced7a1ea60824e88c132d727dd864b37b0e6e2.zip
chromium_src-33ced7a1ea60824e88c132d727dd864b37b0e6e2.tar.gz
chromium_src-33ced7a1ea60824e88c132d727dd864b37b0e6e2.tar.bz2
Show alternate UI strings for offline pages per experiment settings
BUG=565566 Review URL: https://codereview.chromium.org/1580233002 Cr-Commit-Position: refs/heads/master@{#370299}
-rw-r--r--chrome/android/BUILD.gn3
-rw-r--r--chrome/android/chrome_apk.gyp3
-rw-r--r--chrome/android/java/res/layout/new_tab_page.xml4
-rw-r--r--chrome/android/java/res/layout/new_tab_page_incognito.xml2
-rw-r--r--chrome/android/java/res/menu/eb_action_bar_menu.xml8
-rw-r--r--chrome/android/java/res/menu/main_menu.xml2
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java23
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java10
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java30
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java7
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java5
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java7
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java17
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java5
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java20
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java12
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java15
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java23
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java9
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java6
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java3
-rw-r--r--chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java63
-rw-r--r--chrome/android/java/strings/android_chrome_strings.grd33
-rw-r--r--chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java80
-rw-r--r--chrome/app/generated_resources.grd6
-rw-r--r--chrome/browser/about_flags.cc21
-rw-r--r--chrome/browser/android/offline_pages/offline_page_bridge.cc5
-rw-r--r--chrome/browser/chrome_content_browser_client.cc4
-rw-r--r--chrome/chrome.gyp3
-rw-r--r--chrome/common/BUILD.gn1
-rw-r--r--chrome/common/DEPS1
-rw-r--r--chrome/common/localized_error.cc11
-rw-r--r--components/error_page_strings.grdp3
-rw-r--r--components/offline_pages.gypi13
-rw-r--r--components/offline_pages/BUILD.gn27
-rw-r--r--components/offline_pages/offline_page_feature.cc38
-rw-r--r--components/offline_pages/offline_page_feature.h13
-rw-r--r--components/offline_pages/offline_page_switches.cc8
-rw-r--r--components/offline_pages/offline_page_switches.h2
-rw-r--r--tools/metrics/histograms/histograms.xml2
40 files changed, 435 insertions, 113 deletions
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index f2f5fe2..8dc2aa3 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -178,7 +178,8 @@ android_library("chrome_java") {
":custom_tabs_service_aidl",
"//chrome:page_info_connection_type_javagen",
"//components/enhanced_bookmarks:enhanced_bookmarks_java_enums_srcjar",
- "//components/offline_pages:offline_pages_enums_java",
+ "//components/offline_pages:offline_page_feature_enums_java",
+ "//components/offline_pages:offline_page_model_enums_java",
"//components/omnibox/browser:autocomplete_match_type_javagen",
"//components/security_state:security_state_enums_java",
]
diff --git a/chrome/android/chrome_apk.gyp b/chrome/android/chrome_apk.gyp
index 9fc4083..d6d3312 100644
--- a/chrome/android/chrome_apk.gyp
+++ b/chrome/android/chrome_apk.gyp
@@ -291,7 +291,8 @@
'../../chrome/chrome.gyp:chrome_java_test_support',
'../../components/components.gyp:invalidation_javatests',
'../../components/components.gyp:gcm_driver_java',
- '../../components/components.gyp:offline_pages_enums_java',
+ '../../components/components.gyp:offline_page_feature_enums_java',
+ '../../components/components.gyp:offline_page_model_enums_java',
'../../components/components.gyp:precache_javatests',
'../../components/components.gyp:security_state_enums_java',
'../../components/components.gyp:web_contents_delegate_android_java',
diff --git a/chrome/android/java/res/layout/new_tab_page.xml b/chrome/android/java/res/layout/new_tab_page.xml
index 8af2128..ae21847 100644
--- a/chrome/android/java/res/layout/new_tab_page.xml
+++ b/chrome/android/java/res/layout/new_tab_page.xml
@@ -174,7 +174,7 @@
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?attr/listChoiceBackgroundIndicator"
- android:contentDescription="@string/accessibility_ntp_toolbar_btn_bookmarks"
+ android:contentDescription="@null"
android:paddingTop="12dp"
android:paddingBottom="12dp" >
<TextView
@@ -183,7 +183,7 @@
android:layout_gravity="center_horizontal"
android:drawablePadding="8dp"
android:gravity="center_vertical"
- android:text="@string/ntp_bookmarks"
+ android:text="@null"
android:textSize="12sp"
android:textColor="#5a5a5a" />
</FrameLayout>
diff --git a/chrome/android/java/res/layout/new_tab_page_incognito.xml b/chrome/android/java/res/layout/new_tab_page_incognito.xml
index 9bbd65e..00777bf 100644
--- a/chrome/android/java/res/layout/new_tab_page_incognito.xml
+++ b/chrome/android/java/res/layout/new_tab_page_incognito.xml
@@ -57,7 +57,7 @@
android:layout_marginBottom="10dp"
android:maxWidth="660dp"
android:singleLine="false"
- android:text="@string/new_tab_incognito_message"
+ android:text="@null"
android:textColor="#bdbdbd"
android:textSize="14sp"
android:lineSpacingMultiplier="1.2" />
diff --git a/chrome/android/java/res/menu/eb_action_bar_menu.xml b/chrome/android/java/res/menu/eb_action_bar_menu.xml
index 8df9339..9952be7 100644
--- a/chrome/android/java/res/menu/eb_action_bar_menu.xml
+++ b/chrome/android/java/res/menu/eb_action_bar_menu.xml
@@ -16,7 +16,7 @@
<item
android:id="@+id/search_menu_id"
android:icon="@drawable/ic_search"
- android:title="@string/enhanced_bookmark_action_bar_search"
+ android:title="@null"
android:visible="false"
chrome:showAsAction="ifRoom"/>
<item
@@ -31,17 +31,17 @@
<item
android:id="@+id/selection_mode_edit_menu_id"
android:icon="@drawable/eb_edit_active"
- android:title="@string/edit_bookmark"
+ android:title="@null"
chrome:showAsAction="ifRoom"/>
<item
android:id="@+id/selection_mode_move_menu_id"
android:icon="@drawable/eb_move_active"
- android:title="@string/enhanced_bookmark_action_bar_move"
+ android:title="@null"
chrome:showAsAction="ifRoom"/>
<item
android:id="@+id/selection_mode_delete_menu_id"
android:icon="@drawable/eb_delete_white"
- android:title="@string/enhanced_bookmark_action_bar_delete"
+ android:title="@null"
chrome:showAsAction="ifRoom"/>
</group>
diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml
index fd02acd..74afcd1 100644
--- a/chrome/android/java/res/menu/main_menu.xml
+++ b/chrome/android/java/res/menu/main_menu.xml
@@ -32,7 +32,7 @@
<item android:id="@+id/new_incognito_tab_menu_id"
android:title="@string/menu_new_incognito_tab" />
<item android:id="@+id/all_bookmarks_menu_id"
- android:title="@string/menu_bookmarks" />
+ android:title="@null" />
<item android:id="@+id/recent_tabs_menu_id"
android:title="@string/menu_recent_tabs" />
<item android:id="@+id/open_history_menu_id"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
index 636c14a..691d0eb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeSwitches.java
@@ -176,11 +176,32 @@ public abstract class ChromeSwitches {
public static final String NTP_SWITCH_TO_EXISTING_TAB = "ntp-switch-to-existing-tab";
/**
- * Enable offline pages.
+ * Enables offline pages.
+ * Native switch - switches::kEnableOfflinePages
*/
public static final String ENABLE_OFFLINE_PAGES = "enable-offline-pages";
/**
+ * Enables offline pages, showing 'bookmarks' name in UI strings.
+ * Native switch - switches::kEnableOfflinePagesAsBookmarks
+ */
+ public static final String ENABLE_OFFLINE_PAGES_AS_BOOKMARKS =
+ "enable-offline-pages-as-bookmarks";
+
+ /**
+ * Enables offline pages, showing 'saved pages' name in UI strings.
+ * Native switch - switches::kEnableOfflinePagesAsSavedPages
+ */
+ public static final String ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES =
+ "enable-offline-pages-as-saved-pages";
+
+ /**
+ * Disables offline pages.
+ * Native switch - switches::kDisableOfflinePages
+ */
+ public static final String DISABLE_OFFLINE_PAGES = "disable-offline-pages";
+
+ /**
* Enable keyboard accessory view that shows autofill suggestions on top of the keyboard.
* Native switch - autofill::switches::kEnableAccessorySuggestionView
*/
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
index 1fb2909..26120fa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegate.java
@@ -14,7 +14,7 @@ import org.chromium.chrome.browser.ChromeBrowserProviderClient;
import org.chromium.chrome.browser.ShortcutHelper;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.bookmark.BookmarksBridge;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper;
import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
@@ -119,11 +119,9 @@ public class AppMenuPropertiesDelegate {
recentTabsMenuItem.setVisible(!isIncognito && FeatureUtilities.canAllowSync(mActivity));
recentTabsMenuItem.setTitle(R.string.menu_recent_tabs);
- if (OfflinePageBridge.isEnabled()) {
- MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id);
- allBookmarksMenuItem.setTitle(mActivity.getString(
- R.string.menu_bookmarks_offline_pages));
- }
+ MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id);
+ allBookmarksMenuItem.setTitle(
+ mActivity.getString(OfflinePageUtils.getStringId(R.string.menu_bookmarks)));
// Don't allow "chrome://" pages to be shared.
menu.findItem(R.id.share_row_menu_id).setVisible(!isChromeScheme);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java
index 9111640..bb76d1a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActionBar.java
@@ -19,7 +19,7 @@ import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.bookmark.BookmarksBridge.BookmarkItem;
import org.chromium.chrome.browser.bookmark.BookmarksBridge.BookmarkModelObserver;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.widget.NumberRollView;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkType;
@@ -58,16 +58,20 @@ public class EnhancedBookmarkActionBar extends Toolbar implements EnhancedBookma
if (DeviceFormFactor.isTablet(context)) getMenu().removeItem(R.id.close_menu_id);
setOnMenuItemClickListener(this);
- if (OfflinePageBridge.isEnabled()) {
- getMenu().findItem(R.id.search_menu_id).setTitle(
- R.string.offline_pages_action_bar_search);
- getMenu().findItem(R.id.selection_mode_edit_menu_id).setTitle(
- R.string.offline_pages_edit_item);
- getMenu().findItem(R.id.selection_mode_move_menu_id).setTitle(
- R.string.offline_pages_action_bar_move);
- getMenu().findItem(R.id.selection_mode_delete_menu_id).setTitle(
- R.string.offline_pages_action_bar_delete);
- }
+ getMenu()
+ .findItem(R.id.search_menu_id)
+ .setTitle(OfflinePageUtils.getStringId(
+ R.string.enhanced_bookmark_action_bar_search));
+ getMenu()
+ .findItem(R.id.selection_mode_edit_menu_id)
+ .setTitle(OfflinePageUtils.getStringId(R.string.edit_bookmark));
+ getMenu()
+ .findItem(R.id.selection_mode_move_menu_id)
+ .setTitle(OfflinePageUtils.getStringId(R.string.enhanced_bookmark_action_bar_move));
+ getMenu()
+ .findItem(R.id.selection_mode_delete_menu_id)
+ .setTitle(OfflinePageUtils.getStringId(
+ R.string.enhanced_bookmark_action_bar_delete));
}
@Override
@@ -295,8 +299,6 @@ public class EnhancedBookmarkActionBar extends Toolbar implements EnhancedBookma
}
private int getTitleForAllItems() {
- return OfflinePageBridge.isEnabled()
- ? R.string.offline_pages_all_items
- : R.string.enhanced_bookmark_title_bar_all_items;
+ return OfflinePageUtils.getStringId(R.string.enhanced_bookmark_title_bar_all_items);
}
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java
index 485f05d..fb0c1b6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkActivity.java
@@ -11,7 +11,7 @@ import android.view.WindowManager;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.UrlConstants;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.snackbar.SnackbarManager;
import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarManageable;
import org.chromium.components.bookmarks.BookmarkId;
@@ -42,9 +42,8 @@ public class EnhancedBookmarkActivity extends EnhancedBookmarkActivityBase imple
mBookmarkManager.updateForUrl(url);
setContentView(mBookmarkManager.getView());
- EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(this, getString(
- OfflinePageBridge.isEnabled() ? R.string.offline_pages_saved_pages
- : R.string.bookmarks));
+ EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(
+ this, getString(OfflinePageUtils.getStringId(R.string.bookmarks)));
// Hack to work around inferred theme false lint error: http://crbug.com/445633
assert (R.layout.eb_main_content != 0);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java
index f59752e..9f00503 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkContentView.java
@@ -12,7 +12,7 @@ import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.widget.FadingShadow;
import org.chromium.chrome.browser.widget.FadingShadowView;
import org.chromium.chrome.browser.widget.LoadingView;
@@ -45,8 +45,7 @@ public class EnhancedBookmarkContentView extends RelativeLayout implements
super.onFinishInflate();
mItemsContainer = (EnhancedBookmarkRecyclerView) findViewById(R.id.eb_items_container);
TextView emptyView = (TextView) findViewById(R.id.eb_empty_view);
- emptyView.setText(OfflinePageBridge.isEnabled()
- ? R.string.offline_pages_folder_empty : R.string.bookmarks_folder_empty);
+ emptyView.setText(OfflinePageUtils.getStringId(R.string.bookmarks_folder_empty));
mItemsContainer.setEmptyView(emptyView);
mActionBar = (EnhancedBookmarkActionBar) findViewById(R.id.eb_action_bar);
mLoadingView = (LoadingView) findViewById(R.id.eb_initial_loading_view);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java
index 2fd4c83..e7a3035 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkDrawerListViewAdapter.java
@@ -12,6 +12,7 @@ import android.widget.TextView;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.components.bookmarks.BookmarkId;
import java.util.ArrayList;
@@ -326,10 +327,8 @@ class EnhancedBookmarkDrawerListViewAdapter extends BaseAdapter {
switch (item.mType) {
case TYPE_ALL_ITEMS:
- title = listItemView.getContext().getResources()
- .getString(OfflinePageBridge.isEnabled()
- ? R.string.offline_pages_all_items
- : R.string.enhanced_bookmark_drawer_all_items);
+ title = listItemView.getContext().getResources().getString(
+ OfflinePageUtils.getStringId(R.string.enhanced_bookmark_drawer_all_items));
iconDrawableId = R.drawable.btn_star;
break;
case TYPE_FOLDER:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
index d5f5c5c..a925f57 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkEditActivity.java
@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.DeletePageCall
import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.OfflinePageModelObserver;
import org.chromium.chrome.browser.offlinepages.OfflinePageBridge.SavePageCallback;
import org.chromium.chrome.browser.offlinepages.OfflinePageItem;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.util.UrlUtilities;
import org.chromium.chrome.browser.widget.EmptyAlertEditText;
import org.chromium.chrome.browser.widget.TintedDrawable;
@@ -106,9 +107,7 @@ public class EnhancedBookmarkEditActivity extends EnhancedBookmarkActivityBase {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- int title = OfflinePageBridge.isEnabled()
- ? R.string.offline_pages_edit_item
- : R.string.edit_bookmark;
+ int title = OfflinePageUtils.getStringId(R.string.edit_bookmark);
setTitle(title);
EnhancedBookmarkUtils.setTaskDescriptionInDocumentMode(this, getString(title));
mEnhancedBookmarksModel = new EnhancedBookmarksModel();
@@ -257,17 +256,21 @@ public class EnhancedBookmarkEditActivity extends EnhancedBookmarkActivityBase {
.getPageByBookmarkId(mBookmarkId);
if (offlinePage != null) {
// Offline page exists. Show information and button to remove.
- offlinePageInfoTextView.setText(getString(R.string.bookmark_offline_page_size,
- Formatter.formatFileSize(this, offlinePage.getFileSize())));
+ offlinePageInfoTextView.setText(
+ getString(OfflinePageUtils.getStringId(
+ R.string.offline_pages_as_bookmarks_offline_page_size),
+ Formatter.formatFileSize(this, offlinePage.getFileSize())));
updateButtonToDeleteOfflinePage(saveRemoveVisitButton);
} else if (mWebContents != null) {
// Offline page is not saved, but a bookmarked page is opened. Show save button.
- offlinePageInfoTextView.setText(getString(R.string.bookmark_offline_page_none));
+ offlinePageInfoTextView.setText(
+ getString(OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none)));
updateButtonToSaveOfflinePage(saveRemoveVisitButton);
} else {
// Offline page is not saved, and edit page was opened from the bookmarks UI, which
// means there is no action the user can take any action - hide button.
- offlinePageInfoTextView.setText(getString(R.string.bookmark_offline_page_visit));
+ offlinePageInfoTextView.setText(getString(OfflinePageUtils.getStringId(
+ R.string.offline_pages_as_bookmarks_offline_page_visit)));
updateButtonToVisitOfflinePage(saveRemoveVisitButton);
}
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java
index 889be8c..68b3223 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkPage.java
@@ -14,7 +14,7 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.NativePage;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.enhancedbookmarks.EnhancedBookmarkDelegate.EnhancedBookmarkStateChangeListener;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.base.DeviceFormFactor;
@@ -46,8 +46,7 @@ public class EnhancedBookmarkPage implements NativePage, EnhancedBookmarkStateCh
private EnhancedBookmarkPage(Activity activity, Tab tab) {
mActivity = activity;
mTab = tab;
- mTitle = activity.getString(OfflinePageBridge.isEnabled()
- ? R.string.offline_pages_saved_pages : R.string.bookmarks);
+ mTitle = activity.getString(OfflinePageUtils.getStringId(R.string.bookmarks));
mBackgroundColor = ApiCompatibilityUtils.getColor(activity.getResources(),
R.color.default_primary_color);
mThemeColor = ApiCompatibilityUtils.getColor(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java
index 2069677..ce2aa58 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/enhancedbookmarks/EnhancedBookmarkUtils.java
@@ -133,26 +133,30 @@ public class EnhancedBookmarkUtils {
int buttonId = R.string.enhanced_bookmark_item_edit;
if (saveResult == AddBookmarkCallback.SKIPPED) {
- messageId = R.string.offline_pages_page_skipped;
+ messageId = OfflinePageUtils.getStringId(
+ R.string.offline_pages_as_bookmarks_page_skipped);
} else if (isStorageAlmostFull) {
- messageId = saveResult == AddBookmarkCallback.SAVED
- ? R.string.offline_pages_page_saved_storage_near_full
- : R.string.offline_pages_page_failed_to_save_storage_near_full;
+ messageId = OfflinePageUtils.getStringId(saveResult == AddBookmarkCallback.SAVED
+ ? R.string.offline_pages_as_bookmarks_page_saved_storage_near_full
+ : R.string.offline_pages_as_bookmarks_page_failed_to_save_storage_near_full);
// Show "Free up space" button.
- buttonId = R.string.offline_pages_free_up_space_title;
+ buttonId = OfflinePageUtils.getStringId(R.string.offline_pages_free_up_space_title);
snackbarController = createSnackbarControllerForFreeUpSpaceButton(
bookmarkModel, snackbarManager, activity);
} else {
if (saveResult == AddBookmarkCallback.SAVED) {
if (getLastUsedParent(activity) == null) {
- messageId = R.string.offline_pages_page_saved;
+ messageId = OfflinePageUtils.getStringId(
+ R.string.offline_pages_as_bookmarks_page_saved);
} else {
- messageId = R.string.offline_pages_page_saved_folder;
+ messageId = OfflinePageUtils.getStringId(
+ R.string.offline_pages_as_bookmarks_page_saved_folder);
suffix = bookmarkModel.getBookmarkTitle(
bookmarkModel.getBookmarkById(bookmarkId).getParentId());
}
} else {
- messageId = R.string.offline_pages_page_failed_to_save;
+ messageId = OfflinePageUtils.getStringId(
+ R.string.offline_pages_as_bookmarks_page_failed_to_save);
}
}
if (snackbarController == null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
index 1cc0128..b1db008 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
@@ -18,7 +18,7 @@ import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.compositor.layouts.content.InvalidationAwareThumbnailProvider;
import org.chromium.chrome.browser.help.HelpAndFeedback;
import org.chromium.chrome.browser.ntp.IncognitoNewTabPageView.IncognitoNewTabPageManager;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.profiles.Profile;
/**
@@ -67,12 +67,10 @@ public class IncognitoNewTabPage implements NativePage, InvalidationAwareThumbna
(IncognitoNewTabPageView) inflater.inflate(R.layout.new_tab_page_incognito, null);
mIncognitoNewTabPageView.initialize(mIncognitoNewTabPageManager);
- if (OfflinePageBridge.isEnabled()) {
- TextView newTabIncognitoMessage = (TextView) mIncognitoNewTabPageView.findViewById(
- R.id.new_tab_incognito_message);
- newTabIncognitoMessage.setText(activity.getResources().getString(
- R.string.offline_pages_new_tab_incognito_message));
- }
+ TextView newTabIncognitoMessage = (TextView) mIncognitoNewTabPageView.findViewById(
+ R.id.new_tab_incognito_message);
+ newTabIncognitoMessage.setText(activity.getResources().getString(
+ OfflinePageUtils.getStringId(R.string.new_tab_incognito_message)));
}
/**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java
index cfdb9a2..97eda05 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageToolbar.java
@@ -13,7 +13,7 @@ import android.widget.TextView;
import org.chromium.base.ApiCompatibilityUtils;
import org.chromium.chrome.R;
-import org.chromium.chrome.browser.offlinepages.OfflinePageBridge;
+import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
import org.chromium.chrome.browser.widget.TintedDrawable;
/**
@@ -47,14 +47,11 @@ public class NewTabPageToolbar extends LinearLayout {
protected void onFinishInflate() {
mBookmarksButton = initButton(R.id.bookmarks_button, R.drawable.btn_star);
mRecentTabsButton = initButton(R.id.recent_tabs_button, R.drawable.btn_recents);
- if (OfflinePageBridge.isEnabled()) {
- ((TextView) mBookmarksButton.getChildAt(0)).setText(
- R.string.offline_pages_ntp_button_name);
- ((TextView) mBookmarksButton.getChildAt(0)).setContentDescription(
- getResources().getString(R.string.offline_pages_ntp_button_accessibility));
- }
- ((TextView) mBookmarksButton.getChildAt(0)).setText(OfflinePageBridge.isEnabled()
- ? R.string.offline_pages_ntp_button_name : R.string.ntp_bookmarks);
+ ((TextView) mBookmarksButton.getChildAt(0))
+ .setText(OfflinePageUtils.getStringId(R.string.ntp_bookmarks));
+ ((TextView) mBookmarksButton.getChildAt(0))
+ .setContentDescription(getResources().getString(OfflinePageUtils.getStringId(
+ R.string.accessibility_ntp_toolbar_btn_bookmarks)));
mInterestsButton = initButton(R.id.interests_button, R.drawable.btn_star_filled);
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
index 9aea635..92b63d4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java
@@ -16,6 +16,7 @@ import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkType;
import org.chromium.components.offlinepages.DeletePageResult;
+import org.chromium.components.offlinepages.FeatureMode;
import org.chromium.components.offlinepages.SavePageResult;
import org.chromium.content_public.browser.WebContents;
@@ -33,8 +34,8 @@ public final class OfflinePageBridge {
private final ObserverList<OfflinePageModelObserver> mObservers =
new ObserverList<OfflinePageModelObserver>();
- /** Whether the offline pages feature is enabled. */
- private static Boolean sIsEnabled;
+ /** Mode of the offline pages feature */
+ private static Integer sFeatureMode;
/**
* Callback used to saving an offline page.
@@ -158,12 +159,22 @@ public final class OfflinePageBridge {
}
/**
- * Returns true if the offline pages feature is enabled.
+ * @return The mode of the offline pages feature. Uses
+ * {@see org.chromium.components.offlinepages.FeatureMode} enum.
+ */
+ public static int getFeatureMode() {
+ ThreadUtils.assertOnUiThread();
+ if (sFeatureMode == null) sFeatureMode = nativeGetFeatureMode();
+ return sFeatureMode;
+ }
+
+ /**
+ * @return True if the offline pages feature is enabled, regardless whether bookmark or saved
+ * page shown in UI strings.
*/
public static boolean isEnabled() {
ThreadUtils.assertOnUiThread();
- if (sIsEnabled == null) sIsEnabled = nativeIsOfflinePagesEnabled();
- return sIsEnabled;
+ return getFeatureMode() != FeatureMode.DISABLED;
}
/**
@@ -413,7 +424,7 @@ public final class OfflinePageBridge {
url, bookmarkId, offlineUrl, fileSize, creationTime, accessCount, lastAccessTimeMs);
}
- private static native boolean nativeIsOfflinePagesEnabled();
+ private static native int nativeGetFeatureMode();
private static native boolean nativeCanSavePage(String url);
private native long nativeInit(Profile profile);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java
index 16a4cd4..5596e332 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageFreeUpSpaceDialog.java
@@ -52,7 +52,8 @@ public class OfflinePageFreeUpSpaceDialog
* Creates a snackbar informing user that the storage has been cleared.
*/
public static Snackbar createStorageClearedSnackbar(Context context) {
- return Snackbar.make(context.getString(R.string.offline_pages_storage_cleared),
+ return Snackbar.make(context.getString(OfflinePageUtils.getStringId(
+ R.string.offline_pages_storage_cleared)),
new SnackbarController() {
@Override
public void onDismissForEachType(boolean isTimeout) {}
@@ -70,10 +71,12 @@ public class OfflinePageFreeUpSpaceDialog
mOfflinePagesToDelete = mOfflinePageBridge.getPagesToCleanUp();
AlertDialog.Builder builder =
new AlertDialog.Builder(getActivity(), R.style.AlertDialogTheme)
- .setTitle(R.string.offline_pages_free_up_space_title)
+ .setTitle(OfflinePageUtils.getStringId(
+ R.string.offline_pages_free_up_space_title))
.setPositiveButton(R.string.delete, this)
.setNegativeButton(R.string.cancel, this)
- .setMessage(getString(R.string.offline_pages_free_up_space_message,
+ .setMessage(getString(OfflinePageUtils.getStringId(
+ R.string.offline_pages_free_up_space_message),
mOfflinePagesToDelete.size(),
Formatter.formatFileSize(getActivity(), getTotalSize())));
return builder.create();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java
index 921beaf..b5b7172 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageOpenStorageSettingsDialog.java
@@ -33,10 +33,12 @@ public class OfflinePageOpenStorageSettingsDialog {
AlertDialog.Builder builder =
new AlertDialog.Builder(context, R.style.AlertDialogTheme)
- .setTitle(R.string.offline_pages_free_up_space_title)
+ .setTitle(OfflinePageUtils.getStringId(
+ R.string.offline_pages_free_up_space_title))
.setPositiveButton(R.string.offline_pages_view_button, listener)
.setNegativeButton(R.string.cancel, listener)
- .setMessage(R.string.offline_pages_open_storage_settings_dialog_text);
+ .setMessage(OfflinePageUtils.getStringId(
+ R.string.offline_pages_open_storage_settings_dialog_text));
builder.create().show();
}
}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java
index 3bd62b2..fb5e727 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageStorageSpaceHeader.java
@@ -55,7 +55,8 @@ public class OfflinePageStorageSpaceHeader {
R.layout.eb_offline_pages_storage_space_header, parent, false);
((TextView) header.findViewById(R.id.storage_header_message))
- .setText(mContext.getString(R.string.offline_pages_storage_space_message,
+ .setText(mContext.getString(
+ OfflinePageUtils.getStringId(R.string.offline_pages_storage_space_message),
Formatter.formatFileSize(
mContext, mOfflinePageStorageSpacePolicy.getSizeOfAllPages())));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
index bec2a47..f713d22 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.components.bookmarks.BookmarkId;
import org.chromium.components.bookmarks.BookmarkType;
+import org.chromium.components.offlinepages.FeatureMode;
import org.chromium.content_public.browser.LoadUrlParams;
import org.chromium.ui.base.PageTransition;
@@ -71,6 +72,66 @@ public class OfflinePageUtils {
}
/**
+ * Finds out the appropriate resource ID of UI string shown to the user.
+ * @param stringResId The resource ID of UI string used when 'bookmarks' name is used in UI
+ * strings.
+ * return The resource ID of UI string shown to the user, depending on the experiment.
+ */
+ public static int getStringId(int stringResId) {
+ if (!OfflinePageBridge.isEnabled()) {
+ return stringResId;
+ }
+ if (OfflinePageBridge.getFeatureMode() != FeatureMode.ENABLED_AS_SAVED_PAGES) {
+ return stringResId;
+ }
+ if (stringResId == R.string.enhanced_bookmark_action_bar_delete) {
+ return R.string.offline_pages_action_bar_delete;
+ } else if (stringResId == R.string.enhanced_bookmark_action_bar_move) {
+ return R.string.offline_pages_action_bar_move;
+ } else if (stringResId == R.string.enhanced_bookmark_action_bar_search) {
+ return R.string.offline_pages_action_bar_search;
+ } else if (stringResId == R.string.edit_bookmark) {
+ return R.string.offline_pages_edit_item;
+ } else if (stringResId == R.string.enhanced_bookmark_drawer_all_items) {
+ return R.string.offline_pages_all_items;
+ } else if (stringResId == R.string.enhanced_bookmark_title_bar_all_items) {
+ return R.string.offline_pages_all_items;
+ } else if (stringResId == R.string.bookmarks) {
+ return R.string.offline_pages_saved_pages;
+ } else if (stringResId == R.string.menu_bookmarks) {
+ return R.string.menu_bookmarks_offline_pages;
+ } else if (stringResId == R.string.ntp_bookmarks) {
+ return R.string.offline_pages_ntp_button_name;
+ } else if (stringResId == R.string.accessibility_ntp_toolbar_btn_bookmarks) {
+ return R.string.offline_pages_ntp_button_accessibility;
+ } else if (stringResId == R.string.bookmarks_folder_empty) {
+ return R.string.offline_pages_folder_empty;
+ } else if (stringResId == R.string.new_tab_incognito_message) {
+ return R.string.offline_pages_new_tab_incognito_message;
+ } else if (stringResId == R.string.offline_pages_as_bookmarks_page_saved) {
+ return R.string.offline_pages_page_saved;
+ } else if (stringResId == R.string.offline_pages_as_bookmarks_page_skipped) {
+ return R.string.offline_pages_page_skipped;
+ } else if (stringResId
+ == R.string.offline_pages_as_bookmarks_page_saved_storage_near_full) {
+ return R.string.offline_pages_page_saved_storage_near_full;
+ } else if (stringResId == R.string.offline_pages_as_bookmarks_page_failed_to_save) {
+ return R.string.offline_pages_page_failed_to_save;
+ } else if (stringResId
+ == R.string.offline_pages_as_bookmarks_page_failed_to_save_storage_near_full) {
+ return R.string.offline_pages_page_failed_to_save_storage_near_full;
+ } else if (stringResId == R.string.offline_pages_as_bookmarks_storage_space_message) {
+ return R.string.offline_pages_storage_space_message;
+ } else if (stringResId == R.string.offline_pages_as_bookmarks_viewing_offline_page) {
+ return R.string.offline_pages_viewing_offline_page;
+ } else if (stringResId == R.string.offline_pages_as_bookmarks_offline_page_size) {
+ return R.string.bookmark_offline_page_size;
+ } else {
+ return stringResId;
+ }
+ }
+
+ /**
* Retrieves the url to launch a bookmark or saved page. If latter, also marks it as
* accessed and reports the UMAs.
*
@@ -190,7 +251,7 @@ public class OfflinePageUtils {
final long bookmarkId, final int buttonType, final int actionTextId) {
Context context = activity.getBaseContext();
- final int snackbarTextId = R.string.offline_pages_viewing_offline_page;
+ final int snackbarTextId = getStringId(R.string.offline_pages_viewing_offline_page);
SnackbarController snackbarController = new SnackbarController() {
@Override
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index e50d72f..f61856a 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -2000,6 +2000,39 @@ Just open Chrome on your computer, go to the menu, and select “Sign in to Chro
View
</message>
+ <!-- Offline pages (Use 'bookmarks' name in UI strings) -->
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_OFFLINE_PAGE_SIZE" desc="Label specifying that given saved page has an offline copy of a specific size (Use 'bookmarks' name in UI strings).">
+ <ph name="PAGE_SIZE_STRING">%1$s<ex>1.32 MB</ex></ph> bookmark saved offline
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_OFFLINE_PAGE_VISIT" desc="Label specifying that given saved page does not have an offline copy, and user does not have that page open (Use 'bookmarks' name in UI strings).">
+ Visit bookmark to save offline
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SAVED" desc="Message shown after user adds a new offline page (Use 'bookmarks' name in UI strings).">
+ Bookmark saved offline
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SAVED_FOLDER" desc="Message shown after user saves a new offline page. Also specifies in which folder the bookmark was added (Use 'bookmarks' name in UI strings).">
+ Bookmark saved offline to <ph name="FOLDER_NAME">%1$s<ex>Mobile bookmarks</ex></ph>
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SKIPPED" desc="Message shown after a page was saved as a bookmark, but an offline copy was not created due to that the page is not HTTP or HTTPS page (Use 'bookmarks' name in UI strings).">
+ Bookmarked
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_SAVED_STORAGE_NEAR_FULL" desc="Message shown after user adds a new offline page and the storage is almost full (Use 'bookmarks' name in UI strings).">
+ Bookmark saved offline. Storage almost full.
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_FAILED_TO_SAVE" desc="Message shown after a page was saved as a bookmark, but an offline copy was not created due to problems other than storage (Use 'bookmarks' name in UI strings).">
+ Bookmark not available offline
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_PAGE_FAILED_TO_SAVE_STORAGE_NEAR_FULL" desc="Message shown after a page was saved as a bookmark, but an offline copy was not created due to storage problem (Use 'bookmarks' name in UI strings).">
+ Bookmark not available offline. Storage almost full.
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_STORAGE_SPACE_MESSAGE" desc="Text explaining how much storage is currently used for offline copies of saved pages (Use 'bookmarks' name in UI strings).">
+ Bookmarks are currently taking up <ph name="TOTAL_OFFLINE_STORAGE_SIZE">%1$s<ex>780 MB</ex></ph>.
+ </message>
+ <message name="IDS_OFFLINE_PAGES_AS_BOOKMARKS_VIEWING_OFFLINE_PAGE" desc="Text explaining that the user is viewing an offline copy of a web page (Use 'bookmarks' name in UI strings).">
+ Viewing an offline copy of this bookmark
+ </message>
+
+
<!-- Find in page -->
<message name="IDS_HINT_FIND_IN_PAGE" desc="Hint text to show for the find in page search field when the search field is empty.">
Find in page
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java
new file mode 100644
index 0000000..b63e5a6
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageFeatureTest.java
@@ -0,0 +1,80 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.offlinepages;
+
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.components.offlinepages.FeatureMode;
+import org.chromium.content.browser.test.NativeLibraryTestBase;
+
+/** Unit tests for offline pages feature. */
+public class OfflinePageFeatureTest extends NativeLibraryTestBase {
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ loadNativeLibraryAndInitBrowserProcess();
+ }
+
+ @CommandLineFlags.Add({ChromeSwitches.ENABLE_OFFLINE_PAGES_AS_BOOKMARKS})
+ @SmallTest
+ @UiThreadTest
+ public void testEnableOfflinePagesAsBookmarks() throws Exception {
+ assertEquals(FeatureMode.ENABLED_AS_BOOKMARKS, OfflinePageBridge.getFeatureMode());
+
+ /** String is not updated since the experiment switch asks for the "bookmarks" version. */
+ assertEquals(
+ R.string.menu_bookmarks, OfflinePageUtils.getStringId(R.string.menu_bookmarks));
+ /** String is not updated when no mapping exists. */
+ assertEquals(R.string.bookmark_offline_page_none,
+ OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none));
+ }
+
+ @CommandLineFlags.Add({ChromeSwitches.ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES})
+ @SmallTest
+ @UiThreadTest
+ public void testEnableOfflinePagesAsSavedPages() throws Exception {
+ assertEquals(FeatureMode.ENABLED_AS_SAVED_PAGES, OfflinePageBridge.getFeatureMode());
+
+ /** String is updated when a mapping is found. */
+ assertEquals(R.string.menu_bookmarks_offline_pages,
+ OfflinePageUtils.getStringId(R.string.menu_bookmarks));
+ /** String is not updated when no mapping exists. */
+ assertEquals(R.string.bookmark_offline_page_none,
+ OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none));
+ }
+
+ @CommandLineFlags.Add({ChromeSwitches.ENABLE_OFFLINE_PAGES})
+ @SmallTest
+ @UiThreadTest
+ public void testEnableOfflinePages() throws Exception {
+ assertEquals(FeatureMode.ENABLED_AS_SAVED_PAGES, OfflinePageBridge.getFeatureMode());
+
+ /** String is not updated since the experiment switch asks for the "bookmarks" version. */
+ assertEquals(R.string.menu_bookmarks_offline_pages,
+ OfflinePageUtils.getStringId(R.string.menu_bookmarks));
+ /** String is not updated when no mapping exists. */
+ assertEquals(R.string.bookmark_offline_page_none,
+ OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none));
+ }
+
+ @CommandLineFlags.Add({ChromeSwitches.DISABLE_OFFLINE_PAGES})
+ @SmallTest
+ @UiThreadTest
+ public void testDisableOfflinePages() throws Exception {
+ assertEquals(FeatureMode.DISABLED, OfflinePageBridge.getFeatureMode());
+
+ /** Strings are not updated regardless whether the mappings exist when the feature is
+ * disabled.
+ */
+ assertEquals(
+ R.string.menu_bookmarks, OfflinePageUtils.getStringId(R.string.menu_bookmarks));
+ assertEquals(R.string.bookmark_offline_page_none,
+ OfflinePageUtils.getStringId(R.string.bookmark_offline_page_none));
+ }
+}
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 0ccee99..2d8bfd4 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -14431,6 +14431,12 @@ Please check your email at <ph name="ACCOUNT_EMAIL">$2<ex>jane.doe@gmail.com</ex
<message name="IDS_FLAGS_OFFLINE_PAGES_DESCRIPTION" desc="Description for the flag to enable offline pages.">
Enable storing pages locally for offline use.
</message>
+ <message name="IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_BOOKMARKS" desc="Option to enable offline pages feature using name 'bookmarks' shown in user-visible strings">
+ Enabled as bookmarks
+ </message>
+ <message name="IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES" desc="Option to enable offline pages feature using name 'saved pages' shown in user-visible strings">
+ Enabled as saved pages
+ </message>
<message name="IDS_FLAGS_NTP_POPULAR_SITES_NAME" desc="Name for the flag to enable showing non-personalized popular suggestions on the New Tab Page, when no personal suggestions are available yet.">
Show popular sites on the New Tab page
</message>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7a40fc8..0cb7d73 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -507,6 +507,18 @@ const FeatureEntry::Choice kUpdateMenuItemSummaryChoices[] = {
};
#endif // defined(OS_ANDROID)
+#if defined(OS_ANDROID)
+const FeatureEntry::Choice kEnableOfflinePagesChoices[] = {
+ {IDS_GENERIC_EXPERIMENT_CHOICE_DEFAULT, "", ""},
+ {IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_BOOKMARKS,
+ switches::kEnableOfflinePagesAsBookmarks, ""},
+ {IDS_FLAGS_ENABLE_OFFLINE_PAGES_AS_SAVED_PAGES,
+ switches::kEnableOfflinePagesAsSavedPages, ""},
+ {IDS_GENERIC_EXPERIMENT_CHOICE_DISABLED, switches::kDisableOfflinePages,
+ ""},
+};
+#endif // defined(OS_ANDROID)
+
// RECORDING USER METRICS FOR FLAGS:
// -----------------------------------------------------------------------------
// The first line of the entry is the internal name. If you'd like to gather
@@ -1939,12 +1951,9 @@ const FeatureEntry kFeatureEntries[] = {
MULTI_VALUE_TYPE(kProgressBarAnimationChoices)},
#endif // defined(OS_ANDROID)
#if defined(OS_ANDROID)
- {"offline-pages",
- IDS_FLAGS_OFFLINE_PAGES_NAME,
- IDS_FLAGS_OFFLINE_PAGES_DESCRIPTION,
- kOsAndroid,
- ENABLE_DISABLE_VALUE_TYPE(switches::kEnableOfflinePages,
- switches::kDisableOfflinePages)},
+ {"offline-pages-mode", IDS_FLAGS_OFFLINE_PAGES_NAME,
+ IDS_FLAGS_OFFLINE_PAGES_DESCRIPTION, kOsAndroid,
+ MULTI_VALUE_TYPE(kEnableOfflinePagesChoices)},
#endif // defined(OS_ANDROID)
{"low-priority-iframes",
IDS_FLAGS_LOW_PRIORITY_IFRAMES_UI_NAME,
diff --git a/chrome/browser/android/offline_pages/offline_page_bridge.cc b/chrome/browser/android/offline_pages/offline_page_bridge.cc
index 6101adc..716403c 100644
--- a/chrome/browser/android/offline_pages/offline_page_bridge.cc
+++ b/chrome/browser/android/offline_pages/offline_page_bridge.cc
@@ -67,9 +67,8 @@ void ToJavaOfflinePageList(JNIEnv* env,
} // namespace
-static jboolean IsOfflinePagesEnabled(JNIEnv* env,
- const JavaParamRef<jclass>& clazz) {
- return offline_pages::IsOfflinePagesEnabled();
+static jint GetFeatureMode(JNIEnv* env, const JavaParamRef<jclass>& clazz) {
+ return static_cast<jint>(offline_pages::GetOfflinePageFeatureMode());
}
static jboolean CanSavePage(JNIEnv* env,
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index cd50af3..b3cdde7 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -192,6 +192,7 @@
#include "chrome/common/descriptors_android.h"
#include "components/crash/content/browser/crash_dump_manager_android.h"
#include "components/navigation_interception/intercept_navigation_delegate.h"
+#include "components/offline_pages/offline_page_switches.h"
#include "ui/base/resource/resource_bundle_android.h"
#elif defined(OS_POSIX)
#include "chrome/browser/chrome_browser_main_posix.h"
@@ -1604,6 +1605,9 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches(
#endif
switches::kEnableNetBenchmarking,
switches::kEnableNewBookmarkApps,
+#if defined(OS_ANDROID)
+ switches::kEnableOfflinePagesAsBookmarks,
+#endif
switches::kJavaScriptHarmony,
switches::kMessageLoopHistogrammer,
switches::kPpapiFlashArgs,
diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp
index a424f37..1ad742e 100644
--- a/chrome/chrome.gyp
+++ b/chrome/chrome.gyp
@@ -559,7 +559,8 @@
'../components/components.gyp:gcm_driver_java',
'../components/components.gyp:invalidation_java',
'../components/components.gyp:navigation_interception_java',
- '../components/components.gyp:offline_pages_enums_java',
+ '../components/components.gyp:offline_page_feature_enums_java',
+ '../components/components.gyp:offline_page_model_enums_java',
'../components/components.gyp:precache_java',
'../components/components.gyp:safe_json_java',
'../components/components.gyp:security_state_enums_java',
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 8417794..fb57a95 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -85,6 +85,7 @@ static_library("common") {
"//components/metrics:net",
"//components/nacl/common:process_type",
"//components/nacl/common:switches",
+ "//components/offline_pages:switches",
"//components/omnibox/common",
"//components/policy:policy_component_common",
"//components/strings",
diff --git a/chrome/common/DEPS b/chrome/common/DEPS
index 84bf958..ead1d81 100644
--- a/chrome/common/DEPS
+++ b/chrome/common/DEPS
@@ -16,6 +16,7 @@ include_rules = [
"+components/metrics/client_info.h",
"+components/metrics/metrics_pref_names.h",
"+components/nacl/common",
+ "+components/offline_pages/offline_page_feature.h",
"+components/password_manager/core/common",
"+components/printing/common",
"+components/policy/core/common",
diff --git a/chrome/common/localized_error.cc b/chrome/common/localized_error.cc
index 8ff1643..8867eca 100644
--- a/chrome/common/localized_error.cc
+++ b/chrome/common/localized_error.cc
@@ -33,6 +33,10 @@
#include "base/win/windows_version.h"
#endif
+#if defined(OS_ANDROID)
+#include "components/offline_pages/offline_page_feature.h"
+#endif
+
using error_page::OfflinePageStatus;
// Some error pages have no details.
@@ -775,8 +779,11 @@ void LocalizedError::GetStrings(int error_code,
OfflinePageStatus::HAS_OTHER_OFFLINE_PAGES) {
base::DictionaryValue* show_offline_pages_button =
new base::DictionaryValue;
- base::string16 button_text =
- l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES);
+ base::string16 button_text = l10n_util::GetStringUTF16(
+ offline_pages::GetOfflinePageFeatureMode() ==
+ offline_pages::FeatureMode::ENABLED_AS_BOOKMARKS
+ ? IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES_AS_BOOKMARKS
+ : IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES);
show_offline_pages_button->SetString("msg", button_text);
error_strings->Set("showOfflinePagesButton", show_offline_pages_button);
}
diff --git a/components/error_page_strings.grdp b/components/error_page_strings.grdp
index f18c2ce..8a66053 100644
--- a/components/error_page_strings.grdp
+++ b/components/error_page_strings.grdp
@@ -30,6 +30,9 @@
</message>
</if>
<if expr="is_android">
+ <message name="IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES_AS_BOOKMARKS" desc="Label for the button on an error page to show bookmarks that have been saved offline">
+ Show all bookmarks
+ </message>
<message name="IDS_ERRORPAGES_BUTTON_SHOW_OFFLINE_PAGES" desc="Label for the button on an error page to show pages that have been saved offline">
Show all saved pages
</message>
diff --git a/components/offline_pages.gypi b/components/offline_pages.gypi
index 33e34ae..6ba8033 100644
--- a/components/offline_pages.gypi
+++ b/components/offline_pages.gypi
@@ -70,8 +70,17 @@
['OS == "android"', {
'targets': [
{
- # GN: //components/offline_pages:offline_pages_enums_java
- 'target_name': 'offline_pages_enums_java',
+ # GN: //components/offline_pages:offline_page_feature_enums_java
+ 'target_name': 'offline_page_feature_enums_java',
+ 'type': 'none',
+ 'variables': {
+ 'source_file': 'offline_pages/offline_page_feature.h',
+ },
+ 'includes': [ '../build/android/java_cpp_enum.gypi' ],
+ },
+ {
+ # GN: //components/offline_pages:offline_page_model_enums_java
+ 'target_name': 'offline_page_model_enums_java',
'type': 'none',
'variables': {
'source_file': 'offline_pages/offline_page_model.h',
diff --git a/components/offline_pages/BUILD.gn b/components/offline_pages/BUILD.gn
index 26f2852..88dbd1e 100644
--- a/components/offline_pages/BUILD.gn
+++ b/components/offline_pages/BUILD.gn
@@ -10,8 +10,6 @@ if (is_android) {
static_library("offline_pages") {
sources = [
"offline_page_archiver.h",
- "offline_page_feature.cc",
- "offline_page_feature.h",
"offline_page_item.cc",
"offline_page_item.h",
"offline_page_metadata_store.cc",
@@ -20,11 +18,10 @@ static_library("offline_pages") {
"offline_page_metadata_store_impl.h",
"offline_page_model.cc",
"offline_page_model.h",
- "offline_page_switches.cc",
- "offline_page_switches.h",
]
deps = [
+ ":switches",
"//base",
"//components/bookmarks/browser",
"//components/keyed_service/core",
@@ -47,12 +44,26 @@ static_library("test_support") {
deps = [
":offline_pages",
+ ":switches",
"//base",
"//testing/gtest",
"//url",
]
}
+source_set("switches") {
+ sources = [
+ "offline_page_feature.cc",
+ "offline_page_feature.h",
+ "offline_page_switches.cc",
+ "offline_page_switches.h",
+ ]
+
+ deps = [
+ "//base",
+ ]
+}
+
source_set("unit_tests") {
testonly = true
sources = [
@@ -75,7 +86,13 @@ source_set("unit_tests") {
}
if (is_android) {
- java_cpp_enum("offline_pages_enums_java") {
+ java_cpp_enum("offline_page_feature_enums_java") {
+ sources = [
+ "offline_page_feature.h",
+ ]
+ }
+
+ java_cpp_enum("offline_page_model_enums_java") {
sources = [
"offline_page_model.h",
]
diff --git a/components/offline_pages/offline_page_feature.cc b/components/offline_pages/offline_page_feature.cc
index 586ed20..60f239b8 100644
--- a/components/offline_pages/offline_page_feature.cc
+++ b/components/offline_pages/offline_page_feature.cc
@@ -17,22 +17,50 @@ namespace offline_pages {
namespace {
const char kOfflinePagesFieldTrialName[] = "OfflinePages";
-const char kOfflinePagesFieldTrialEnabledGroupName[] = "Enabled";
+// The old experiment has only one mode to enable offline pages.
+const char kEnabledGroupName[] = "Enabled";
+// The new experiment supports two modes for offline pages.
+const char kEnabledAsBookmarksGroupName[] = "EnabledAsBookmarks";
+const char kEnabledAsSavedPagesGroupName[] = "EnabledAsSavedPages";
} // namespace
-bool IsOfflinePagesEnabled() {
+FeatureMode GetOfflinePageFeatureMode() {
+ // The old experiment 'Enabled' defaults to showing saved page.
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableOfflinePages)) {
- return true;
+ return FeatureMode::ENABLED_AS_SAVED_PAGES;
+ }
+ // The new experiment can control showing either bookmark or saved page.
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableOfflinePagesAsBookmarks)) {
+ return FeatureMode::ENABLED_AS_BOOKMARKS;
+ }
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableOfflinePagesAsSavedPages)) {
+ return FeatureMode::ENABLED_AS_SAVED_PAGES;
}
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableOfflinePages)) {
- return false;
+ return FeatureMode::DISABLED;
}
std::string group_name =
base::FieldTrialList::FindFullName(kOfflinePagesFieldTrialName);
- return group_name == kOfflinePagesFieldTrialEnabledGroupName;
+ // The old experiment 'Enabled' defaults to showing saved page.
+ if (group_name == kEnabledGroupName)
+ return FeatureMode::ENABLED_AS_SAVED_PAGES;
+ // The new experiment can control showing either bookmark or saved page.
+ if (group_name == kEnabledAsBookmarksGroupName)
+ return FeatureMode::ENABLED_AS_BOOKMARKS;
+ if (group_name == kEnabledAsSavedPagesGroupName)
+ return FeatureMode::ENABLED_AS_SAVED_PAGES;
+ return FeatureMode::DISABLED;
+}
+
+bool IsOfflinePagesEnabled() {
+ FeatureMode mode = GetOfflinePageFeatureMode();
+ return mode == FeatureMode::ENABLED_AS_BOOKMARKS ||
+ mode == FeatureMode::ENABLED_AS_SAVED_PAGES;
}
} // namespace offline_pages
diff --git a/components/offline_pages/offline_page_feature.h b/components/offline_pages/offline_page_feature.h
index 0bf6ad2..600140f 100644
--- a/components/offline_pages/offline_page_feature.h
+++ b/components/offline_pages/offline_page_feature.h
@@ -11,6 +11,19 @@
namespace offline_pages {
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.offlinepages
+enum class FeatureMode {
+ // Offline pages feature is disabled.
+ DISABLED,
+ // Offline pages feature is enabled, showing bookmarks in UI strings.
+ ENABLED_AS_BOOKMARKS,
+ // Offline pages feature is enabled, showing saved pages in UI strings.
+ ENABLED_AS_SAVED_PAGES
+};
+
+// Returns the mode where Offline Pages feature is running.
+FeatureMode GetOfflinePageFeatureMode();
+
// Returns true if offline pages is enabled.
bool IsOfflinePagesEnabled();
diff --git a/components/offline_pages/offline_page_switches.cc b/components/offline_pages/offline_page_switches.cc
index 2a24c35..e326a17 100644
--- a/components/offline_pages/offline_page_switches.cc
+++ b/components/offline_pages/offline_page_switches.cc
@@ -12,4 +12,12 @@ const char kEnableOfflinePages[] = "enable-offline-pages";
// Disable Offline Pages.
const char kDisableOfflinePages[] = "disable-offline-pages";
+// Enable Offline Pages showing "bookmarks" in UI strings.
+const char kEnableOfflinePagesAsBookmarks[] =
+ "enable-offline-pages-as-bookmarks";
+
+// Enable Offline Pages showing "saved pages" in UI strings.
+const char kEnableOfflinePagesAsSavedPages[] =
+ "enable-offline-pages-as-saved-pages";
+
} // namespace switches
diff --git a/components/offline_pages/offline_page_switches.h b/components/offline_pages/offline_page_switches.h
index 4df0618..46e75c0 100644
--- a/components/offline_pages/offline_page_switches.h
+++ b/components/offline_pages/offline_page_switches.h
@@ -9,6 +9,8 @@ namespace switches {
extern const char kEnableOfflinePages[];
extern const char kDisableOfflinePages[];
+extern const char kEnableOfflinePagesAsBookmarks[];
+extern const char kEnableOfflinePagesAsSavedPages[];
} // namespace switches
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index b9b2423..e39a5bf 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -69584,6 +69584,7 @@ To add a new entry, add it with any value and run test to compute valid value.
<int value="-378033324" label="disable-win32k-renderer-lockdown"/>
<int value="-360038744" label="invert-viewport-scroll-order"/>
<int value="-351552989" label="disable-hosted-apps-in-windows"/>
+ <int value="-351127770" label="enable-offline-pages-as-bookmarks"/>
<int value="-349057743" label="extensions-on-chrome-urls"/>
<int value="-345838366" label="enable-hosted-apps-in-windows"/>
<int value="-344343842" label="disable-experimental-app-list"/>
@@ -69623,6 +69624,7 @@ To add a new entry, add it with any value and run test to compute valid value.
<int value="-23090520" label="disable-search-button-in-omnibox"/>
<int value="-22544408" label="enable-video-player-chromecast-support"/>
<int value="-13918890" label="disable-download-notification"/>
+ <int value="-11260186" label="enable-offline-pages-as-saved-pages"/>
<int value="-5052940" label="enable-simplified-fullscreen"/>
<int value="-2371418" label="disable-display-list-2d-canvas"/>
<int value="0" label="BAD_FLAG_FORMAT">