diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java index 34089a8..c22161d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -223,7 +223,6 @@ public static final String NTP_MODERN_LAYOUT = "NTPModernLayout"; public static final String NTP_FOREIGN_SESSIONS_SUGGESTIONS = "NTPForeignSessionsSuggestions"; public static final String NTP_LAUNCH_AFTER_INACTIVITY = "NTPLaunchAfterInactivity"; - public static final String NTP_OFFLINE_PAGES_FEATURE_NAME = "NTPOfflinePages"; public static final String NTP_SHOW_GOOGLE_G_IN_OMNIBOX = "NTPShowGoogleGInOmnibox"; public static final String NTP_SNIPPETS_INCREASED_VISIBILITY = "NTPSnippetsIncreasedVisibility"; public static final String OMNIBOX_SPARE_RENDERER = "OmniboxSpareRenderer";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java index 8cca410..d1698bf5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselAdapter.java
@@ -4,11 +4,9 @@ package org.chromium.chrome.browser.suggestions; -import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ntp.ContextMenuManager; import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; @@ -33,11 +31,7 @@ /** The list of suggestions held in the carousel currently. */ private final List<SnippetArticle> mSuggestionsList; - /** - * Access point to offline related features. Will be {@code null} when the badges are disabled. - * @see ChromeFeatureList#NTP_OFFLINE_PAGES_FEATURE_NAME - */ - @Nullable + /** Access point to offline related features. */ private final OfflineModelObserver mObserver; public SuggestionsCarouselAdapter(UiConfig uiConfig, SuggestionsUiDelegate uiDelegate, @@ -46,13 +40,8 @@ mUiConfig = uiConfig; mContextMenuManager = contextMenuManager; mSuggestionsList = new ArrayList<>(); - - if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) { - mObserver = new OfflineModelObserver(offlinePageBridge); - mUiDelegate.addDestructionObserver(mObserver); - } else { - mObserver = null; - } + mObserver = new OfflineModelObserver(offlinePageBridge); + mUiDelegate.addDestructionObserver(mObserver); } @Override @@ -85,10 +74,8 @@ mSuggestionsList.clear(); mSuggestionsList.addAll(suggestions); - if (mObserver != null) { - mObserver.updateAllSuggestionsOfflineAvailability( - /* reportPrefetchedSuggestionsCount = */ false); - } + mObserver.updateAllSuggestionsOfflineAvailability( + /* reportPrefetchedSuggestionsCount = */ false); notifyDataSetChanged(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java index ebd8486..3ffbf05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroup.java
@@ -16,7 +16,6 @@ import org.chromium.base.Callback; import org.chromium.base.VisibleForTesting; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.favicon.IconType; import org.chromium.chrome.browser.favicon.LargeIconBridge; import org.chromium.chrome.browser.ntp.ContextMenuManager; @@ -154,11 +153,7 @@ */ private final Collection<Integer> mPendingTasks = new ArrayList<>(); - /** - * Access point to offline related features. Will be {@code null} when the badges are disabled. - * @see ChromeFeatureList#NTP_OFFLINE_PAGES_FEATURE_NAME - */ - @Nullable + /** Access point to offline related features. */ private final OfflineModelObserver mOfflineModelObserver; /** @@ -225,13 +220,8 @@ mTileGroupDelegate = tileGroupDelegate; mObserver = observer; mTileRenderer = tileRenderer; - - if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) { - mOfflineModelObserver = new OfflineModelObserver(offlinePageBridge); - mUiDelegate.addDestructionObserver(mOfflineModelObserver); - } else { - mOfflineModelObserver = null; - } + mOfflineModelObserver = new OfflineModelObserver(offlinePageBridge); + mUiDelegate.addDestructionObserver(mOfflineModelObserver); } @Override @@ -366,10 +356,8 @@ if (!dataChanged) return; - if (mOfflineModelObserver != null) { - mOfflineModelObserver.updateAllSuggestionsOfflineAvailability( - /* reportPrefetchedSuggestionsCount = */ false); - } + mOfflineModelObserver.updateAllSuggestionsOfflineAvailability( + /* reportPrefetchedSuggestionsCount = */ false); if (countChanged) mObserver.onTileCountChanged();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java index 99d0566..7c517e9a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/TileGroupDelegateImpl.java
@@ -10,7 +10,6 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.snackbar.Snackbar; @@ -84,11 +83,9 @@ mMostVisitedSites.recordPageImpression(tiles.size()); - if (ChromeFeatureList.isEnabled(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) { - for (Tile tile : tiles) { - if (tile.isOfflineAvailable()) { - SuggestionsMetrics.recordTileOfflineAvailability(tile.getIndex()); - } + for (Tile tile : tiles) { + if (tile.isOfflineAvailable()) { + SuggestionsMetrics.recordTileOfflineAvailability(tile.getIndex()); } } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java index bb26554..180a6a7 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/SuggestionsCarouselTest.java
@@ -41,8 +41,7 @@ */ @RunWith(LocalRobolectricTestRunner.class) @Config(manifest = Config.NONE) -@EnableFeatures({ChromeFeatureList.CHROME_HOME, ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_CAROUSEL, - ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME}) +@EnableFeatures({ChromeFeatureList.CHROME_HOME, ChromeFeatureList.CONTEXTUAL_SUGGESTIONS_CAROUSEL}) public class SuggestionsCarouselTest { private static final String URL_STRING = "http://www.test.com"; private static final String INVALID_URL = "file://URL";
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java index 0c9b9531..0b390a3 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/TileGroupUnitTest.java
@@ -52,7 +52,6 @@ import org.chromium.chrome.test.util.browser.ChromeHome; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; -import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.chrome.test.util.browser.suggestions.FakeMostVisitedSites; import org.chromium.testing.local.LocalRobolectricTestRunner; @@ -65,7 +64,6 @@ */ @RunWith(LocalRobolectricTestRunner.class) @Config(manifest = Config.NONE) -@EnableFeatures(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME) @DisableFeatures({ChromeFeatureList.NTP_MODERN_LAYOUT}) @ChromeHome.Enable public class TileGroupUnitTest {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 7dde218..3011f82 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2602,9 +2602,6 @@ FEATURE_VALUE_TYPE(content::kWebRtcH264WithOpenH264FFmpeg)}, #endif // ENABLE_WEBRTC && BUILDFLAG(RTC_USE_H264) && !MEDIA_DISABLE_FFMPEG #if defined(OS_ANDROID) - {"offline-pages-ntp", flag_descriptions::kNtpOfflinePagesName, - flag_descriptions::kNtpOfflinePagesDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kNTPOfflinePagesFeature)}, {"offlining-recent-pages", flag_descriptions::kOffliningRecentPagesName, flag_descriptions::kOffliningRecentPagesDescription, kOsAndroid, FEATURE_VALUE_TYPE(offline_pages::kOffliningRecentPagesFeature)},
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 0fa76ec1..7f0dd14 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -102,7 +102,6 @@ &kNTPCondensedTileLayoutFeature, &kNTPModernLayoutFeature, &kNTPLaunchAfterInactivity, - &kNTPOfflinePagesFeature, &NTPShowGoogleGInOmniboxFeature, &kOmniboxSpareRenderer, &kPayWithGoogleV1, @@ -309,9 +308,6 @@ const base::Feature kNTPLaunchAfterInactivity{ "NTPLaunchAfterInactivity", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kNTPOfflinePagesFeature{"NTPOfflinePages", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature NTPShowGoogleGInOmniboxFeature{ "NTPShowGoogleGInOmnibox", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index ceef8e6..1b09a01 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -62,7 +62,6 @@ extern const base::Feature kNTPCondensedTileLayoutFeature; extern const base::Feature kNTPModernLayoutFeature; extern const base::Feature kNTPLaunchAfterInactivity; -extern const base::Feature kNTPOfflinePagesFeature; extern const base::Feature NTPShowGoogleGInOmniboxFeature; extern const base::Feature kOmniboxSpareRenderer; extern const base::Feature kPayWithGoogleV1;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 18597687..302fe34 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1992,11 +1992,6 @@ const char kNtpGoogleGInOmniboxDescription[] = "Show a Google G in the omnibox on the New Tab Page."; -const char kNtpOfflinePagesName[] = "Enable NTP offline pages"; -const char kNtpOfflinePagesDescription[] = - "Enables badging of offline pages on the New Tab page. Only relevant if " - "offline pages are enabled."; - const char kNtpPopularSitesName[] = "Show popular sites on the New Tab page"; const char kNtpPopularSitesDescription[] = "Pre-populate the New Tab page with popular sites.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index e0898576..56c1f2f 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1221,9 +1221,6 @@ extern const char kNtpGoogleGInOmniboxName[]; extern const char kNtpGoogleGInOmniboxDescription[]; -extern const char kNtpOfflinePagesName[]; -extern const char kNtpOfflinePagesDescription[]; - extern const char kNtpPopularSitesName[]; extern const char kNtpPopularSitesDescription[];
diff --git a/chrome/browser/signin/dice_tab_helper.cc b/chrome/browser/signin/dice_tab_helper.cc index b9e98a5..5897268 100644 --- a/chrome/browser/signin/dice_tab_helper.cc +++ b/chrome/browser/signin/dice_tab_helper.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/signin/dice_tab_helper.h" #include "base/logging.h" +#include "base/metrics/user_metrics.h" #include "chrome/browser/signin/dice_tab_helper.h" #include "chrome/browser/signin/signin_util.h" #include "chrome/browser/ui/browser_finder.h" @@ -15,13 +16,9 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(DiceTabHelper); DiceTabHelper::DiceTabHelper(content::WebContents* web_contents) - : content::WebContentsObserver(web_contents), - signin_access_point_(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN), - signin_reason_(signin_metrics::Reason::REASON_UNKNOWN_REASON), - should_start_sync_after_web_signin_(true) { -} + : content::WebContentsObserver(web_contents) {} -DiceTabHelper::~DiceTabHelper() {} +DiceTabHelper::~DiceTabHelper() = default; void DiceTabHelper::InitializeSigninFlow( signin_metrics::AccessPoint access_point, @@ -29,6 +26,13 @@ signin_access_point_ = access_point; signin_reason_ = reason; should_start_sync_after_web_signin_ = true; + did_finish_loading_signin_page_ = false; + + if (signin_reason_ == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) { + signin_metrics::LogSigninAccessPointStarted(access_point); + signin_metrics::RecordSigninUserActionForAccessPoint(access_point); + base::RecordAction(base::UserMetricsAction("Signin_SigninPage_Loading")); + } } void DiceTabHelper::DidStartNavigation( @@ -56,11 +60,16 @@ should_start_sync_after_web_signin_ = false; return; } +} - // TODO(msarda): Figure out if this condition can be restricted even more - // (e.g. avoid starting sync after a browser initiated navigation). - // if (!navigation_handle->IsRendererInitiated()) { - // // Avoid starting sync if the navigations comes from the browser. - // should_start_sync_after_web_signin_ = false; - //} +void DiceTabHelper::DidFinishLoad(content::RenderFrameHost* render_frame_host, + const GURL& validated_url) { + if (!should_start_sync_after_web_signin_ || did_finish_loading_signin_page_) + return; + + if (validated_url.GetOrigin() == GaiaUrls::GetInstance()->gaia_url()) { + VLOG(1) << "Finished loading sign-in page: " << validated_url.spec(); + did_finish_loading_signin_page_ = true; + base::RecordAction(base::UserMetricsAction("Signin_SigninPage_Shown")); + } }
diff --git a/chrome/browser/signin/dice_tab_helper.h b/chrome/browser/signin/dice_tab_helper.h index 8e9aecf..c336b0cf 100644 --- a/chrome/browser/signin/dice_tab_helper.h +++ b/chrome/browser/signin/dice_tab_helper.h
@@ -10,6 +10,9 @@ #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" +namespace content { +class RenderFrameHost; +} // Tab helper used for DICE to mark that sync should start after a web sign-in // with a Google account. class DiceTabHelper : public content::WebContentsUserData<DiceTabHelper>, @@ -36,14 +39,19 @@ // content::WebContentsObserver: void DidStartNavigation( content::NavigationHandle* navigation_handle) override; + void DidFinishLoad(content::RenderFrameHost* render_frame_host, + const GURL& validated_url) override; private: friend class content::WebContentsUserData<DiceTabHelper>; explicit DiceTabHelper(content::WebContents* web_contents); - signin_metrics::AccessPoint signin_access_point_; - signin_metrics::Reason signin_reason_; - bool should_start_sync_after_web_signin_; + signin_metrics::AccessPoint signin_access_point_ = + signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN; + signin_metrics::Reason signin_reason_ = + signin_metrics::Reason::REASON_UNKNOWN_REASON; + bool should_start_sync_after_web_signin_ = true; + bool did_finish_loading_signin_page_ = false; DISALLOW_COPY_AND_ASSIGN(DiceTabHelper); };
diff --git a/chrome/browser/signin/dice_tab_helper_unittest.cc b/chrome/browser/signin/dice_tab_helper_unittest.cc index 0c66541..a6b01e97 100644 --- a/chrome/browser/signin/dice_tab_helper_unittest.cc +++ b/chrome/browser/signin/dice_tab_helper_unittest.cc
@@ -4,10 +4,13 @@ #include "chrome/browser/signin/dice_tab_helper.h" +#include "base/test/histogram_tester.h" +#include "base/test/user_action_tester.h" #include "chrome/test/base/testing_profile.h" #include "components/signin/core/browser/signin_metrics.h" #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_web_contents_factory.h" +#include "google_apis/gaia/gaia_urls.h" #include "testing/gtest/include/gtest/gtest.h" // Tests DiceTabHelper intialization. @@ -35,3 +38,55 @@ EXPECT_EQ(access_point, dice_tab_helper->signin_access_point()); EXPECT_EQ(reason, dice_tab_helper->signin_reason()); } + +// Tests DiceTabHelper metrics. +TEST(DiceTabHelperTest, Metrics) { + base::UserActionTester ua_tester; + base::HistogramTester h_tester; + content::TestBrowserThreadBundle thread_bundle; + TestingProfile profile; + content::TestWebContentsFactory factory; + content::WebContents* web_contents = factory.CreateWebContents(&profile); + DiceTabHelper::CreateForWebContents(web_contents); + DiceTabHelper* dice_tab_helper = DiceTabHelper::FromWebContents(web_contents); + + // No metrics are logged when the Dice tab helper is created. + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_Signin_FromStartPage")); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Check metrics logged when the Dice tab helper is initialized. + dice_tab_helper->InitializeSigninFlow( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_Signin_FromStartPage")); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(0, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + EXPECT_EQ(1, h_tester.GetBucketCount( + "Signin.SigninStartedAccessPoint", + static_cast<int>( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE))); + + // First call to did finish load does logs any Signin_SigninPage_Shown user + // action. + GURL signin_page_url = GaiaUrls::GetInstance()->gaia_url(); + dice_tab_helper->DidFinishLoad(nullptr, signin_page_url); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Second call to did finish load does not log any metrics. + dice_tab_helper->DidFinishLoad(nullptr, signin_page_url); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(1, ua_tester.GetActionCount("Signin_SigninPage_Shown")); + + // Check metrics are logged again when the Dice tab helper is re-initialized. + dice_tab_helper->InitializeSigninFlow( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, + signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT); + EXPECT_EQ(2, ua_tester.GetActionCount("Signin_Signin_FromStartPage")); + EXPECT_EQ(2, ua_tester.GetActionCount("Signin_SigninPage_Loading")); + EXPECT_EQ(2, h_tester.GetBucketCount( + "Signin.SigninStartedAccessPoint", + static_cast<int>( + signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE))); +}
diff --git a/chrome/browser/ui/signin_view_controller.cc b/chrome/browser/ui/signin_view_controller.cc index 83a94507..201e8ce 100644 --- a/chrome/browser/ui/signin_view_controller.cc +++ b/chrome/browser/ui/signin_view_controller.cc
@@ -155,11 +155,6 @@ DiceTabHelper::CreateForWebContents(active_contents); DiceTabHelper* tab_helper = DiceTabHelper::FromWebContents(active_contents); tab_helper->InitializeSigninFlow(access_point, signin_reason); - - if (signin_reason == signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) { - signin_metrics::LogSigninAccessPointStarted(access_point); - signin_metrics::RecordSigninUserActionForAccessPoint(access_point); - } } content::WebContents*
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm index c3be8806..eab84bfb 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_handset_view_controller.mm
@@ -34,6 +34,7 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_table_view.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h" +#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h" #include "ios/chrome/browser/ui/ui_util.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" #include "ios/chrome/grit/ios_strings.h" @@ -167,6 +168,16 @@ return NO; } +- (NSArray*)keyCommands { + __weak BookmarkHomeHandsetViewController* weakSelf = self; + return @[ [UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape + modifierFlags:Cr_UIKeyModifierNone + title:nil + action:^{ + [weakSelf navigationBarCancel:nil]; + }] ]; +} + #pragma mark - Superclass overrides - (void)loadBookmarkViews {
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn index 0e94a3d..b33f877 100644 --- a/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn +++ b/ios/chrome/browser/ui/ntp/recent_tabs/BUILD.gn
@@ -36,6 +36,7 @@ "//ios/chrome/browser/ui/authentication:authentication_ui", "//ios/chrome/browser/ui/commands", "//ios/chrome/browser/ui/context_menu", + "//ios/chrome/browser/ui/keyboard", "//ios/chrome/browser/ui/ntp", "//ios/chrome/browser/ui/ntp/recent_tabs/views", "//ios/chrome/browser/ui/settings/sync_utils",
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm index 382176a..744148f 100644 --- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_handset_view_controller.h" #include "base/logging.h" +#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h" #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator.h" #import "ios/chrome/browser/ui/ntp/recent_tabs/views/panel_bar_view.h" #import "ios/chrome/browser/ui/uikit_ui_util.h" @@ -83,6 +84,16 @@ return NO; } +- (NSArray*)keyCommands { + __weak RecentTabsHandsetViewController* weakSelf = self; + return @[ [UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape + modifierFlags:Cr_UIKeyModifierNone + title:nil + action:^{ + [weakSelf didFinish]; + }] ]; +} + #pragma mark Accessibility - (BOOL)accessibilityPerformEscape {
diff --git a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm index b12b9702..ab6fa6c 100644 --- a/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm +++ b/ios/chrome/browser/ui/toolbar/clean/toolbar_view_controller.mm
@@ -60,8 +60,11 @@ @property(nonatomic, assign) BOOL voiceSearchEnabled; @property(nonatomic, strong) MDCProgressView* progressBar; @property(nonatomic, strong) UIStackView* locationBarContainerStackView; -// The shadow below the toolbar. Lazily instantiated. +// The shadow below the toolbar when the omnibox is contracted. Lazily +// instantiated. @property(nonatomic, strong) UIImageView* shadowView; +// The shadow below the expanded omnibox. Lazily instantiated. +@property(nonatomic, strong) UIImageView* fullBleedShadowView; // Background view, used to display the incognito NTP background color on the // toolbar. @property(nonatomic, strong) UIView* backgroundView; @@ -110,6 +113,7 @@ @synthesize progressBar = _progressBar; @synthesize locationBarContainerStackView = _locationBarContainerStackView; @synthesize shadowView = _shadowView; +@synthesize fullBleedShadowView = _fullBleedShadowView; @synthesize expandedToolbarConstraints = _expandedToolbarConstraints; @synthesize topSafeAnchor = _topSafeAnchor; @synthesize regularToolbarConstraints = _regularToolbarConstraints; @@ -164,6 +168,8 @@ [animator addAnimations:^{ [self.view layoutIfNeeded]; + self.shadowView.alpha = 0; + self.fullBleedShadowView.alpha = 1; }]; // When the locationBarContainer has been expanded the Contract button will // fade in. @@ -208,6 +214,8 @@ [self.view layoutIfNeeded]; self.contractButton.hidden = YES; self.contractButton.alpha = 0; + self.shadowView.alpha = 1; + self.fullBleedShadowView.alpha = 0; }]; // Once the locationBarContainer has been contracted fade in ToolbarButtons. [animator addCompletion:^(UIViewAnimatingPosition finalPosition) { @@ -254,6 +262,7 @@ - (void)setBackgroundToIncognitoNTPColorWithAlpha:(CGFloat)alpha { self.backgroundView.alpha = alpha; + self.shadowView.alpha = 1 - alpha; } - (void)showPrerenderingAnimation { @@ -296,6 +305,7 @@ // Z order. [self.view addSubview:self.locationBarContainer]; [self.view addSubview:self.shadowView]; + [self.view addSubview:self.fullBleedShadowView]; [self.view addSubview:self.progressBar]; [self setConstraints]; } @@ -364,7 +374,7 @@ constraintEqualToConstant:kProgressBarHeight], ]]; - // Shadow constraints. + // Shadows constraints. [NSLayoutConstraint activateConstraints:@[ [self.shadowView.topAnchor constraintEqualToAnchor:self.view.bottomAnchor], [self.shadowView.leadingAnchor @@ -373,6 +383,14 @@ constraintEqualToAnchor:self.view.trailingAnchor], [self.shadowView.heightAnchor constraintEqualToConstant:kToolbarShadowHeight], + [self.fullBleedShadowView.topAnchor + constraintEqualToAnchor:self.view.bottomAnchor], + [self.fullBleedShadowView.leadingAnchor + constraintEqualToAnchor:self.view.leadingAnchor], + [self.fullBleedShadowView.trailingAnchor + constraintEqualToAnchor:self.view.trailingAnchor], + [self.fullBleedShadowView.heightAnchor + constraintEqualToConstant:kToolbarFullBleedShadowHeight], ]]; // Stack views constraints. @@ -917,6 +935,17 @@ return _shadowView; } +- (UIImageView*)fullBleedShadowView { + if (!_fullBleedShadowView) { + _fullBleedShadowView = [[UIImageView alloc] init]; + _fullBleedShadowView.translatesAutoresizingMaskIntoConstraints = NO; + _fullBleedShadowView.userInteractionEnabled = NO; + _fullBleedShadowView.alpha = 0; + _fullBleedShadowView.image = NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED); + } + return _fullBleedShadowView; +} + #pragma mark - Private // Sets the progress of the progressBar to 1 then hides it.
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h index d0bbbdd..206c339 100644 --- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h +++ b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h
@@ -67,8 +67,12 @@ // a popover anchored to it. extern const CGFloat kPopoverAnchorHorizontalPadding; -// Height of the shadow displayed below the toolbar. +// Height of the shadow displayed below the toolbar when the omnibox is +// contracted. extern const CGFloat kToolbarShadowHeight; +// Height of the shadow displayed below the toolbar when the omnibox is +// expanded. +extern const CGFloat kToolbarFullBleedShadowHeight; // Toolbar style. Determines which button images are used. enum ToolbarControllerStyle {
diff --git a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm index ae52172..23a5f05 100644 --- a/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm +++ b/ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.mm
@@ -29,6 +29,7 @@ const NSUInteger kTransitionLayerCapacity = 11; const CGFloat kToolbarShadowHeight = 2; +const CGFloat kToolbarFullBleedShadowHeight = 10; // Macros for creating CGRects of height H, origin (0,0), with the portrait // width of phone/pad devices.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index dae133ac..6ad8e520 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2327,21 +2327,6 @@ ] } ], - "OfflinePages": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "EnabledAsBookmarks", - "enable_features": [ - "NTPOfflinePages" - ] - } - ] - } - ], "OfflinePagesAsyncLoading": [ { "platforms": [
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 517f633..15a74ba 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2425,7 +2425,7 @@ crbug.com/626703 [ Win ] external/wpt/css/css-writing-modes/box-offsets-rel-pos-vlr-005.xht [ Failure ] crbug.com/626703 [ Win ] external/wpt/css/css-writing-modes/box-offsets-rel-pos-vrl-004.xht [ Failure ] -# css-multicol tests failing on initial import from web-platform-tests +# css-multicol tests are failing or flaky on initial import from web-platform-tests crbug.com/788337 external/wpt/css/css-multicol/multicol-block-no-clip-001.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-block-no-clip-002.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-count-computed-003.xht [ Failure ] @@ -2440,6 +2440,14 @@ crbug.com/788337 external/wpt/css/css-multicol/multicol-span-float-001.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-width-small-001.xht [ Failure ] crbug.com/788337 external/wpt/css/css-multicol/multicol-zero-height-001.xht [ Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-fill-balance-001.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-gap-negative-001.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-overflow-000.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-overflowing-001.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-002.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-shorthand-2.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-rule-stacking-001.xht [ Pass Failure ] +crbug.com/788337 external/wpt/css/css-multicol/multicol-width-001.xht [ Pass Failure ] # This test times out on debug builds, see https://crbug.com/755810 crbug.com/626703 [ Debug ] external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index fe725b46..d966c7c 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -43709,6 +43709,18 @@ {} ] ], + "css/css-multicol/multicol-width-ch-001.xht": [ + [ + "/css/css-multicol/multicol-width-ch-001.xht", + [ + [ + "/css/css-multicol/multicol-width-ch-ref.xht", + "==" + ] + ], + {} + ] + ], "css/css-multicol/multicol-width-count-001.xht": [ [ "/css/css-multicol/multicol-width-count-001.xht", @@ -43733,18 +43745,6 @@ {} ] ], - "css/css-multicol/multicol-width-ems-001.xht": [ - [ - "/css/css-multicol/multicol-width-ems-001.xht", - [ - [ - "/css/css-multicol/multicol-width-ems-ref.xht", - "==" - ] - ], - {} - ] - ], "css/css-multicol/multicol-width-invalid-001.xht": [ [ "/css/css-multicol/multicol-width-invalid-001.xht", @@ -109976,7 +109976,7 @@ {} ] ], - "css/css-multicol/multicol-width-ems-ref.xht": [ + "css/css-multicol/multicol-width-ch-ref.xht": [ [ {} ] @@ -136166,6 +136166,26 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id-error.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id-error.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/default-styles.vtt": [ [ {} @@ -136186,11 +136206,36 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/no-timings.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/no-webvtt.vtt": [ [ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour-error.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour-errors.vtt": [ + [ + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour.vtt": [ + [ + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/track.de.vtt": [ [ {} @@ -181663,6 +181708,18 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-identifiers.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-identifiers.html", + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-no-id.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-no-id.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-header-comment.html": [ [ "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-header-comment.html", @@ -181681,6 +181738,24 @@ {} ] ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-no-timings.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-no-timings.html", + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-hour.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-hour.html", + {} + ] + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-no-hours.html": [ + [ + "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-no-hours.html", + {} + ] + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html": [ [ "/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html", @@ -184003,6 +184078,12 @@ {} ] ], + "html/semantics/forms/the-select-element/select-add.html": [ + [ + "/html/semantics/forms/the-select-element/select-add.html", + {} + ] + ], "html/semantics/forms/the-select-element/select-ask-for-reset.html": [ [ "/html/semantics/forms/the-select-element/select-ask-for-reset.html", @@ -267308,6 +267389,14 @@ "39784428d2c56586d65f81a413aba4002d6ee752", "reftest" ], + "css/css-multicol/multicol-width-ch-001.xht": [ + "28b3c4f81e92185bbc9f26c9e594bdfb8cc994df", + "reftest" + ], + "css/css-multicol/multicol-width-ch-ref.xht": [ + "0a6035ffd02299dfd16336d6c8919c54b2293e21", + "support" + ], "css/css-multicol/multicol-width-count-001.xht": [ "4d09efe797f9b164e19fda16d6491fa99a855141", "reftest" @@ -267316,14 +267405,6 @@ "3fd4fd27cd2432bf388f08fb009cd5cd7cded59f", "reftest" ], - "css/css-multicol/multicol-width-ems-001.xht": [ - "1de2ecbb10805a48b831091cbee976b653899316", - "reftest" - ], - "css/css-multicol/multicol-width-ems-ref.xht": [ - "16f14c6750b7afa4deb8b2c0e70a602723753794", - "support" - ], "css/css-multicol/multicol-width-invalid-001-ref.xht": [ "da0d8783395284175b7f7b2ece6f8050aae10829", "support" @@ -306289,7 +306370,7 @@ "support" ], "html/dom/interfaces-expected.txt": [ - "7d8e224ad8944e40d251576b26468881b1852a55", + "5ca1ec15b0807e18d43c436c016c8d7bbe8728cb", "support" ], "html/dom/interfaces.html": [ @@ -312864,6 +312945,22 @@ "68ae570e941a5b8993c163a84aca0f758d65ab01", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id-error.vtt": [ + "e1e8e96b61a5ef48aec96a6c605929f39300e9d9", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-id.vtt": [ + "f67139c3fea2a888cd10500ee4ac1d3882d5df01", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id-error.vtt": [ + "4353f327dbfcfec5bcf99aaad28fde328b0c34a8", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/cue-no-id.vtt": [ + "6954c71972bfbdab36c94c44190cc2259971adb0", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/default-styles.vtt": [ "db041f1a659ab39530144bb68e0ab76d14ca9b90", "support" @@ -312880,10 +312977,30 @@ "9cc9424c093198fedb44a2361f704ce299288f71", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/no-timings.vtt": [ + "63bb8c56d7e75cc84b4e6b06b476fb4d9b395316", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/no-webvtt.vtt": [ "9d5d51eddc30891a0b25a628fffad6bc19d720de", "support" ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour-error.vtt": [ + "e2cf1290a06473ac1592e8da4d8261d392f14606", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-hour.vtt": [ + "a846d7e878ab08d111e4d68dd67b02d210db0273", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour-errors.vtt": [ + "4c80839a264bc93e3787211790e6062f35ad1f22", + "support" + ], + "html/semantics/embedded-content/media-elements/track/track-element/resources/timings-no-hour.vtt": [ + "09948fb59cd9e1702ba869f0b444ca36d1ec0bf2", + "support" + ], "html/semantics/embedded-content/media-elements/track/track-element/resources/track.de.vtt": [ "f83f36449d6a7e9db28bba9e39dc7a4bf7458927", "support" @@ -312952,6 +313069,14 @@ "26343f09d663d1558881507f89eecc606304b41f", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-identifiers.html": [ + "d21e8cd62cc5a7bf9275b2f46282cd3f73714c21", + "testharness" + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-no-id.html": [ + "f12b9b7384f445b817f1d049d7bff05ec0f2d3d9", + "testharness" + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-header-comment.html": [ "3e83c514cb2d18b2238f03e3d85a21f69a60d5c0", "testharness" @@ -312964,6 +313089,18 @@ "24d79495469c698e1e0296b503e44a3ee6b5db34", "testharness" ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-no-timings.html": [ + "baa44683fe0d00e691f536309a7772347301d57a", + "testharness" + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-hour.html": [ + "b52de7d267cce4c480353c188173c6bbc5e3e70e", + "testharness" + ], + "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-no-hours.html": [ + "ebae3e9d5dc11b91b53439ee4871df86c3a80822", + "testharness" + ], "html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-utf8.html": [ "65241920becf512c35f78b335de90c00af03195d", "testharness" @@ -315488,6 +315625,10 @@ "b5a01e973e4d4c97c6fa06bd9fd1e535e8c622e8", "testharness" ], + "html/semantics/forms/the-select-element/select-add.html": [ + "1ce71758263439d50dbabb5f1e78fafa6c7ba35b", + "testharness" + ], "html/semantics/forms/the-select-element/select-ask-for-reset.html": [ "e9689464e9ffa86ac5cd9364a4e8fb9ed6af065e", "testharness"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-select-element/select-add.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-select-element/select-add.html new file mode 100644 index 0000000..84a5442 --- /dev/null +++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/forms/the-select-element/select-add.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTMLSelectElement Test: add()</title> +<link rel="author" title="Intel" href="http://www.intel.com/"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/form-elements.html#dom-select-add-dev"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<form style="display:none"> + <option id="testoption"> + <select id="testselect1"> + </select> + <select id="testselect2"> + <option>TEST</option> + </select> + </option> +</form> + +<script> + +test(() => { + let testselect1 = document.getElementById("testselect1"); + let opt1 = new Option("Marry","1"); + testselect1.add(opt1); + assert_equals(testselect1.options[0].value, "1"); +}, "test that HTMLSelectElement.add method can add option element"); + +test(() => { + let testselect2 = document.getElementById("testselect2"); + let opt2 = document.getElementById("testoption"); + assert_throws("HierarchyRequestError", () => { + testselect2.add(opt2); + }); +}, "test that HierarchyRequestError exception must be thrown when element is an ancestor of the element into which it is to be inserted"); + +</script>