diff --git a/DEPS b/DEPS index 0d68c71a..f484eaa 100644 --- a/DEPS +++ b/DEPS
@@ -45,7 +45,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '6bba6de94461cdb97a451bc7f88eec3b1ab71079', + 'skia_revision': 'f6f7cf60985d8e109cc136f25e2a3c3383ca05ea', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -97,11 +97,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '6f2b6f8f72ffb5017ab00fca83185b21f1a9f56d', + 'freetype_revision': '02e80da6090c21d6e59ac955b7f56e1ad4a9850b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '639e972bf15c206a77decda169e022c41c5aae36', + 'catapult_revision': '0b563bed301ef780e6f0cac7bab670aaffb65fdf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other.
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java index 897d5897..f3b8394 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -1816,9 +1816,12 @@ helper.ensureSettingHasInitialValue(); } + /* + * @SmallTest + * @Feature({"AndroidWebView", "Preferences"}) + */ @Test - @SmallTest - @Feature({"AndroidWebView", "Preferences"}) + @DisabledTest(message = "crbug.com/767180") public void testDatabaseEnabled() throws Throwable { TestAwContentsClient client = new TestAwContentsClient(); final AwTestContainerView testContainerView =
diff --git a/ash/public/cpp/shelf_prefs.cc b/ash/public/cpp/shelf_prefs.cc index 8e307e9..2b5d95e 100644 --- a/ash/public/cpp/shelf_prefs.cc +++ b/ash/public/cpp/shelf_prefs.cc
@@ -160,7 +160,7 @@ case SHELF_AUTO_HIDE_ALWAYS_HIDDEN: // This should not be a valid preference option for now. We only want to // completely hide it when we run in app mode - or while we temporarily - // hide the shelf as part of an animation (e.g. the multi user change). + // hide the shelf (e.g. SessionAbortedDialog). return nullptr; } NOTREACHED();
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index 3191076..9acc466 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -392,11 +392,6 @@ return false; } -void ShelfLayoutManager::SetAnimationDurationOverride( - int duration_override_in_ms) { - duration_override_in_ms_ = duration_override_in_ms; -} - //////////////////////////////////////////////////////////////////////////////// // ShelfLayoutManager, wm::WmSnapToPixelLayoutManager implementation: @@ -613,15 +608,12 @@ ui::ScopedLayerAnimationSettings status_animation_setter( GetLayer(status_widget)->GetAnimator()); if (animate) { - int duration = duration_override_in_ms_ ? duration_override_in_ms_ - : kAnimationDurationMS; - shelf_animation_setter.SetTransitionDuration( - base::TimeDelta::FromMilliseconds(duration)); + auto duration = base::TimeDelta::FromMilliseconds(kAnimationDurationMS); + shelf_animation_setter.SetTransitionDuration(duration); shelf_animation_setter.SetTweenType(gfx::Tween::EASE_OUT); shelf_animation_setter.SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); - status_animation_setter.SetTransitionDuration( - base::TimeDelta::FromMilliseconds(duration)); + status_animation_setter.SetTransitionDuration(duration); status_animation_setter.SetTweenType(gfx::Tween::EASE_OUT); status_animation_setter.SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h index fc7d810..413df536 100644 --- a/ash/shelf/shelf_layout_manager.h +++ b/ash/shelf/shelf_layout_manager.h
@@ -140,10 +140,6 @@ // be processed any further, false otherwise. bool ProcessGestureEvent(const ui::GestureEvent& event_in_screen); - // Set an animation duration override for the show / hide animation of the - // shelf. Specifying 0 leads to use the default. - void SetAnimationDurationOverride(int duration_override_in_ms); - // Overridden from wm::WmSnapToPixelLayoutManager: void OnWindowResized() override; void SetChildBounds(aura::Window* child, @@ -392,9 +388,6 @@ // needs to be removed from the available work area. int chromevox_panel_height_ = 0; - // The show hide animation duration override or 0 for default. - int duration_override_in_ms_ = 0; - // Whether background blur is enabled. const bool is_background_blur_enabled_;
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc index e5d98269..cbb58cf 100644 --- a/ash/shelf/shelf_widget.cc +++ b/ash/shelf/shelf_widget.cc
@@ -45,7 +45,6 @@ FocusCycler* focus_cycler() { return focus_cycler_; } ui::Layer* opaque_background() { return &opaque_background_; } - ui::Layer* opaque_foreground() { return &opaque_foreground_; } void SetParentLayer(ui::Layer* layer); @@ -67,10 +66,6 @@ // A background layer that may be visible depending on a // ShelfBackgroundAnimator. ui::Layer opaque_background_; - // A black foreground layer which is shown while transitioning between users. - // Note: Since the back- and foreground layers have different functions they - // can be used simultaneously - so no repurposing possible. - ui::Layer opaque_foreground_; DISALLOW_COPY_AND_ASSIGN(DelegateView); }; @@ -78,22 +73,17 @@ ShelfWidget::DelegateView::DelegateView(ShelfWidget* shelf_widget) : shelf_widget_(shelf_widget), focus_cycler_(nullptr), - opaque_background_(ui::LAYER_SOLID_COLOR), - opaque_foreground_(ui::LAYER_SOLID_COLOR) { + opaque_background_(ui::LAYER_SOLID_COLOR) { DCHECK(shelf_widget_); SetLayoutManager(new views::FillLayout()); set_allow_deactivate_on_esc(true); opaque_background_.SetBounds(GetLocalBounds()); - opaque_foreground_.SetBounds(GetLocalBounds()); - opaque_foreground_.SetOpacity(0.0f); - opaque_foreground_.SetColor(SK_ColorBLACK); } ShelfWidget::DelegateView::~DelegateView() {} void ShelfWidget::DelegateView::SetParentLayer(ui::Layer* layer) { layer->Add(&opaque_background_); - layer->Add(&opaque_foreground_); ReorderLayers(); } @@ -105,12 +95,10 @@ void ShelfWidget::DelegateView::ReorderChildLayers(ui::Layer* parent_layer) { views::View::ReorderChildLayers(parent_layer); parent_layer->StackAtBottom(&opaque_background_); - parent_layer->StackAtTop(&opaque_foreground_); } void ShelfWidget::DelegateView::OnBoundsChanged(const gfx::Rect& old_bounds) { opaque_background_.SetBounds(GetLocalBounds()); - opaque_foreground_.SetBounds(GetLocalBounds()); } void ShelfWidget::DelegateView::UpdateShelfBackground(SkColor color) { @@ -203,27 +191,6 @@ return background_animator_.GetBackgroundAlphaValue(background_type); } -void ShelfWidget::HideShelfBehindBlackBar(bool hide, int animation_time_ms) { - if (IsShelfHiddenBehindBlackBar() == hide) - return; - - ui::Layer* opaque_foreground = delegate_view_->opaque_foreground(); - float target_opacity = hide ? 1.0f : 0.0f; - std::unique_ptr<ui::ScopedLayerAnimationSettings> opaque_foreground_animation; - opaque_foreground_animation.reset( - new ui::ScopedLayerAnimationSettings(opaque_foreground->GetAnimator())); - opaque_foreground_animation->SetTransitionDuration( - base::TimeDelta::FromMilliseconds(animation_time_ms)); - opaque_foreground_animation->SetPreemptionStrategy( - ui::LayerAnimator::REPLACE_QUEUED_ANIMATIONS); - - opaque_foreground->SetOpacity(target_opacity); -} - -bool ShelfWidget::IsShelfHiddenBehindBlackBar() const { - return delegate_view_->opaque_foreground()->GetTargetOpacity() != 0.0f; -} - void ShelfWidget::OnShelfAlignmentChanged() { // Check added for http://crbug.com/738011. CHECK(status_area_widget_);
diff --git a/ash/shelf/shelf_widget.h b/ash/shelf/shelf_widget.h index 8068653e..6dad5720 100644 --- a/ash/shelf/shelf_widget.h +++ b/ash/shelf/shelf_widget.h
@@ -55,11 +55,6 @@ // Gets the alpha value of |background_type|. int GetBackgroundAlphaValue(ShelfBackgroundType background_type) const; - // Hide the shelf behind a black bar during e.g. a user transition when |hide| - // is true. The |animation_time_ms| will be used as animation duration. - void HideShelfBehindBlackBar(bool hide, int animation_time_ms); - bool IsShelfHiddenBehindBlackBar() const; - ShelfLayoutManager* shelf_layout_manager() { return shelf_layout_manager_; } StatusAreaWidget* status_area_widget() const { return status_area_widget_; }
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py index f4acd857..26fedbf 100644 --- a/build/android/pylib/gtest/gtest_test_instance.py +++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -292,6 +292,7 @@ self._total_external_shards = args.test_launcher_total_shards self._suite = args.suite_name[0] self._symbolizer = stack_symbolizer.Symbolizer(None, False) + self._gs_test_artifacts_bucket = args.gs_test_artifacts_bucket # GYP: if args.executable_dist_dir: @@ -419,6 +420,10 @@ return self._flags @property + def gs_test_artifacts_bucket(self): + return self._gs_test_artifacts_bucket + + @property def gtest_filter(self): return self._gtest_filter
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index b833fc9..22794a43 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -7,6 +7,7 @@ import logging import os import posixpath +import shutil import time from devil.android import crash_handler @@ -21,9 +22,11 @@ from pylib.local import local_test_server_spawner from pylib.local.device import local_device_environment from pylib.local.device import local_device_test_run +from pylib.utils import google_storage_helper from pylib.utils import logdog_helper from py_trace_event import trace_event from py_utils import contextlib_ext +from py_utils import tempfile_ext import tombstones _MAX_INLINE_FLAGS_LENGTH = 50 # Arbitrarily chosen. @@ -393,6 +396,25 @@ self._test_instance.total_external_shards) return tests + def _UploadTestArtifacts(self, device, test_artifacts_dir): + # TODO(jbudorick): Reconcile this with the output manager once + # https://codereview.chromium.org/2933993002/ lands. + if test_artifacts_dir: + with tempfile_ext.NamedTemporaryDirectory() as test_artifacts_host_dir: + device.PullFile(test_artifacts_dir.name, test_artifacts_host_dir) + test_artifacts_zip = shutil.make_archive('test_artifacts', 'zip', + test_artifacts_host_dir) + link = google_storage_helper.upload( + google_storage_helper.unique_name( + 'test_artifacts', device=device), + test_artifacts_zip, + bucket='%s/test_artifacts' % ( + self._test_instance.gs_test_artifacts_bucket)) + logging.info('Uploading test artifacts to %s.', link) + os.remove(test_artifacts_zip) + return link + return None + #override def _RunTest(self, device, test): # Run the test. @@ -404,38 +426,47 @@ adb=device.adb, dir=self._delegate.ResultsDirectory(device), suffix='.xml') as device_tmp_results_file: + with contextlib_ext.Optional( + device_temp_file.NamedDeviceTemporaryDirectory( + adb=device.adb, dir='/sdcard/'), + self._test_instance.gs_test_artifacts_bucket) as test_artifacts_dir: - flags = list(self._test_instance.flags) - if self._test_instance.enable_xml_result_parsing: - flags.append('--gtest_output=xml:%s' % device_tmp_results_file.name) + flags = list(self._test_instance.flags) + if self._test_instance.enable_xml_result_parsing: + flags.append('--gtest_output=xml:%s' % device_tmp_results_file.name) - logging.info('flags:') - for f in flags: - logging.info(' %s', f) + if self._test_instance.gs_test_artifacts_bucket: + flags.append('--test_artifacts_dir=%s' % test_artifacts_dir.name) - with local_device_environment.OptionalPerTestLogcat( - device, hash(tuple(test)), - self._test_instance.should_save_logcat) as logmon: - with contextlib_ext.Optional( - trace_event.trace(str(test)), - self._env.trace_output): - output = self._delegate.Run( - test, device, flags=' '.join(flags), - timeout=timeout, retries=0) + logging.info('flags:') + for f in flags: + logging.info(' %s', f) - if self._test_instance.enable_xml_result_parsing: - try: - gtest_xml = device.ReadFile( - device_tmp_results_file.name, - as_root=True) - except device_errors.CommandFailedError as e: - logging.warning( - 'Failed to pull gtest results XML file %s: %s', - device_tmp_results_file.name, - str(e)) - gtest_xml = None + with local_device_environment.OptionalPerTestLogcat( + device, hash(tuple(test)), + self._test_instance.should_save_logcat) as logmon: + with contextlib_ext.Optional( + trace_event.trace(str(test)), + self._env.trace_output): + output = self._delegate.Run( + test, device, flags=' '.join(flags), + timeout=timeout, retries=0) - logcat_url = logmon.GetLogcatURL() + if self._test_instance.enable_xml_result_parsing: + try: + gtest_xml = device.ReadFile( + device_tmp_results_file.name, + as_root=True) + except device_errors.CommandFailedError as e: + logging.warning( + 'Failed to pull gtest results XML file %s: %s', + device_tmp_results_file.name, + str(e)) + gtest_xml = None + + logcat_url = logmon.GetLogcatURL() + test_artifacts_url = self._UploadTestArtifacts(device, + test_artifacts_dir) for s in self._servers[str(device)]: s.Reset() @@ -461,6 +492,9 @@ if self._test_instance.should_save_logcat: r.SetLink('logcat', logcat_url) + if self._test_instance.gs_test_artifacts_bucket: + r.SetLink('test_artifacts', test_artifacts_url) + if r.GetType() == base_test_result.ResultType.CRASH: self._crashes.add(r.GetName()) if self._test_instance.store_tombstones:
diff --git a/build/android/test_runner.py b/build/android/test_runner.py index 42b9bdc..ae2275c 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py
@@ -346,6 +346,11 @@ help='Path to file that contains googletest-style filter strings. ' 'See also //testing/buildbot/filters/README.md.') + parser.add_argument( + '--gs-test-artifacts-bucket', + help=('If present, test artifacts will be uploaded to this Google ' + 'Storage bucket.')) + def AddInstrumentationTestOptions(parser): """Adds Instrumentation test options to |parser|."""
diff --git a/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml b/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml index 5b97abe..ba655ff 100644 --- a/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml +++ b/chrome/android/java/res/drawable/ic_snippet_thumbnail_placeholder.xml
@@ -11,7 +11,7 @@ android:viewportWidth="72" android:viewportHeight="72"> - <path android:fillColor="@color/default_primary_color" + <path android:fillColor="@color/modern_light_grey" android:pathData="M0,0 L72,0 L72,71.9997 L0,71.9997 Z" /> <path android:fillColor="@color/light_normal_color" android:pathData="M45,42.9997 L45,28.9997 C45,27.8997,44.1,26.9997,43,26.9997 L29,26.9997
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 9358d56..a3c0ec83 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -170,6 +170,8 @@ "ContentSuggestionsScrollToLoad"; public static final String CONTENT_SUGGESTIONS_SETTINGS = "ContentSuggestionsSettings"; public static final String CONTENT_SUGGESTIONS_SHOW_SUMMARY = "ContentSuggestionsShowSummary"; + public static final String CONTENT_SUGGESTIONS_THUMBNAIL_DOMINANT_COLOR = + "ContentSuggestionsThumbnailDominantColor"; public static final String CONTENT_SUGGESTIONS_VIDEO_OVERLAY = "ContentSuggestionsVideoOverlay"; public static final String CONTEXTUAL_SEARCH_SINGLE_ACTIONS = "ContextualSearchSingleActions"; public static final String CONTEXTUAL_SEARCH_URL_ACTIONS = "ContextualSearchUrlActions";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java index e215c826..d2883a1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/SuggestionsBinder.java
@@ -8,6 +8,7 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.media.ThumbnailUtils; @@ -189,7 +190,18 @@ // Temporarily set placeholder and then fetch the thumbnail from a provider. mThumbnailView.setBackground(null); - mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder); + if (FeatureUtilities.isChromeHomeEnabled() + && ChromeFeatureList.isEnabled( + ChromeFeatureList.CONTENT_SUGGESTIONS_THUMBNAIL_DOMINANT_COLOR)) { + ColorDrawable colorDrawable = + new ColorDrawable(mSuggestion.getThumbnailDominantColor() != null + ? mSuggestion.getThumbnailDominantColor() + : ApiCompatibilityUtils.getColor(mThumbnailView.getResources(), + R.color.modern_light_grey)); + mThumbnailView.setImageDrawable(colorDrawable); + } else { + mThumbnailView.setImageResource(R.drawable.ic_snippet_thumbnail_placeholder); + } mThumbnailView.setTint(null); // Fetch thumbnail for the current article.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java index c859f182..bc14e76 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -526,6 +526,7 @@ @Override public void shutdown() { mActivity.getFullscreenManager().removeListener(this); + mActivity.getFullscreenManager().setPersistentFullscreenMode(false); reparentAllTabs(mActivity.getWindowAndroid()); if (mNativeVrShell != 0) { nativeDestroy(mNativeVrShell);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java index 1b40b75f..4ad6494ae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/accessibility/AccessibilityTabModelWrapper.java
@@ -186,13 +186,15 @@ if (FeatureUtilities.isChromeHomeEnabled()) { mModernLayout.setVisibility(incognitoEnabled ? View.VISIBLE : View.GONE); if (incognitoSelected) { - setBackgroundResource(R.color.incognito_primary_color); + setBackgroundColor(ApiCompatibilityUtils.getColor( + getResources(), R.color.incognito_primary_color)); mModernStackButtonWrapper.setSelectedTabIndicatorColor( mTabIconSelectedLightColor.getDefaultColor()); mModernStandardButtonIcon.setTint(mTabIconLightColor); mModernIncognitoButtonIcon.setTint(mTabIconSelectedLightColor); } else { - setBackgroundResource(R.color.modern_primary_color); + setBackgroundColor(ApiCompatibilityUtils.getColor( + getResources(), R.color.modern_primary_color)); mModernStackButtonWrapper.setSelectedTabIndicatorColor( mTabIconSelectedDarkColor.getDefaultColor()); mModernStandardButtonIcon.setTint(mTabIconSelectedDarkColor);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java index ef51cd85..c6e8047d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -30,6 +30,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; import org.chromium.base.ObserverList; +import org.chromium.base.SysUtils; import org.chromium.base.VisibleForTesting; import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.chrome.R; @@ -1007,18 +1008,12 @@ contentView, oldContent, mBottomSheetContentContainer, true)); } - // Return early if there are no animators to run. - if (animators.isEmpty()) { - onContentSwapAnimationEnd(content); - return; - } - // Temporarily make the background of the toolbar holder a solid color so the transition // doesn't appear to show a hole in the toolbar. int colorId = content == null || !content.isIncognitoThemedContent() ? R.color.modern_primary_color : R.color.incognito_primary_color; - if (!mIsSheetOpen || content.isIncognitoThemedContent() + if (!mIsSheetOpen || (content != null && content.isIncognitoThemedContent()) || (mSheetContent != null && mSheetContent.isIncognitoThemedContent())) { // If the sheet is closed, the bottom sheet content container is invisible, so // background color is needed on the toolbar holder to prevent a blank rectangle from @@ -1029,12 +1024,25 @@ mBottomSheetContentContainer.setBackgroundColor( ApiCompatibilityUtils.getColor(getResources(), colorId)); + // Set color on the content view to compensate for a JellyBean bug (crbug.com/766237). + if (content != null) { + content.getContentView().setBackgroundColor( + ApiCompatibilityUtils.getColor(getResources(), colorId)); + } + + // Return early if there are no animators to run. + if (animators.isEmpty()) { + onContentSwapAnimationEnd(content); + return; + } + mContentSwapAnimatorSet.playTogether(animators); mContentSwapAnimatorSet.start(); // If the existing content is null or the tab switcher assets are showing, end the animation // immediately. - if (mSheetContent == null || mDefaultToolbarView.isInTabSwitcherMode()) { + if (mSheetContent == null || mDefaultToolbarView.isInTabSwitcherMode() + || SysUtils.isLowEndDevice()) { mContentSwapAnimatorSet.end(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java index d75d20a..23322179 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetContentController.java
@@ -412,8 +412,9 @@ } private void updateVisuals(boolean isIncognitoTabModelSelected) { - setBackgroundResource(isIncognitoTabModelSelected ? R.color.incognito_primary_color - : R.color.modern_primary_color); + setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(), + isIncognitoTabModelSelected ? R.color.incognito_primary_color + : R.color.modern_primary_color)); ColorStateList tint = ApiCompatibilityUtils.getColorStateList(getResources(), isIncognitoTabModelSelected ? R.color.bottom_nav_tint_incognito
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java index eb9a5c31..5a5c12d1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
@@ -9,6 +9,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.support.annotation.DrawableRes; import android.support.annotation.Nullable; @@ -213,7 +214,7 @@ 20f, // Score mTimestamp, // Fetch timestamp false, // Is video suggestion - null); // Thumbnail dominant color + Color.GREEN); // Thumbnail dominant color renderSuggestion(longSnippet, fullCategoryInfo, "long_snippet"); SuggestionsCategoryInfo minimalCategory = new SuggestionsCategoryInfo(MINIMAL_CATEGORY,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java index fd054e1..e019af6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr_shell/VrShellTransitionTest.java
@@ -31,6 +31,7 @@ import org.chromium.chrome.browser.vr_shell.util.VrTransitionUtils; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.content.browser.test.util.DOMUtils; import java.util.concurrent.TimeoutException; @@ -133,6 +134,26 @@ } /** + * Tests that we exit fullscreen mode after exiting VR from cinema mode. + */ + @Test + @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM) + @MediumTest + public void testExitFullscreenAfterExitingVrFromCinemaMode() + throws InterruptedException, TimeoutException { + mVrTestFramework.loadUrlAndAwaitInitialization( + VrTestFramework.getHtmlTestFile("test_navigation_2d_page"), PAGE_LOAD_TIMEOUT_S); + VrTransitionUtils.forceEnterVr(); + VrTransitionUtils.waitForVrEntry(POLL_TIMEOUT_LONG_MS); + DOMUtils.clickNode(mVrTestFramework.getFirstTabCvc(), "fullscreen"); + mVrTestFramework.waitOnJavaScriptStep(mVrTestFramework.getFirstTabWebContents()); + + Assert.assertTrue(DOMUtils.isFullscreen(mVrTestFramework.getFirstTabWebContents())); + VrTransitionUtils.forceExitVr(); + Assert.assertFalse(DOMUtils.isFullscreen(mVrTestFramework.getFirstTabWebContents())); + } + + /** * Tests that the reported display dimensions are correct when exiting * from WebVR presentation to the VR browser. */
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 05b748a..7729581 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2530,6 +2530,13 @@ flag_descriptions::kEnableContentSuggestionsLargeThumbnailDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kContentSuggestionsLargeThumbnail)}, + {"enable-content-suggestions-thumbnail-dominant-color", + flag_descriptions::kEnableContentSuggestionsThumbnailDominantColorName, + flag_descriptions:: + kEnableContentSuggestionsThumbnailDominantColorDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kContentSuggestionsThumbnailDominantColor)}, {"enable-content-suggestions-video-overlay", flag_descriptions::kEnableContentSuggestionsVideoOverlayName, flag_descriptions::kEnableContentSuggestionsVideoOverlayDescription,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc index 4ff5dc5..f4680f4 100644 --- a/chrome/browser/android/chrome_feature_list.cc +++ b/chrome/browser/android/chrome_feature_list.cc
@@ -64,9 +64,10 @@ &kChromeHomeSwipeLogic, &kContentSuggestionsLargeThumbnail, &kContentSuggestionsScrollToLoad, - &kContentSuggestionsVideoOverlay, &kContentSuggestionsSettings, &kContentSuggestionsShowSummary, + &kContentSuggestionsThumbnailDominantColor, + &kContentSuggestionsVideoOverlay, &kContextualSearchSingleActions, &kContextualSearchUrlActions, &kContextualSuggestionsCarousel, @@ -180,15 +181,19 @@ const base::Feature kContentSuggestionsScrollToLoad{ "ContentSuggestionsScrollToLoad", base::FEATURE_ENABLED_BY_DEFAULT}; -const base::Feature kContentSuggestionsVideoOverlay{ - "ContentSuggestionsVideoOverlay", base::FEATURE_DISABLED_BY_DEFAULT}; - const base::Feature kContentSuggestionsSettings{ "ContentSuggestionsSettings", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kContentSuggestionsShowSummary{ "ContentSuggestionsShowSummary", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kContentSuggestionsThumbnailDominantColor{ + "ContentSuggestionsThumbnailDominantColor", + base::FEATURE_ENABLED_BY_DEFAULT}; + +const base::Feature kContentSuggestionsVideoOverlay{ + "ContentSuggestionsVideoOverlay", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kContextualSearchSingleActions{ "ContextualSearchSingleActions", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h index 815879da..8148983 100644 --- a/chrome/browser/android/chrome_feature_list.h +++ b/chrome/browser/android/chrome_feature_list.h
@@ -28,9 +28,10 @@ extern const base::Feature kChromeHomeSwipeLogic; extern const base::Feature kContentSuggestionsLargeThumbnail; extern const base::Feature kContentSuggestionsScrollToLoad; -extern const base::Feature kContentSuggestionsVideoOverlay; extern const base::Feature kContentSuggestionsSettings; extern const base::Feature kContentSuggestionsShowSummary; +extern const base::Feature kContentSuggestionsThumbnailDominantColor; +extern const base::Feature kContentSuggestionsVideoOverlay; extern const base::Feature kContextualSearchSingleActions; extern const base::Feature kContextualSearchUrlActions; extern const base::Feature kContextualSuggestionsCarousel;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc index d0df64f3..277b7a0 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -150,4 +150,34 @@ entries))); } +//////////////////////////////////////////////////////////////////////////////// +// PasswordsPrivateImportPasswordsFunction + +PasswordsPrivateImportPasswordsFunction:: + ~PasswordsPrivateImportPasswordsFunction() {} + +ExtensionFunction::ResponseAction +PasswordsPrivateImportPasswordsFunction::Run() { + PasswordsPrivateDelegate* delegate = + PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), + true /* create */); + delegate->ImportPasswords(GetAssociatedWebContents()); + return RespondNow(NoArguments()); +} + +//////////////////////////////////////////////////////////////////////////////// +// PasswordsPrivateExportPasswordsFunction + +PasswordsPrivateExportPasswordsFunction:: + ~PasswordsPrivateExportPasswordsFunction() {} + +ExtensionFunction::ResponseAction +PasswordsPrivateExportPasswordsFunction::Run() { + PasswordsPrivateDelegate* delegate = + PasswordsPrivateDelegateFactory::GetForBrowserContext(browser_context(), + true /* create */); + delegate->ExportPasswords(GetAssociatedWebContents()); + return RespondNow(NoArguments()); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h index dab11b9..b1bc8bca 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -105,6 +105,40 @@ DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateGetPasswordExceptionListFunction); }; +class PasswordsPrivateImportPasswordsFunction + : public UIThreadExtensionFunction { + public: + PasswordsPrivateImportPasswordsFunction() {} + DECLARE_EXTENSION_FUNCTION("passwordsPrivate.importPasswords", + PASSWORDSPRIVATE_IMPORTPASSWORDS); + + protected: + ~PasswordsPrivateImportPasswordsFunction() override; + + // ExtensionFunction overrides. + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateImportPasswordsFunction); +}; + +class PasswordsPrivateExportPasswordsFunction + : public UIThreadExtensionFunction { + public: + PasswordsPrivateExportPasswordsFunction() {} + DECLARE_EXTENSION_FUNCTION("passwordsPrivate.exportPasswords", + PASSWORDSPRIVATE_EXPORTPASSWORDS); + + protected: + ~PasswordsPrivateExportPasswordsFunction() override; + + // ExtensionFunction overrides. + ResponseAction Run() override; + + private: + DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateExportPasswordsFunction); +}; + } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_API_PASSWORDS_PRIVATE_PASSWORDS_PRIVATE_API_H_
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc index d561c97..f533cc4 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -126,6 +126,22 @@ void SetProfile(Profile* profile) { profile_ = profile; } + void ImportPasswords(content::WebContents* web_contents) override { + // The testing of password importing itself should be handled via + // |PasswordManagerPorter|. + importPasswordsTriggered = true; + } + + void ExportPasswords(content::WebContents* web_contents) override { + // The testing of password exporting itself should be handled via + // |PasswordManagerPorter|. + exportPasswordsTriggered = true; + } + + // Flags for detecting whether import/export operations have been invoked. + bool importPasswordsTriggered = false; + bool exportPasswordsTriggered = false; + private: // The current list of entries/exceptions. Cached here so that when new // observers are added, this delegate can send the current lists without @@ -173,6 +189,14 @@ kFlagLoadAsComponent); } + bool importPasswordsWasTriggered() { + return s_test_delegate_->importPasswordsTriggered; + } + + bool exportPasswordsWasTriggered() { + return s_test_delegate_->exportPasswordsTriggered; + } + private: static TestDelegate* s_test_delegate_; @@ -204,4 +228,16 @@ EXPECT_TRUE(RunPasswordsSubtest("getPasswordExceptionList")) << message_; } +IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, ImportPasswords) { + EXPECT_FALSE(importPasswordsWasTriggered()); + EXPECT_TRUE(RunPasswordsSubtest("importPasswords")) << message_; + EXPECT_TRUE(importPasswordsWasTriggered()); +} + +IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, ExportPasswords) { + EXPECT_FALSE(exportPasswordsWasTriggered()); + EXPECT_TRUE(RunPasswordsSubtest("exportPasswords")) << message_; + EXPECT_TRUE(exportPasswordsWasTriggered()); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h index 403d2db..0b891e039 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -67,6 +67,14 @@ // an OS-level authentication dialog if necessary. virtual void RequestShowPassword(size_t index, content::WebContents* web_contents) = 0; + + // Trigger the password import procedure, allowing the user to select a file + // containing passwords to import. + virtual void ImportPasswords(content::WebContents* web_contents) = 0; + + // Trigger the password export procedure, allowing the user to save a file + // containing their passwords. + virtual void ExportPasswords(content::WebContents* web_contents) = 0; }; } // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index 648a51dc..afd3e38 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -20,6 +20,7 @@ #include "chrome/grit/generated_resources.h" #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/password_ui_utils.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "components/prefs/pref_service.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" @@ -196,6 +197,16 @@ get_password_exception_list_callbacks_.clear(); } +void PasswordsPrivateDelegateImpl::ImportPasswords( + content::WebContents* web_contents) { + password_manager_presenter_->ImportPasswords(web_contents); +} + +void PasswordsPrivateDelegateImpl::ExportPasswords( + content::WebContents* web_contents) { + password_manager_presenter_->ExportPasswords(web_contents); +} + #if !defined(OS_ANDROID) gfx::NativeWindow PasswordsPrivateDelegateImpl::GetNativeWindow() const { DCHECK(web_contents_);
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h index 2d71178..3acf163 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -47,6 +47,8 @@ void RemovePasswordException(size_t index) override; void RequestShowPassword(size_t index, content::WebContents* web_contents) override; + void ImportPasswords(content::WebContents* web_contents) override; + void ExportPasswords(content::WebContents* web_contents) override; // PasswordUIView implementation. Profile* GetProfile() override;
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 8fcb692..63e6e03 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1628,15 +1628,9 @@ const char kEnableAndroidPayIntegrationV2Description[] = "Enable integration with Android Pay using the second version of the API"; +const char kEnableAndroidSpellcheckerName[] = "Enable spell checking"; const char kEnableAndroidSpellcheckerDescription[] = "Enables use of the Android spellchecker."; -const char kEnableAndroidSpellcheckerName[] = "Enable spell checking"; - -const char kEnableContentSuggestionsNewFaviconServerName[] = - "Get favicons for content suggestions from a new server."; -const char kEnableContentSuggestionsNewFaviconServerDescription[] = - "If enabled, the content suggestions (on the NTP) will get favicons from a " - "new favicon server."; const char kEnableContentSuggestionsLargeThumbnailName[] = "Large thumbnails layout for content suggestions cards."; @@ -1644,11 +1638,11 @@ "If enabled, the content suggestions cards will use large thumbnails and " "some related adjustments."; -const char kEnableContentSuggestionsVideoOverlayName[] = - "Video icon overlay on thumbnails for content suggestions cards."; -const char kEnableContentSuggestionsVideoOverlayDescription[] = - "If enabled, the content suggestions cards for suggestions with a video " - "will show a video play icon overlay on the thumbnail."; +const char kEnableContentSuggestionsNewFaviconServerName[] = + "Get favicons for content suggestions from a new server."; +const char kEnableContentSuggestionsNewFaviconServerDescription[] = + "If enabled, the content suggestions (on the NTP) will get favicons from a " + "new favicon server."; const char kEnableContentSuggestionsSettingsName[] = "Show content suggestions settings."; @@ -1661,6 +1655,18 @@ const char kEnableContentSuggestionsShowSummaryDescription[] = "If enabled, the content suggestions summaries will be shown."; +const char kEnableContentSuggestionsThumbnailDominantColorName[] = + "Use content suggestions thumbnail dominant color."; +const char kEnableContentSuggestionsThumbnailDominantColorDescription[] = + "Use content suggestions thumbnail dominant color as a placeholder before " + "the real thumbnail is fetched (requires Chrome Home)."; + +const char kEnableContentSuggestionsVideoOverlayName[] = + "Video icon overlay on thumbnails for content suggestions cards."; +const char kEnableContentSuggestionsVideoOverlayDescription[] = + "If enabled, the content suggestions cards for suggestions with a video " + "will show a video play icon overlay on the thumbnail."; + const char kEnableCopylessPasteName[] = "App Indexing (Copyless Paste)"; const char kEnableCopylessPasteDescription[] = "Provide suggestions for text input, based on your recent context. For "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 1732445..e9e3bc6 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1007,17 +1007,14 @@ extern const char kEnableAndroidPayIntegrationV2Name[]; extern const char kEnableAndroidPayIntegrationV2Description[]; -extern const char kEnableAndroidSpellcheckerDescription[]; extern const char kEnableAndroidSpellcheckerName[]; - -extern const char kEnableContentSuggestionsNewFaviconServerName[]; -extern const char kEnableContentSuggestionsNewFaviconServerDescription[]; +extern const char kEnableAndroidSpellcheckerDescription[]; extern const char kEnableContentSuggestionsLargeThumbnailName[]; extern const char kEnableContentSuggestionsLargeThumbnailDescription[]; -extern const char kEnableContentSuggestionsVideoOverlayName[]; -extern const char kEnableContentSuggestionsVideoOverlayDescription[]; +extern const char kEnableContentSuggestionsNewFaviconServerName[]; +extern const char kEnableContentSuggestionsNewFaviconServerDescription[]; extern const char kEnableContentSuggestionsSettingsName[]; extern const char kEnableContentSuggestionsSettingsDescription[]; @@ -1025,6 +1022,12 @@ extern const char kEnableContentSuggestionsShowSummaryName[]; extern const char kEnableContentSuggestionsShowSummaryDescription[]; +extern const char kEnableContentSuggestionsThumbnailDominantColorName[]; +extern const char kEnableContentSuggestionsThumbnailDominantColorDescription[]; + +extern const char kEnableContentSuggestionsVideoOverlayName[]; +extern const char kEnableContentSuggestionsVideoOverlayDescription[]; + extern const char kEnableCopylessPasteName[]; extern const char kEnableCopylessPasteDescription[];
diff --git a/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc b/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc index 643c1bf..7ae0618 100644 --- a/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_apprtc_browsertest.cc
@@ -291,7 +291,9 @@ } #if defined(OS_LINUX) -#define MAYBE_MANUAL_FirefoxApprtcInteropTest MANUAL_FirefoxApprtcInteropTest +// Disabled due to failure, see http://crbug.com/751211. +#define MAYBE_MANUAL_FirefoxApprtcInteropTest \ + DISABLED_MANUAL_FirefoxApprtcInteropTest #else // Not implemented yet on Windows and Mac. #define MAYBE_MANUAL_FirefoxApprtcInteropTest \ @@ -300,7 +302,6 @@ IN_PROC_BROWSER_TEST_F(WebRtcApprtcBrowserTest, MAYBE_MANUAL_FirefoxApprtcInteropTest) { - base::ThreadRestrictions::ScopedAllowIO allow_io; DetectErrorsInJavaScript(); ASSERT_TRUE(LaunchApprtcInstanceOnLocalhost("9999")); ASSERT_TRUE(LaunchColliderOnLocalHost("http://localhost:9999", "8089"));
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html index e9cdd80..c25161c0 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.html
@@ -58,7 +58,18 @@ <span>$i18nRaw{managePasswordsLabel}</span> </div> <div class="settings-box first"> - <h2>$i18n{savedPasswordsHeading}</h2> + <h2 class="start">$i18n{savedPasswordsHeading}</h2> + <template is="dom-if" if="[[showImportExportPasswords_]]"> + <paper-button class="secondary-button header-aligned-button" + on-tap="onImportTap_" id="import"> + $i18n{import} + </paper-button> + <paper-button class="secondary-button header-aligned-button" + on-tap="onExportTap_" id="export" + disabled$="[[!hasSome_(savedPasswords)]]"> + $i18n{export} + </paper-button> + </template> </div> <div class="list-frame"> <div id="savedPasswordsHeading" class="list-item column-header"
diff --git a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js index 063cd71..b50bc3e 100644 --- a/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js +++ b/chrome/browser/resources/settings/passwords_and_forms_page/passwords_section.js
@@ -70,6 +70,16 @@ * @param {function(!PasswordManager.PlaintextPasswordEvent):void} callback */ getPlaintextPassword(index, callback) {} + + /** + * Triggers the dialogue for importing passwords. + */ + importPasswords() {} + + /** + * Triggers the dialogue for exporting passwords. + */ + exportPasswords() {} } /** @typedef {chrome.passwordsPrivate.PasswordUiEntry} */ @@ -145,6 +155,16 @@ chrome.passwordsPrivate.onPlaintextPasswordRetrieved.addListener(listener); chrome.passwordsPrivate.requestPlaintextPassword(index); } + + /** @override */ + importPasswords() { + chrome.passwordsPrivate.importPasswords(); + } + + /** @override */ + exportPasswords() { + chrome.passwordsPrivate.exportPasswords(); + } } cr.addSingletonGetter(PasswordManagerImpl); @@ -195,6 +215,15 @@ activePassword: Object, /** @private */ + showImportExportPasswords_: { + type: Boolean, + value: function() { + return loadTimeData.valueExists('showImportExportPasswords') && + loadTimeData.getBoolean('showImportExportPasswords'); + } + }, + + /** @private */ showPasswordEditDialog_: Boolean, /** Filter on the saved passwords and exceptions. */ @@ -355,6 +384,22 @@ }, /** + * Fires an event that should trigger the password import process. + * @private + */ + onImportTap_: function() { + this.passwordManager_.importPasswords(); + }, + + /** + * Fires an event that should trigger the password export process. + * @private + */ + onExportTap_: function() { + this.passwordManager_.exportPasswords(); + }, + + /** * Returns true if the list exists and has items. * @param {Array<Object>} list * @return {boolean}
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc index b31b7000..d0eae22 100644 --- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc +++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
@@ -10,8 +10,6 @@ #include "ash/content/shell_content_state.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/root_window_controller.h" -#include "ash/shelf/shelf.h" -#include "ash/shelf/shelf_widget.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/test/ash_test_environment_content.h" @@ -1036,40 +1034,26 @@ EXPECT_FALSE(CoversScreen(window(1))); EXPECT_EQ("S[A], H[B], H[C]", GetStatus()); EXPECT_EQ("A", GetOwnersOfVisibleWindowsAsString()); - Shelf* shelf = GetPrimaryShelf(); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, shelf->auto_hide_behavior()); EXPECT_EQ(1.0f, window(0)->layer()->GetTargetOpacity()); - ShelfWidget* shelf_widget = shelf->shelf_widget(); - EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar()); // Start the animation and see that the old window is becoming invisible, the - // new one is becoming visible, the background starts transitionining and the - // shelf hides. + // new one is becoming visible, and the background starts transitionining. StartUserTransitionAnimation(account_id_B); EXPECT_EQ(kArrowBAccountIdString, GetWallpaperUserIdForTest()); EXPECT_EQ("H[A], S[B], H[C]", GetStatus()); EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity()); EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity()); - EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, shelf->auto_hide_behavior()); - EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar()); - // Staring the next step should show the shelf again, but there are many - // subsystems missing (preferences system, ChromeLauncherController, ...) - // which should set the shelf to its users state. Since that isn't there we - // can only make sure that it stays where it is. AdvanceUserTransitionAnimation(); EXPECT_EQ(kArrowBAccountIdString, GetWallpaperUserIdForTest()); EXPECT_EQ("H[A], S[B], H[C]", GetStatus()); EXPECT_EQ(0.0f, window(0)->layer()->GetTargetOpacity()); EXPECT_EQ(1.0f, window(1)->layer()->GetTargetOpacity()); - EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, shelf->auto_hide_behavior()); - EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar()); // After the finalize the animation of the wallpaper should be finished. AdvanceUserTransitionAnimation(); - EXPECT_FALSE(shelf_widget->IsShelfHiddenBehindBlackBar()); EXPECT_EQ(kBAccountIdString, GetWallpaperUserIdForTest()); } @@ -1309,96 +1293,6 @@ DISALLOW_COPY_AND_ASSIGN(TestWindowObserver); }; -// Test that switching between users with the shelf in the same place, the shelf -// will get covered with a black bar instead being hidden and re-shown. -TEST_F(MultiUserWindowManagerChromeOSTest, TestBlackBarCover) { - // We need to ensure this works for external connected monitors as well, so - // add a secondary display. - UpdateDisplay("500x500,500x500"); - - SetUpForThisManyWindows(2); - - const AccountId account_id_A(AccountId::FromUserEmail("A")); - const AccountId account_id_B(AccountId::FromUserEmail("B")); - - multi_user_window_manager()->SetWindowOwner(window(0), account_id_A); - multi_user_window_manager()->SetWindowOwner(window(1), account_id_B); - - // Move the second window to the second display and make sure it is not - // maximized for the first part of the test. - ASSERT_EQ(2u, display_manager()->GetNumDisplays()); - window(1)->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100), - display_manager()->GetDisplayAt(1)); - - ASSERT_EQ(2u, Shell::GetAllRootWindowControllers().size()); - Shelf* primary_shelf = Shell::GetAllRootWindowControllers()[0]->shelf(); - Shelf* secondary_shelf = Shell::GetAllRootWindowControllers()[1]->shelf(); - ShelfWidget* primary_shelf_widget = primary_shelf->shelf_widget(); - ShelfWidget* secondary_shelf_widget = secondary_shelf->shelf_widget(); - - // Turn the use of delays and animation on. - multi_user_window_manager()->SetAnimationSpeedForTest( - chrome::MultiUserWindowManagerChromeOS::ANIMATION_SPEED_FAST); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior()); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, - secondary_shelf->auto_hide_behavior()); - EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - - // First test that with no maximized window we show/hide the shelf. - StartUserTransitionAnimation(account_id_B); - EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior()); - EXPECT_EQ(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, - secondary_shelf->auto_hide_behavior()); - - // Staring the next step should show the shelf again. - AdvanceUserTransitionAnimation(); - EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - - AdvanceUserTransitionAnimation(); - EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - primary_shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER); - secondary_shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER); - - // Now we maximize the windows which will cause the black overlay to show up. - wm::GetWindowState(window(0))->Maximize(); - wm::GetWindowState(window(1))->Maximize(); - // We set a window observer on both windows to see that no resize is performed - // on our test windows. - TestWindowObserver window_observer; - window(0)->AddObserver(&window_observer); - window(1)->AddObserver(&window_observer); - - // Start the animation and see that the shelf gets hidden by the black bar, - // and the AutoHide behavior remains as it was. - StartUserTransitionAnimation(account_id_A); - EXPECT_TRUE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_TRUE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior()); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, - secondary_shelf->auto_hide_behavior()); - - // Starting the next step should show the shelf again. - AdvanceUserTransitionAnimation(); - EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, primary_shelf->auto_hide_behavior()); - EXPECT_NE(SHELF_AUTO_HIDE_ALWAYS_HIDDEN, - secondary_shelf->auto_hide_behavior()); - - AdvanceUserTransitionAnimation(); - EXPECT_FALSE(primary_shelf_widget->IsShelfHiddenBehindBlackBar()); - EXPECT_FALSE(secondary_shelf_widget->IsShelfHiddenBehindBlackBar()); - window(0)->RemoveObserver(&window_observer); - window(1)->RemoveObserver(&window_observer); - // No resize should have been done to the window. - EXPECT_EQ(0, window_observer.resize_calls()); -} - // Test that switching between different user won't change the activated windows // and the property of transient windows. TEST_F(MultiUserWindowManagerChromeOSTest, TransientWindowActivationTest) {
diff --git a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc index 333c571..bd8bd68 100644 --- a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc +++ b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.cc
@@ -4,10 +4,6 @@ #include "chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h" -#include "ash/root_window_controller.h" -#include "ash/shelf/shelf.h" -#include "ash/shelf/shelf_layout_manager.h" -#include "ash/shelf/shelf_widget.h" #include "ash/shell.h" #include "ash/wallpaper/wallpaper_delegate.h" #include "ash/wm/mru_window_tracker.h" @@ -215,62 +211,15 @@ void UserSwitchAnimatorChromeOS::TransitionUserShelf( AnimationStep animation_step) { + if (animation_step != ANIMATION_STEP_SHOW_NEW_USER) + return; + ChromeLauncherController* chrome_launcher_controller = ChromeLauncherController::instance(); - // The shelf animation duration override. - int duration_override = animation_speed_ms_; - // Handle the shelf order of items. This is done once the old user is hidden. - if (animation_step == ANIMATION_STEP_SHOW_NEW_USER) { - // Some unit tests have no ChromeLauncherController. - if (chrome_launcher_controller) - chrome_launcher_controller->ActiveUserChanged( - new_account_id_.GetUserEmail()); - // Hide the black rectangle on top of each shelf again. - for (aura::Window* window : ash::Shell::GetAllRootWindows()) { - ash::ShelfWidget* shelf = ash::Shelf::ForWindow(window)->shelf_widget(); - shelf->HideShelfBehindBlackBar(false, duration_override); - } - // We kicked off the shelf animation above and the override can be - // removed. - duration_override = 0; - } - - if (!animation_speed_ms_ || animation_step == ANIMATION_STEP_FINALIZE) - return; - - // Note: The animation duration override will be set before the old user gets - // hidden and reset after the animations for the new user got kicked off. - ash::Shell::RootWindowControllerList controller = - ash::Shell::Get()->GetAllRootWindowControllers(); - for (ash::Shell::RootWindowControllerList::iterator iter = controller.begin(); - iter != controller.end(); ++iter) { - (*iter)->GetShelfLayoutManager()->SetAnimationDurationOverride( - duration_override); - } - - if (animation_step != ANIMATION_STEP_HIDE_OLD_USER) - return; - - // For each root window hide the shelf. - for (aura::Window* window : ash::Shell::GetAllRootWindows()) { - // Hiding the shelf will cause a resize on a maximized window. - // If the shelf is then shown for the following user in the same location, - // the window gets resized again. Since each resize can cause a considerable - // CPU usage and therefore effect jank, we should avoid hiding the shelf if - // the start and end location are the same and cover the shelf instead with - // a black rectangle on top. - ash::Shelf* shelf = ash::Shelf::ForWindow(window); - if (GetScreenCover(window) != NO_USER_COVERS_SCREEN && - (!chrome_launcher_controller || - !chrome_launcher_controller->ShelfBoundsChangesProbablyWithUser( - shelf, new_account_id_))) { - shelf->shelf_widget()->HideShelfBehindBlackBar(true, duration_override); - } else { - // This shelf change is only part of the animation and will be updated by - // ChromeLauncherController::ActiveUserChanged() to the new users value. - // Note that the user preference will not be changed. - shelf->SetAutoHideBehavior(ash::SHELF_AUTO_HIDE_ALWAYS_HIDDEN); - } + // Some unit tests have no ChromeLauncherController. + if (chrome_launcher_controller) { + chrome_launcher_controller->ActiveUserChanged( + new_account_id_.GetUserEmail()); } }
diff --git a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h index 8a2e2e29..cd036c4 100644 --- a/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h +++ b/chrome/browser/ui/ash/multi_user/user_switch_animator_chromeos.h
@@ -79,7 +79,7 @@ // Execute the user wallpaper animations for |animation_step|. void TransitionWallpaper(AnimationStep animtion_step); - // Execute the user shelf animations for |animation_step|. + // Update the shelf for |animation_step|. void TransitionUserShelf(AnimationStep animtion_step); // Execute the window animations for |animation_step|. @@ -108,7 +108,7 @@ AnimationStep animation_step_; // The screen cover status before the animation has started. - TransitioningScreenCover screen_cover_; + const TransitioningScreenCover screen_cover_; // Mapping users IDs to the list of windows to show for these users. typedef std::map<AccountId, aura::Window::Windows> UserToWindowsMap;
diff --git a/chrome/browser/ui/passwords/password_manager_porter.cc b/chrome/browser/ui/passwords/password_manager_porter.cc index 1b6c95e..3e4e10d1 100644 --- a/chrome/browser/ui/passwords/password_manager_porter.cc +++ b/chrome/browser/ui/passwords/password_manager_porter.cc
@@ -134,11 +134,7 @@ void PasswordManagerPorter::FileSelected(const base::FilePath& path, int index, void* params) { - // We are unable to cast directly from void* to Type: reinterpret_cast will - // only convert between pointers and static_cast only from integral types to - // enums (for those types that are relevant to this example), which - // necessitates the use of two casts. - switch (static_cast<Type>(reinterpret_cast<uintptr_t>(params))) { + switch (reinterpret_cast<uintptr_t>(params)) { case PASSWORD_IMPORT: ImportPasswordsFromPath(path); break;
diff --git a/chrome/browser/ui/views/collected_cookies_views.cc b/chrome/browser/ui/views/collected_cookies_views.cc index 4627af7b..f90e90b 100644 --- a/chrome/browser/ui/views/collected_cookies_views.cc +++ b/chrome/browser/ui/views/collected_cookies_views.cc
@@ -57,9 +57,6 @@ const int kInfobarVerticalPadding = 3; const int kInfobarHorizontalPadding = 8; -// Width of the infobar frame. -const int kInfobarBorderSize = 1; - // Dimensions of the tree views. const int kTreeViewWidth = 400; const int kTreeViewHeight = 125; @@ -140,9 +137,6 @@ public: InfobarView() { content_ = new views::View; - SkColor border_color = SK_ColorGRAY; - content_->SetBorder( - views::CreateSolidBorder(kInfobarBorderSize, border_color)); info_image_ = new views::ImageView(); info_image_->SetImage(gfx::CreateVectorIcon(vector_icons::kInfoOutlineIcon,
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index d38a4f9b..3b9f798 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1172,7 +1172,8 @@ {"noCreditCardsFound", IDS_SETTINGS_CREDIT_CARD_NONE}, {"noPasswordsFound", IDS_SETTINGS_PASSWORDS_NONE}, {"noExceptionsFound", IDS_SETTINGS_PASSWORDS_EXCEPTIONS_NONE}, - }; + {"import", IDS_PASSWORD_MANAGER_IMPORT_BUTTON}, + {"export", IDS_PASSWORD_MANAGER_EXPORT_BUTTON}}; html_source->AddString( "managePasswordsLabel",
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc index f1eea08..9b968b7 100644 --- a/chrome/browser/ui/webui/settings/md_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -40,6 +40,7 @@ #include "chrome/common/url_constants.h" #include "chrome/grit/settings_resources.h" #include "chrome/grit/settings_resources_map.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "components/pref_registry/pref_registry_syncable.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" @@ -265,6 +266,11 @@ } #endif + html_source->AddBoolean( + "showImportExportPasswords", + base::FeatureList::IsEnabled( + password_manager::features::kPasswordImportExport)); + AddSettingsPageUIHandler( base::WrapUnique(AboutHandler::Create(html_source, profile))); AddSettingsPageUIHandler(
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 06fd522..f7d2558e 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -111,14 +111,7 @@ #endif // defined(OS_MACOSX) // Enables Basic/Advanced tabs in ClearBrowsingData. -const base::Feature kTabsInCbd { - "TabsInCBD", -#if defined(OS_ANDROID) - base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif -}; +const base::Feature kTabsInCbd{"TabsInCBD", base::FEATURE_ENABLED_BY_DEFAULT}; // If enabled, we'll only take thumbnails of unknown URLs (i.e. URLs that are // not (yet) part of TopSites) if they have an interesting transition type, i.e.
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl index 06c12ae4..aedcdabf 100644 --- a/chrome/common/extensions/api/passwords_private.idl +++ b/chrome/common/extensions/api/passwords_private.idl
@@ -88,6 +88,12 @@ // Returns the list of password exceptions. // |callback|: Called with the list of password exceptions. static void getPasswordExceptionList(ExceptionListCallback callback); + + // Triggers the Password Manager password import functionality. + static void importPasswords(); + + // Triggers the Password Manager password export functionality. + static void exportPasswords(); }; interface Events {
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png index c2a498212..c8c44ef 100644 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png index 371c62d..18c4fe8 100644 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.long_snippet_narrow.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png index 35e5fd45..6467eccb 100644 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png index 1bcd749..a87bd36 100644 --- a/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png +++ b/chrome/test/data/android/render_tests/ArticleSnippetsTest.modern-long_snippet_narrow.Nexus_5-19.png Binary files differ
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js index 9dc7bccc..2756794 100644 --- a/chrome/test/data/extensions/api_test/passwords_private/test.js +++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -104,6 +104,16 @@ chrome.passwordsPrivate.getPasswordExceptionList(callback); }, + + function importPasswords() { + chrome.passwordsPrivate.importPasswords(); + chrome.test.succeed(); + }, + + function exportPasswords() { + chrome.passwordsPrivate.exportPasswords(); + chrome.test.succeed(); + }, ]; var testToRun = window.location.search.substring(1);
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js index c4c4c82..ec562110 100644 --- a/chrome/test/data/webui/settings/privacy_page_test.js +++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -117,11 +117,11 @@ teardown(function() { page.remove(); }); test('showClearBrowsingDataDialog', function() { - assertFalse(!!page.$$('settings-clear-browsing-data-dialog')); + assertFalse(!!page.$$('settings-clear-browsing-data-dialog-tabs')); MockInteractions.tap(page.$$('#clearBrowsingData')); Polymer.dom.flush(); - var dialog = page.$$('settings-clear-browsing-data-dialog'); + var dialog = page.$$('settings-clear-browsing-data-dialog-tabs'); assertTrue(!!dialog); // Ensure that the dialog is fully opened before returning from this
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc index 764b213..4d70010 100644 --- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc +++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -296,6 +296,50 @@ return ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL; } +const net::NetworkTrafficAnnotationTag kNavigationPreloadTrafficAnnotation = + net::DefineNetworkTrafficAnnotation("service_worker_navigation_preload", + R"( + semantics { + sender: "Service Worker Navigation Preload" + description: + "This request is issued by a navigation to fetch the content of the " + "page that is being navigated to, in the case where a service worker " + "has been registered for the page and is using the Navigation Preload " + "API." + trigger: + "Navigating Chrome (by clicking on a link, bookmark, history item, " + "using session restore, etc)." + data: + "Arbitrary site-controlled data can be included in the URL, HTTP " + "headers, and request body. Requests may include cookies and " + "site-specific credentials." + destination: WEBSITE + } + policy { + cookies_allowed: YES + cookies_store: "user" + setting: + "This request can be prevented by disabling service workers, which can " + "be done by disabling cookie and site data under Settings, Content " + "Settings, Cookies." + chrome_policy { + URLBlacklist { + URLBlacklist: { entries: '*' } + } + } + chrome_policy { + URLWhitelist { + URLWhitelist { } + } + } + } + comments: + "Chrome would be unable to use service workers if this feature were " + "disabled, which could result in a degraded experience for websites that " + "register a service worker. Using either URLBlacklist or URLWhitelist " + "policies (or a combination of both) limits the scope of these requests." +)"); + } // namespace // ResponseCallback is owned by the callback that is passed to @@ -741,7 +785,7 @@ resource_request); // Start the network request for the URL using the network loader. - // TODO(falken): What to do about routing_id, request_id, traffic annotation? + // TODO(falken): What to do about routing_id, request_id? mojom::URLLoaderClientPtr url_loader_client_ptr_to_pass; url_loader_client->Bind(&url_loader_client_ptr_to_pass); mojom::URLLoaderPtr url_loader_associated_ptr; @@ -749,7 +793,8 @@ mojo::MakeRequest(&url_loader_associated_ptr), -1 /* routing_id? */, -1 /* request_id? */, mojom::kURLLoadOptionNone, resource_request, std::move(url_loader_client_ptr_to_pass), - net::MutableNetworkTrafficAnnotationTag() /* empty? */); + net::MutableNetworkTrafficAnnotationTag( + kNavigationPreloadTrafficAnnotation)); // Hook the load up to DelegatingURLLoader, which will call our // DelegatingURLLoaderClient.
diff --git a/content/child/blink_platform_impl.cc b/content/child/blink_platform_impl.cc index 33d93604..bdbe41e 100644 --- a/content/child/blink_platform_impl.cc +++ b/content/child/blink_platform_impl.cc
@@ -617,7 +617,7 @@ if (!strcmp(name, kDataResources[i].name)) { base::StringPiece resource = GetContentClient()->GetDataResource( kDataResources[i].id, kDataResources[i].scale_factor); - if (kDataResources[i].is_gzipped) { + if (!resource.empty() && kDataResources[i].is_gzipped) { std::string uncompressed; CHECK(compression::GzipUncompress(resource.as_string(), &uncompressed)); return WebData(uncompressed.data(), uncompressed.size());
diff --git a/device/bluetooth/bluetooth_adapter_mac_metrics.mm b/device/bluetooth/bluetooth_adapter_mac_metrics.mm index 6a9014ef..c6ff76f8 100644 --- a/device/bluetooth/bluetooth_adapter_mac_metrics.mm +++ b/device/bluetooth/bluetooth_adapter_mac_metrics.mm
@@ -7,6 +7,7 @@ #import <CoreBluetooth/CoreBluetooth.h> #import <Foundation/Foundation.h> +#include "base/mac/mac_util.h" #include "base/metrics/histogram_macros.h" namespace { @@ -51,7 +52,15 @@ case CBErrorAlreadyAdvertising: return MacOSBluetoothOperationsResult::CBERROR_ALREADY_ADVERTISING; case CBErrorConnectionFailed: - return MacOSBluetoothOperationsResult::CBERROR_CONNECTION_FAILED; + if (base::mac::IsAtLeastOS10_13()) { + return MacOSBluetoothOperationsResult::CBERROR_CONNECTION_FAILED; + } else { + // For macOS 10.12 or before, the value CBErrorMaxConnection has the + // same value than CBErrorConnectionFailed and the same description + // than CBErrorConnectionLimitReached. + return MacOSBluetoothOperationsResult:: + CBERROR_CONNECTION_LIMIT_REACHED; + } case CBErrorConnectionLimitReached: return MacOSBluetoothOperationsResult::CBERROR_CONNECTION_LIMIT_REACHED; case CBErrorUnkownDevice:
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h index b3c55e6..8662d15c 100644 --- a/extensions/browser/extension_event_histogram_value.h +++ b/extensions/browser/extension_event_histogram_value.h
@@ -429,6 +429,7 @@ WEB_VIEW_INTERNAL_ON_AUDIO_STATE_CHANGED, AUTOMATION_INTERNAL_ON_ACTION_RESULT, OMNIBOX_ON_DELETE_SUGGESTION, + PASSWORDS_PRIVATE_ON_SHOW_IMPORT_EXPORT_BUTTONS, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 22ba41f..2c53e7d 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1254,6 +1254,8 @@ AUTOTESTPRIVATE_SETMOUSEREVERSESCROLL, METRICSPRIVATE_RECORDSPARSEHASHABLE, NETWORKINGPRIVATE_SELECTCELLULARMOBILENETWORK, + PASSWORDSPRIVATE_IMPORTPASSWORDS, + PASSWORDSPRIVATE_EXPORTPASSWORDS, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/browser/guest_view/web_view/web_view_apitest.cc b/extensions/browser/guest_view/web_view/web_view_apitest.cc index eac3214..38713481 100644 --- a/extensions/browser/guest_view/web_view/web_view_apitest.cc +++ b/extensions/browser/guest_view/web_view/web_view_apitest.cc
@@ -18,6 +18,7 @@ #include "components/guest_view/browser/guest_view_manager_factory.h" #include "components/guest_view/browser/test_guest_view_manager.h" #include "content/public/browser/render_process_host.h" +#include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_renderer_host.h" @@ -293,6 +294,13 @@ #define MAYBE_AcceptTouchEvents AcceptTouchEvents #endif IN_PROC_BROWSER_TEST_F(WebViewAPITest, MAYBE_AcceptTouchEvents) { + // This test only makes sense for non-OOPIF WebView, since with + // GuestViewCrossProcessFrames events are routed directly to the + // guest, so the embedder does not need to know about the installation of + // touch handlers. + if (base::FeatureList::IsEnabled(::features::kGuestViewCrossProcessFrames)) + return; + LaunchApp("web_view/accept_touch_events"); content::RenderViewHost* embedder_rvh =
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm index a40d0d916..aa43043 100644 --- a/ios/chrome/browser/context_menu/context_menu_egtest.mm +++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -199,11 +199,9 @@ // current screen view. - (void)testContextMenuOpenInNewTabFromTallPage { // TODO(crbug.com/755888): Reenable this test. -#if !TARGET_IPHONE_SIMULATOR if (!IsIPadIdiom()) { EARL_GREY_TEST_DISABLED(@"Failing constently on iPhone devices."); } -#endif // Set up test simple http server. std::map<GURL, std::string> responses;
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm index a4553c4e..328b69c 100644 --- a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm +++ b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
@@ -132,16 +132,6 @@ testing::WaitUntilConditionOrTimeout(kWaitElementTimeout, condition), @"Waiting for tab to close"); } - -// Select the tab with title |title| using UI (tab strip on iPad, stack view on -// iPhone). -void SelectTabUsingUI(NSString* title) { - if (IsCompact()) { - WaitAndTap(chrome_test_util::ShowTabsButton(), @"Tab switcher"); - } - WaitAndTap(grey_text(title), - [NSString stringWithFormat:@"tab with title %@", title]); -} } // namespace // Test for the TabUsageRecorder class. @@ -700,7 +690,7 @@ performAction:grey_tap()]; [ChromeEarlGrey waitForMainTabCount:(numberOfTabs + 1)]; - SelectTabUsingUI(base::SysUTF8ToNSString(destinationURL.GetContent())); + chrome_test_util::SelectTabAtIndexInCurrentMode(numberOfTabs); [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; [ChromeEarlGrey waitForWebViewContainingText:"Whee"];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm index 36297a7..a963248 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_table_view.mm
@@ -351,6 +351,7 @@ signinPromoCell.closeButtonAction = ^() { [weakSelf signinPromoCloseButtonAction]; }; + signinPromoCell.selectionStyle = UITableViewCellSelectionStyleNone; return signinPromoCell; }
diff --git a/ios/chrome/browser/ui/fullscreen_egtest.mm b/ios/chrome/browser/ui/fullscreen_egtest.mm index 8457b006..4d62f45 100644 --- a/ios/chrome/browser/ui/fullscreen_egtest.mm +++ b/ios/chrome/browser/ui/fullscreen_egtest.mm
@@ -364,7 +364,7 @@ // A long page representing many lines and a link to go back. std::string manyLines = - "<p style='height:100em'>a</p>" + "<p style='height:200em'>a</p>" "<a onclick='window.history.back()' id='link'>link</a>"; responses[URL] = manyLines; web::test::SetUpSimpleHttpServer(responses);
diff --git a/ios/showcase/payments/sc_payments_editor_egtest.mm b/ios/showcase/payments/sc_payments_editor_egtest.mm index 4680242..1ab3fb997 100644 --- a/ios/showcase/payments/sc_payments_editor_egtest.mm +++ b/ios/showcase/payments/sc_payments_editor_egtest.mm
@@ -208,13 +208,6 @@ // states depending on the focused textfield and that they can be used to // navigate between the textfields. - (void)testInputAccessoryViewNavigationButtons { - // TODO(crbug.com/753098): Re-enable this test on iOS 11 iPad once - // grey_typeText works on iOS 11. The test failes on iOS 11 iPhone as well, - // but possibly for a different reason. - if (base::ios::IsRunningOnIOS11OrLater()) { - EARL_GREY_TEST_DISABLED(@"Test disabled on iOS 11."); - } - // Initially, no error message is showing. [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kWarningMessageAccessibilityID)] @@ -277,30 +270,16 @@ // Type in an address. [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Address_textField")] - performAction:grey_typeText(@"Main St")]; + performAction:grey_replaceText(@"Main St")]; - // Assert the input accessory view's next button is enabled. + // Tap the input accessory view's next button. [[EarlGrey selectElementWithMatcher:InputAccessoryViewNextButton()] - assertWithMatcher:grey_enabled()]; - // Assert the input accessory view's previous button is enabled and tap it. - [[[EarlGrey selectElementWithMatcher:InputAccessoryViewPreviousButton()] - assertWithMatcher:grey_enabled()] performAction:grey_tap()]; + performAction:grey_tap()]; // Assert the error message disappeared because an address was typed in. [[EarlGrey selectElementWithMatcher:grey_accessibilityID( kWarningMessageAccessibilityID)] assertWithMatcher:grey_notVisible()]; - - // Assert the province textfield is focused. - AssertTextFieldWithAccessibilityIDIsFirstResponder( - @"City/Province_textField"); - - // Assert the input accessory view's previous button is enabled. - [[EarlGrey selectElementWithMatcher:InputAccessoryViewPreviousButton()] - assertWithMatcher:grey_enabled()]; - // Assert the input accessory view's next button is enabled. - [[EarlGrey selectElementWithMatcher:InputAccessoryViewNextButton()] - assertWithMatcher:grey_enabled()]; } // Tests tapping the return key on every textfield causes the next textfield to
diff --git a/ios/testing/wait_util.mm b/ios/testing/wait_util.mm index 9e53cc1..f5614862 100644 --- a/ios/testing/wait_util.mm +++ b/ios/testing/wait_util.mm
@@ -13,7 +13,7 @@ namespace testing { const NSTimeInterval kSpinDelaySeconds = 0.01; -const NSTimeInterval kWaitForJSCompletionTimeout = 2.0; +const NSTimeInterval kWaitForJSCompletionTimeout = 4.0; const NSTimeInterval kWaitForUIElementTimeout = 4.0; const NSTimeInterval kWaitForDownloadTimeout = 10.0; const NSTimeInterval kWaitForPageLoadTimeout = 10.0;
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 5e809c9..9e0eb80 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -220,6 +220,10 @@ #define SK_SUPPORT_LEGACY_FONTMGR_API #endif +#ifndef SK_SUPPORT_LEGACY_SAFESIZE64 +#define SK_SUPPORT_LEGACY_SAFESIZE64 +#endif + ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json index b65e5ee..4efbabf5 100644 --- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json +++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -2953,6 +2953,12 @@ {} ] ], + "fullscreen/rendering/fullscreen-pseudo-class-manual.html": [ + [ + "/fullscreen/rendering/fullscreen-pseudo-class-manual.html", + {} + ] + ], "geolocation-API/getCurrentPosition_permission-manual.html": [ [ "/geolocation-API/getCurrentPosition_permission-manual.html", @@ -100747,6 +100753,16 @@ {} ] ], + "fullscreen/rendering/fullscreen-pseudo-class-manual-expected.txt": [ + [ + {} + ] + ], + "fullscreen/rendering/fullscreen-pseudo-class-support.html": [ + [ + {} + ] + ], "fullscreen/trusted-click.js": [ [ {} @@ -244814,11 +244830,11 @@ "testharness" ], "css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt": [ - "2a7dee5a47c1543a7071b52746fe516665f2cf4b", + "beb1e635a1676aa2a424a9f94f3ae106b6d3371b", "support" ], "css/geometry-1/DOMMatrix2DInit-validate-fixup.html": [ - "8383666d61dec0c0e04b182e56fd1676e1942ed5", + "aa00e3456bf951230fb85999874795c918964cf4", "testharness" ], "css/geometry-1/DOMMatrixInit-validate-fixup.html": [ @@ -254305,6 +254321,18 @@ "c7fc8323d503adb6d7f0c390a8add90c5c9e8082", "manual" ], + "fullscreen/rendering/fullscreen-pseudo-class-manual-expected.txt": [ + "791c97ec5818625f661df54b8739b022c64902e9", + "support" + ], + "fullscreen/rendering/fullscreen-pseudo-class-manual.html": [ + "258b3c119a6a9ea7220a339b0d8e4964b8fb2a5e", + "manual" + ], + "fullscreen/rendering/fullscreen-pseudo-class-support.html": [ + "0cdfe5cf8321b6c46a75a2f75f6224970368d4ae", + "support" + ], "fullscreen/trusted-click.js": [ "e401e8e8bcd97446991398d6021a9bd712c923c5", "support"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt index f4686d7f..fe1a7ebc4 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt +++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup-expected.txt
@@ -1,96 +1,188 @@ This is a testharness.js-based test. -Found 92 tests; 6 PASS, 86 FAIL, 0 TIMEOUT, 0 NOTRUN. -PASS {a: 1, m11: 2} (invalid) -PASS {b: 0, m12: -1} (invalid) -PASS {c: Infinity, m21: -Infinity} (invalid) -PASS {d: 0, m22: NaN} (invalid) -PASS {e: 1, m41: 1.00000001} (invalid) -PASS {f: 0, m42: 5e-324} (invalid) -FAIL Sanity check without dictionary ctx.getTransform is not a function -FAIL {m13: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m14: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m23: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m24: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m31: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m32: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: -1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m34: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m43: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m44: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {is2D: undefined} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {a: 1, m11: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {b: 0, m12: undefined} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {c: 0, m21: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {c: 0, m21: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {c: -0, m21: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {c: -0, m21: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {d: Infinity, m22: Infinity} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {e: -Infinity, m41: -Infinity} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {f: NaN, m42: NaN} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {f: NaN, m42: NaN, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {f: 0, m42: null} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {f: -0, m42: null} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {a: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {b: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {c: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {d: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {e: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {f: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {a: -0, b: -0, c: -0, d: -0, e: -0, f: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m11: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m12: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m21: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m22: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m41: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m42: 2} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m13: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m13: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m14: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m14: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m23: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m23: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m24: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m24: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m31: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m31: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m32: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m32: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m34: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m34: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m43: 0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m43: -0, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m44: 1, is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {is2D: true} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m13: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m14: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m23: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m24: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m31: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m32: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: 0, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: -0, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: -1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m34: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m43: 1, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m44: 0, is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m13: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m14: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m23: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m24: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m31: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m32: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m33: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m34: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m43: 1} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {m44: 0} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {is2D: false} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. -FAIL {is2D: null} Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +Found 184 tests; 12 PASS, 172 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS setTransform({a: 1, m11: 2}) (invalid) +PASS addPath({a: 1, m11: 2}) (invalid) +PASS setTransform({b: 0, m12: -1}) (invalid) +PASS addPath({b: 0, m12: -1}) (invalid) +PASS setTransform({c: Infinity, m21: -Infinity}) (invalid) +PASS addPath({c: Infinity, m21: -Infinity}) (invalid) +PASS setTransform({d: 0, m22: NaN}) (invalid) +PASS addPath({d: 0, m22: NaN}) (invalid) +PASS setTransform({e: 1, m41: 1.00000001}) (invalid) +PASS addPath({e: 1, m41: 1.00000001}) (invalid) +PASS setTransform({f: 0, m42: 5e-324}) (invalid) +PASS addPath({f: 0, m42: 5e-324}) (invalid) +FAIL setTransform (Sanity check without dictionary) ctx.getTransform is not a function +FAIL addPath (Sanity check without second parameter) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m13: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m13: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m14: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m14: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m23: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m23: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m24: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m24: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m31: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m31: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m32: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m32: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: -1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: -1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m34: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m34: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m43: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m43: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m44: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m44: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({is2D: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({is2D: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({a: 1, m11: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({a: 1, m11: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({b: 0, m12: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({b: 0, m12: undefined}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({c: 0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({c: 0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({c: 0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({c: 0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({c: -0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({c: -0, m21: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({c: -0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({c: -0, m21: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({d: Infinity, m22: Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({d: Infinity, m22: Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({e: -Infinity, m41: -Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({e: -Infinity, m41: -Infinity}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({f: NaN, m42: NaN}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({f: NaN, m42: NaN}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({f: NaN, m42: NaN, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({f: NaN, m42: NaN, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({f: 0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({f: 0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({f: -0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({f: -0, m42: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({a: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({a: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({b: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({b: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({c: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({c: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({d: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({d: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({e: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({e: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({f: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({f: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({a: -0, b: -0, c: -0, d: -0, e: -0, f: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m11: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m11: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m12: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m12: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m21: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m21: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m22: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m22: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m41: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m41: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m42: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m42: 2}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m11: -0, m12: -0, m21: -0, m22: -0, m41: -0, m42: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m13: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m13: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m13: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m13: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m14: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m14: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m14: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m14: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m23: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m23: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m23: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m23: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m24: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m24: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m24: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m24: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m31: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m31: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m31: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m31: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m32: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m32: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m32: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m32: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m34: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m34: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m34: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m34: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m43: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m43: 0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m43: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m43: -0, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m44: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m44: 1, is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({is2D: true}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m13: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m13: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m14: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m14: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m23: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m23: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m24: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m24: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m31: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m31: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m32: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m32: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: -0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: -0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: -1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: -1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m34: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m34: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m43: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m43: 1, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m44: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m44: 0, is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m13: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m13: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m14: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m14: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m23: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m23: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m24: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m24: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m31: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m31: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m32: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m32: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m33: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m33: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m34: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m34: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m43: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m43: 1}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({m44: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({m44: 0}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({is2D: false}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL setTransform({is2D: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. +FAIL addPath({is2D: null}) Failed to execute 'setTransform' on 'CanvasRenderingContext2D': 6 arguments required, but only 1 present. Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html index 523f2a1..5fb7e7d2 100644 --- a/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html +++ b/third_party/WebKit/LayoutTests/external/wpt/css/geometry-1/DOMMatrix2DInit-validate-fixup.html
@@ -10,8 +10,35 @@ setup(() => { window.canvas = document.getElementById('canvas'); window.ctx = canvas.getContext('2d'); + window.ctx.fillStyle = '#000'; }); +function clearCanvas(ctx) { + ctx.resetTransform(); + ctx.clearRect(0, 0, window.canvas.width, window.canvas.height); +} + +function drawRectWithSetTransform(ctx, transform) { + clearCanvas(ctx); + ctx.setTransform(transform); + ctx.fillRect(20, 20, 30, 30); + return window.canvas.toDataURL(); +} + +function drawRectWithAddPathTransform(ctx, transform) { + clearCanvas(ctx); + var path = new Path2D(); + path.rect(20, 20, 30, 30); + var transformedPath = new Path2D(); + if (transform === undefined) { + transformedPath.addPath(path); + } else { + transformedPath.addPath(path, transform); + } + ctx.fill(transformedPath); + return window.canvas.toDataURL(); +} + [ {a: 1, m11: 2}, {b: 0, m12: -1}, @@ -23,7 +50,11 @@ test(() => { ctx.resetTransform(); assert_throws(new TypeError(), () => ctx.setTransform(dict)); - }, `${format_dict(dict)} (invalid)`); + }, `setTransform(${format_dict(dict)}) (invalid)`); + + test(() => { + assert_throws(new TypeError(), () => drawRectWithAddPathTransform(ctx, dict)); + }, `addPath(${format_dict(dict)}) (invalid)`); }); test(() => { @@ -31,7 +62,14 @@ ctx.setTransform(1, 2, 3, 4, 5, 6); const matrix = ctx.getTransform(); checkMatrix(matrix, matrix2D({m11: 1, m12: 2, m21: 3, m22: 4, m41: 5, m42: 6})); -}, `Sanity check without dictionary`); +}, `setTransform (Sanity check without dictionary)`); + +test(() => { + var ident = matrix2D({}); + var expectedResultURL = drawRectWithSetTransform(ctx, ident); + var actualResultURL = drawRectWithAddPathTransform(ctx); + assert_equals(actualResultURL, expectedResultURL); +}, `addPath (Sanity check without second parameter)`); [ // Input dict that would throw if ignore3D was false @@ -57,10 +95,10 @@ [{c: 0, m21: -0}, matrix2D({m21: -0})], [{c: -0, m21: 0}, matrix2D({m21: 0})], [{c: -0, m21: -0}, matrix2D({m21: -0})], - [{d: Infinity, m22: Infinity}, matrix2D({m22: Infinity})], - [{e: -Infinity, m41: -Infinity}, matrix2D({m41: -Infinity})], - [{f: NaN, m42: NaN}, matrix2D({m42: NaN})], - [{f: NaN, m42: NaN, is2D: true}, matrix2D({m42: NaN})], + [{d: Infinity, m22: Infinity}, matrix2D({})], // should be silently ignored + [{e: -Infinity, m41: -Infinity}, matrix2D({})], // should be silently ignored + [{f: NaN, m42: NaN}, matrix2D({})], // should be silently ignored + [{f: NaN, m42: NaN, is2D: true}, matrix2D({})], // should be silently ignored [{f: 0, m42: null}, matrix2D({m42: 0})], // null is converted to 0 [{f: -0, m42: null}, matrix2D({m42: 0})], // null is converted to 0 [{a: 2}, matrix2D({m11: 2})], @@ -134,6 +172,12 @@ ctx.setTransform(dict); const matrix = ctx.getTransform(); checkMatrix(matrix, expected); - }, `${format_dict(dict)}`); -}); + }, `setTransform(${format_dict(dict)})`); + + test(() => { + var expectedResultURL = drawRectWithSetTransform(ctx, expected); + var actualResultURL = drawRectWithAddPathTransform(ctx, expected); + assert_equals(actualResultURL, expectedResultURL); + }, `addPath(${format_dict(dict)})`); + }); </script>
diff --git a/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp b/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp index 0770c6d..994654d 100644 --- a/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/NativeValueTraitsImplTest.cpp
@@ -8,7 +8,6 @@ #include "bindings/core/v8/ExceptionState.h" #include "bindings/core/v8/IDLTypes.h" #include "bindings/core/v8/ToV8ForCore.h" -#include "bindings/core/v8/ToV8ForTesting.h" #include "bindings/core/v8/V8BindingForTesting.h" #include "bindings/core/v8/V8Internals.h" #include "bindings/core/v8/v8_test_sequence_callback.h"
diff --git a/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h b/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h index 1115b6b..b5a50968 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h +++ b/third_party/WebKit/Source/bindings/core/v8/ToV8ForCore.h
@@ -10,6 +10,7 @@ #include "bindings/core/v8/IDLDictionaryBase.h" #include "bindings/core/v8/ScriptValue.h" +#include "bindings/core/v8/V8BindingForTesting.h" #include "bindings/core/v8/V8NodeFilterCondition.h" #include "core/dom/Node.h" #include "core/typed_arrays/ArrayBufferViewHelpers.h" @@ -79,6 +80,11 @@ return ScriptValue(script_state, ToV8(std::forward<T>(value), script_state)); } +template <typename T> +v8::Local<v8::Value> ToV8(V8TestingScope* scope, T value) { + return blink::ToV8(value, scope->GetContext()->Global(), scope->GetIsolate()); +} + } // namespace blink #endif // ToV8ForCore_h
diff --git a/third_party/WebKit/Source/bindings/core/v8/ToV8ForTesting.h b/third_party/WebKit/Source/bindings/core/v8/ToV8ForTesting.h deleted file mode 100644 index aad115a..0000000 --- a/third_party/WebKit/Source/bindings/core/v8/ToV8ForTesting.h +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2017 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. - -#ifndef ToV8ForTesting_h -#define ToV8ForTesting_h - -#include "bindings/core/v8/V8BindingForTesting.h" - -namespace blink { - -template <typename T> -v8::Local<v8::Value> ToV8(V8TestingScope* scope, T value) { - return blink::ToV8(value, scope->GetContext()->Global(), scope->GetIsolate()); -} - -} // namespace blink - -#endif // ToV8ForTesting_h
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp b/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp index 8cfd7ef..d9e6d44 100644 --- a/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/V8BindingTest.cpp
@@ -9,7 +9,6 @@ #include "bindings/core/v8/NativeValueTraitsImpl.h" #include "bindings/core/v8/ScriptValue.h" #include "bindings/core/v8/ToV8ForCore.h" -#include "bindings/core/v8/ToV8ForTesting.h" #include "bindings/core/v8/V8BindingForTesting.h" #include "platform/wtf/Vector.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp b/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp index ed642ff..df605cf 100644 --- a/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp +++ b/third_party/WebKit/Source/core/css/CSSCalculationValueTest.cpp
@@ -148,45 +148,25 @@ TEST(CSSCalculationValue, RefCount) { RefPtr<CalculationValue> calc = CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll); - Length length_a(calc); - EXPECT_EQ(calc->RefCount(), 2); - Length length_b; - length_b = length_a; - EXPECT_EQ(calc->RefCount(), 3); + // FIXME: Test the Length construction without using the ref count value. - Length length_c(calc); - length_c = length_a; - EXPECT_EQ(calc->RefCount(), 4); + EXPECT_TRUE(calc->HasOneRef()); + { + Length length_a(calc); + EXPECT_FALSE(calc->HasOneRef()); - Length length_d( - CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll)); - length_d = length_a; - EXPECT_EQ(calc->RefCount(), 5); -} - -TEST(CSSCalculationValue, RefCountLeak) { - RefPtr<CalculationValue> calc = - CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll); - Length length_a(calc); - - Length length_b = length_a; - for (int i = 0; i < 100; ++i) + Length length_b; length_b = length_a; - EXPECT_EQ(calc->RefCount(), 3); - Length length_c(length_a); - for (int i = 0; i < 100; ++i) + Length length_c(calc); length_c = length_a; - EXPECT_EQ(calc->RefCount(), 4); - Length length_d(calc); - for (int i = 0; i < 100; ++i) + Length length_d( + CalculationValue::Create(PixelsAndPercent(1, 2), kValueRangeAll)); length_d = length_a; - EXPECT_EQ(calc->RefCount(), 5); - - length_d = Length(); - EXPECT_EQ(calc->RefCount(), 4); + } + EXPECT_TRUE(calc->HasOneRef()); } TEST(CSSCalculationValue, AddToLengthUnitValues) {
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp index e42d8ec..8908b40 100644 --- a/third_party/WebKit/Source/core/editing/EditingUtilities.cpp +++ b/third_party/WebKit/Source/core/editing/EditingUtilities.cpp
@@ -1475,23 +1475,22 @@ .DeepEquivalent(); } -bool CanMergeLists(Element* first_list, Element* second_list) { - if (!first_list || !second_list || !first_list->IsHTMLElement() || - !second_list->IsHTMLElement()) +bool CanMergeLists(const Element& first_list, const Element& second_list) { + if (!first_list.IsHTMLElement() || !second_list.IsHTMLElement()) return false; - DCHECK(!NeedsLayoutTreeUpdate(*first_list)); - DCHECK(!NeedsLayoutTreeUpdate(*second_list)); - return first_list->HasTagName( + DCHECK(!NeedsLayoutTreeUpdate(first_list)); + DCHECK(!NeedsLayoutTreeUpdate(second_list)); + return first_list.HasTagName( second_list - ->TagQName()) // make sure the list types match (ol vs. ul) - && HasEditableStyle(*first_list) && - HasEditableStyle(*second_list) // both lists are editable - && RootEditableElement(*first_list) == - RootEditableElement( - *second_list) // don't cross editing boundaries - && IsVisiblyAdjacent(Position::InParentAfterNode(*first_list), - Position::InParentBeforeNode(*second_list)); + .TagQName()) // make sure the list types match (ol vs. ul) + && HasEditableStyle(first_list) && + HasEditableStyle(second_list) // both lists are editable + && + RootEditableElement(first_list) == + RootEditableElement(second_list) // don't cross editing boundaries + && IsVisiblyAdjacent(Position::InParentAfterNode(first_list), + Position::InParentBeforeNode(second_list)); // Make sure there is no visible content between this li and the previous list }
diff --git a/third_party/WebKit/Source/core/editing/EditingUtilities.h b/third_party/WebKit/Source/core/editing/EditingUtilities.h index a8b06c92..763d024 100644 --- a/third_party/WebKit/Source/core/editing/EditingUtilities.h +++ b/third_party/WebKit/Source/core/editing/EditingUtilities.h
@@ -367,7 +367,7 @@ // Boolean functions on Element -bool CanMergeLists(Element* first_list, Element* second_list); +bool CanMergeLists(const Element& first_list, const Element& second_list); CORE_EXPORT bool ElementCannotHaveEndTag(const Node&);
diff --git a/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp index 6e8490c..7c9265a 100644 --- a/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/DeleteSelectionCommand.cpp
@@ -68,6 +68,13 @@ return true; } +static bool CanMergeListElements(Element* first_list, Element* second_list) { + if (!first_list || !second_list || first_list == second_list) + return false; + + return CanMergeLists(*first_list, *second_list); +} + DeleteSelectionCommand::DeleteSelectionCommand( Document& document, bool smart_delete, @@ -877,10 +884,8 @@ Node* list_item_in_second_paragraph = EnclosingNodeOfType(downstream_end_, IsListItem); if (list_item_in_first_paragraph && list_item_in_second_paragraph && - list_item_in_first_paragraph->parentElement() != - list_item_in_second_paragraph->parentElement() && - CanMergeLists(list_item_in_first_paragraph->parentElement(), - list_item_in_second_paragraph->parentElement())) { + CanMergeListElements(list_item_in_first_paragraph->parentElement(), + list_item_in_second_paragraph->parentElement())) { MergeIdenticalElements(list_item_in_first_paragraph->parentElement(), list_item_in_second_paragraph->parentElement(), editing_state);
diff --git a/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp b/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp index 7982de0..656997f4 100644 --- a/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/IndentOutdentCommand.cpp
@@ -134,14 +134,15 @@ } GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets(); - if (CanMergeLists(previous_list, new_list)) { + DCHECK(new_list); + if (previous_list && CanMergeLists(*previous_list, *new_list)) { MergeIdenticalElements(previous_list, new_list, editing_state); if (editing_state->IsAborted()) return false; } GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets(); - if (CanMergeLists(new_list, next_list)) { + if (next_list && CanMergeLists(*new_list, *next_list)) { MergeIdenticalElements(new_list, next_list, editing_state); if (editing_state->IsAborted()) return false;
diff --git a/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp b/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp index 22d007f..e5b5da8 100644 --- a/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/InsertListCommand.cpp
@@ -72,10 +72,11 @@ HTMLElement* InsertListCommand::MergeWithNeighboringLists( HTMLElement* passed_list, EditingState* editing_state) { + DCHECK(passed_list); HTMLElement* list = passed_list; Element* previous_list = ElementTraversal::PreviousSibling(*list); GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets(); - if (CanMergeLists(previous_list, list)) { + if (previous_list && CanMergeLists(*previous_list, *list)) { MergeIdenticalElements(previous_list, list, editing_state); if (editing_state->IsAborted()) return nullptr; @@ -90,7 +91,7 @@ HTMLElement* next_list = ToHTMLElement(next_sibling); GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets(); - if (CanMergeLists(list, next_list)) { + if (CanMergeLists(*list, *next_list)) { MergeIdenticalElements(list, next_list, editing_state); if (editing_state->IsAborted()) return nullptr; @@ -599,7 +600,7 @@ return; GetDocument().UpdateStyleAndLayoutIgnorePendingStylesheets(); - if (CanMergeLists(previous_list, next_list)) + if (previous_list && next_list && CanMergeLists(*previous_list, *next_list)) MergeIdenticalElements(previous_list, next_list, editing_state); return;
diff --git a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h index 9ca0d85..7c22d392 100644 --- a/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h +++ b/third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h
@@ -1528,7 +1528,6 @@ } } - SECURITY_DCHECK(current_style_->RefCount() > 0); if (check_for_break && !width_.FitsOnLine()) { // if we have floats, try to get below them. if (current_character_is_space_ && !ignoring_spaces_ &&
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc index 037b3a9..c053dfb 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc +++ b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.cc
@@ -128,6 +128,11 @@ } // namespace +// static +void NGPhysicalFragmentTraits::Destruct(const NGPhysicalFragment* fragment) { + fragment->Destroy(); +} + NGPhysicalFragment::NGPhysicalFragment(LayoutObject* layout_object, const ComputedStyle& style, NGPhysicalSize size,
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h index 5222e74..9bd184d 100644 --- a/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h +++ b/third_party/WebKit/Source/core/layout/ng/ng_physical_fragment.h
@@ -19,6 +19,12 @@ class LayoutObject; struct NGPixelSnappedPhysicalBoxStrut; +class NGPhysicalFragment; + +struct CORE_EXPORT NGPhysicalFragmentTraits { + static void Destruct(const NGPhysicalFragment*); +}; + // The NGPhysicalFragment contains the output geometry from layout. The // fragment stores all of its information in the physical coordinate system for // use by paint, hit-testing etc. @@ -39,9 +45,10 @@ // (See https://drafts.csswg.org/css-backgrounds-3/#the-background-image) // - image (<img>, svg <image>) or video (<video>) elements that are // placeholders for displaying them. -class CORE_EXPORT NGPhysicalFragment : public RefCounted<NGPhysicalFragment>, - public DisplayItemClient, - public ImageResourceObserver { +class CORE_EXPORT NGPhysicalFragment + : public RefCounted<NGPhysicalFragment, NGPhysicalFragmentTraits>, + public DisplayItemClient, + public ImageResourceObserver { public: enum NGFragmentType { kFragmentBox = 0, @@ -133,13 +140,6 @@ void ShowFragmentTree() const; #endif - // Override RefCounted's deref() to ensure operator delete is called on the - // appropriate subclass type. - void Deref() const { - if (DerefBase()) - Destroy(); - } - protected: NGPhysicalFragment(LayoutObject* layout_object, const ComputedStyle& style, @@ -162,6 +162,7 @@ unsigned border_edge_ : 4; // NGBorderEdges::Physical private: + friend struct NGPhysicalFragmentTraits; void Destroy() const; };
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp index 7389139..6a48a1f 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp +++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzFace.cpp
@@ -90,9 +90,9 @@ HarfBuzzFontCache::iterator result = FontGlobalContext::GetHarfBuzzFontCache().find(unique_id_); SECURITY_DCHECK(result != FontGlobalContext::GetHarfBuzzFontCache().end()); - DCHECK_GT(result.Get()->value->RefCount(), 1); + DCHECK(!result.Get()->value->HasOneRef()); result.Get()->value->Deref(); - if (result.Get()->value->RefCount() == 1) + if (result.Get()->value->HasOneRef()) FontGlobalContext::GetHarfBuzzFontCache().erase(unique_id_); }
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp index 546d6c8..a614211f 100644 --- a/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp +++ b/third_party/WebKit/Source/platform/fonts/shaping/HarfBuzzShaperTest.cpp
@@ -46,18 +46,17 @@ TEST_F(HarfBuzzShaperTest, MutableUnique) { RefPtr<ShapeResult> result = ShapeResult::Create(&font, 0, TextDirection::kLtr); - EXPECT_EQ(1, result->RefCount()); + EXPECT_TRUE(result->HasOneRef()); // At this point, |result| has only one ref count. RefPtr<ShapeResult> result2 = result->MutableUnique(); EXPECT_EQ(result.Get(), result2.Get()); - EXPECT_EQ(2, result2->RefCount()); + EXPECT_FALSE(result2->HasOneRef()); // Since |result| has 2 ref counts, it should return a clone. RefPtr<ShapeResult> result3 = result->MutableUnique(); EXPECT_NE(result.Get(), result3.Get()); - EXPECT_EQ(1, result3->RefCount()); - EXPECT_EQ(2, result->RefCount()); + EXPECT_TRUE(result3->HasOneRef()); } TEST_F(HarfBuzzShaperTest, ResolveCandidateRunsLatin) {
diff --git a/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp b/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp index 2c30c7f..3b6e262 100644 --- a/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp +++ b/third_party/WebKit/Source/platform/wtf/FunctionalTest.cpp
@@ -316,7 +316,7 @@ EXPECT_EQ(10, function1()); } -class Number : public RefCounted<Number> { +class Number { public: static RefPtr<Number> Create(int value) { return WTF::AdoptRef(new Number(value)); @@ -325,11 +325,20 @@ ~Number() { value_ = 0; } int Value() const { return value_; } + int RefCount() const { return ref_count_; } + + bool HasOneRef() const { return ref_count_ == 1; } + void Ref() const { ++ref_count_; } + void Deref() const { + if (--ref_count_ == 0) + delete this; + } private: explicit Number(int value) : value_(value) {} int value_; + mutable int ref_count_ = 1; }; int MultiplyNumberByTwo(Number* number) { @@ -338,7 +347,7 @@ TEST(FunctionalTest, RefCountedStorage) { RefPtr<Number> five = Number::Create(5); - EXPECT_EQ(1, five->RefCount()); + EXPECT_TRUE(five->HasOneRef()); Function<int()> multiply_five_by_two_function = WTF::Bind(MultiplyNumberByTwo, five); EXPECT_EQ(2, five->RefCount());
diff --git a/third_party/WebKit/Source/platform/wtf/RefCounted.h b/third_party/WebKit/Source/platform/wtf/RefCounted.h index 9bcd861..853357a 100644 --- a/third_party/WebKit/Source/platform/wtf/RefCounted.h +++ b/third_party/WebKit/Source/platform/wtf/RefCounted.h
@@ -57,13 +57,6 @@ return ref_count_ == 1; } - int RefCount() const { -#if CHECK_REF_COUNTED_LIFECYCLE - SECURITY_DCHECK(verifier_.IsSafeToUse()); -#endif - return ref_count_; - } - protected: RefCountedBase() : ref_count_(1) @@ -135,7 +128,17 @@ } #endif +template <typename T, typename Traits> +class RefCounted; + template <typename T> +struct DefaultRefCountedTraits { + static void Destruct(const T* x) { + WTF::RefCounted<T, DefaultRefCountedTraits>::DeleteInternal(x); + } +}; + +template <typename T, typename Traits = DefaultRefCountedTraits<T>> class RefCounted : public RefCountedBase { WTF_MAKE_NONCOPYABLE(RefCounted); @@ -147,11 +150,15 @@ public: void Deref() const { if (DerefBase()) - delete static_cast<const T*>(this); + Traits::Destruct(static_cast<const T*>(this)); } protected: RefCounted() {} + + private: + friend struct DefaultRefCountedTraits<T>; + static void DeleteInternal(const T* x) { delete x; } }; // Allows subclasses to use the default copy constructor.
diff --git a/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h b/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h index 5b3015e..2289e8e 100644 --- a/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h +++ b/third_party/WebKit/Source/platform/wtf/ThreadSafeRefCounted.h
@@ -55,16 +55,31 @@ base::AtomicRefCount ref_count_; }; -template <class T> +template <typename T, typename Traits> +class ThreadSafeRefCounted; + +template <typename T> +struct DefaultThreadSafeRefCountedTraits { + static void Destruct(const T* x) { + WTF::ThreadSafeRefCounted< + T, DefaultThreadSafeRefCountedTraits>::DeleteInternal(x); + } +}; + +template <typename T, typename Traits = DefaultThreadSafeRefCountedTraits<T>> class ThreadSafeRefCounted : public ThreadSafeRefCountedBase { public: void Deref() { if (DerefBase()) - delete static_cast<T*>(this); + Traits::Destruct(static_cast<T*>(this)); } protected: ThreadSafeRefCounted() {} + + private: + friend struct DefaultThreadSafeRefCountedTraits<T>; + static void DeleteInternal(const T* x) { delete x; } }; } // namespace WTF
diff --git a/third_party/WebKit/public/platform/WebPrivatePtr.h b/third_party/WebKit/public/platform/WebPrivatePtr.h index 0fc3c6b..4dc30dd 100644 --- a/third_party/WebKit/public/platform/WebPrivatePtr.h +++ b/third_party/WebKit/public/platform/WebPrivatePtr.h
@@ -41,7 +41,7 @@ #endif namespace WTF { -template <class T> +template <class T, typename Traits> class ThreadSafeRefCounted; }
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js index 78dce7da..ed89e96 100644 --- a/third_party/closure_compiler/externs/passwords_private.js +++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -108,6 +108,16 @@ chrome.passwordsPrivate.getPasswordExceptionList = function(callback) {}; /** + * @see https://developer.chrome.com/extensions/passwordsPrivate#method-importPasswords + */ +chrome.passwordsPrivate.importPasswords = function() {}; + +/** + * @see https://developer.chrome.com/extensions/passwordsPrivate#method-exportPasswords + */ +chrome.passwordsPrivate.exportPasswords = function() {}; + +/** * Fired when the saved passwords list has changed, meaning that an entry has * been added or removed. * @type {!ChromeEvent}
diff --git a/third_party/freetype/BUILD.gn b/third_party/freetype/BUILD.gn index 0dbb1c6..fd6c35b 100644 --- a/third_party/freetype/BUILD.gn +++ b/third_party/freetype/BUILD.gn
@@ -45,6 +45,7 @@ "include/freetype-custom-config/ftoption.h", "src/src/base/ftbase.c", "src/src/base/ftbitmap.c", + "src/src/base/ftlcdfil.c", ] include_dirs = [] @@ -119,7 +120,6 @@ "src/src/base/ftgasp.c", "src/src/base/ftglyph.c", "src/src/base/ftinit.c", - "src/src/base/ftlcdfil.c", "src/src/base/ftmm.c", "src/src/base/ftstroke.c", "src/src/base/fttype1.c",
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 9e6e738..ce2ddbc 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-8-1-23 -Revision: 6f2b6f8f72ffb5017ab00fca83185b21f1a9f56d +Version: VER-2-8-1-24 +Revision: 02e80da6090c21d6e59ac955b7f56e1ad4a9850b License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses" License File: src/docs/FTL.TXT
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 6d0211a..004b3c5 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -23824,6 +23824,8 @@ <int value="-55944747" label="disable-child-account-detection"/> <int value="-52483823" label="disable-new-video-renderer"/> <int value="-52241456" label="enable-single-click-autofill"/> + <int value="-50628385" + label="ContentSuggestionsThumbnailDominantColor:enabled"/> <int value="-50021298" label="ash-adjustable-large-cursor"/> <int value="-48920737" label="enable-smooth-scrolling"/> <int value="-45532639" label="enable-default-media-session"/> @@ -24159,6 +24161,8 @@ <int value="1000706989" label="AutomaticTabDiscarding:disabled"/> <int value="1002585107" label="emphasize-titles-in-omnibox-dropdown"/> <int value="1003002105" label="MaterialDesignBookmarks:disabled"/> + <int value="1004909189" + label="ContentSuggestionsThumbnailDominantColor:disabled"/> <int value="1007444341" label="enable-prefixed-encrypted-media"/> <int value="1015895665" label="drop-sync-credential:enabled"/> <int value="1018998019" label="memlog"/> @@ -39118,6 +39122,7 @@ <int value="125596241" label="component_updater_utils"/> <int value="126122632" label="web_history_expire_between_dates"/> <int value="129652775" label="devtools_network_resource"/> + <int value="129872904" label="service_worker_navigation_preload"/> <int value="131180348" label="indexed_db_internals_handler"/> <int value="131236802" label="data_reduction_proxy_secure_proxy_check"/> <int value="131741641" label="permission_reporting"/>
diff --git a/tools/perf/benchmarks/service_worker.py b/tools/perf/benchmarks/service_worker.py index f9530e36..1cfc967 100644 --- a/tools/perf/benchmarks/service_worker.py +++ b/tools/perf/benchmarks/service_worker.py
@@ -204,4 +204,7 @@ self.DisableStory('http://localhost:8091/index.html', [story.expectations.ANDROID_WEBVIEW], 'crbug.com/653924') + self.DisableStory('http://localhost:8091/index.html', + [story.expectations.ALL], + 'crbug.com/767086') return StoryExpectations()
diff --git a/tools/traffic_annotation/sample_traffic_annotation.cc b/tools/traffic_annotation/sample_traffic_annotation.cc index 6e53fa0..361059e 100644 --- a/tools/traffic_annotation/sample_traffic_annotation.cc +++ b/tools/traffic_annotation/sample_traffic_annotation.cc
@@ -29,12 +29,13 @@ setting: "..." chrome_policy { [POLICY_NAME] { - policy_options {mode: MANDATORY/RECOMMENDED/UNSET} [POLICY_NAME]: ... } } policy_exception_justification = "..." - })"); + } + comments: "..." + )"); } // An example on one level traffic annotation. @@ -65,7 +66,6 @@ "Advanced. The feature is disabled by default." chrome_policy { SpellCheckServiceEnabled { - policy_options {mode: MANDATORY} SpellCheckServiceEnabled: false } } @@ -107,7 +107,6 @@ "feature is enabled by default." chrome_policy { SearchSuggestEnabled { - policy_options {mode: MANDATORY} SearchSuggestEnabled: false } } @@ -141,7 +140,6 @@ "'Passwords and forms'). There is no setting to disable the API." chrome_policy { PasswordManagerEnabled { - policy_options {mode: MANDATORY} PasswordManagerEnabled: false } } @@ -232,7 +230,6 @@ "feature is enabled by default." chrome_policy { MetricsReportingEnabled { - policy_options {mode: MANDATORY} MetricsReportingEnabled: false } }
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index a1f3c58..68609c0 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -175,6 +175,7 @@ <item id="safe_search_url_reporter" hash_code="119677115" content_hash_code="67393078" os_list="linux,windows"/> <item id="save_file_manager" hash_code="56275203" content_hash_code="56692339" os_list="linux,windows"/> <item id="sdch_dictionary_fetch" hash_code="47152935" deprecated="2017-09-16" content_hash_code="16764294"/> + <item id="service_worker_navigation_preload" hash_code="129872904" content_hash_code="79473248" os_list="linux,windows"/> <item id="service_worker_write_to_cache_job" hash_code="117963307" content_hash_code="18065724" os_list="linux,windows"/> <item id="signed_in_profile_avatar" hash_code="108903331" content_hash_code="72850619" os_list="linux,windows"/> <item id="speech_recognition_downstream" hash_code="26096088" content_hash_code="120733233" os_list="linux,windows"/>