diff --git a/.gn b/.gn index c5c73f8..aa8ac14 100644 --- a/.gn +++ b/.gn
@@ -119,7 +119,6 @@ "//extensions/browser/api/messaging:*", # 1 error "//extensions/browser/api/metrics_private:*", # 3 errors "//extensions/browser/api/mime_handler_private:*", # 1 error - "//extensions/browser/api/networking_config:*", # 7 errors "//extensions/browser/api/networking_private:*", # 14 errors "//extensions/browser/api/power:*", # 3 errors "//extensions/browser/api/printer_provider:*", # 7 errors
diff --git a/BUILD.gn b/BUILD.gn index b1f4f32..4cb0533 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -1189,7 +1189,7 @@ script = _common_web_test_script args = _common_web_test_args + [ - "--layout-test-directory=@WrappedPath(" + rebase_path( + "--layout-tests-directory=@WrappedPath(" + rebase_path( "//third_party/devtools-frontend/src/test/webtests", root_out_dir) + ")", "http/tests/devtools",
diff --git a/DEPS b/DEPS index 7b307eb..8d39462 100644 --- a/DEPS +++ b/DEPS
@@ -195,11 +195,11 @@ # 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': '07055b5e25a28e145e68ce6ccb71d9d6ee1d3481', + 'skia_revision': '4efaf5e9feada3eddf286fb362f60d3b11a24e34', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '896ca12d998bf559bd044443018ebf22a1e63a40', + 'v8_revision': '7bb48090258056285eefddebf26d55a22121fe5a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -207,7 +207,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '46d4522b161bf1af3b214d823940da7f8b08ee52', + 'angle_revision': '336202d7d6014fd61f430d4ac92d756b33d32ae3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -266,7 +266,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '30127e006a5b6fba602a0a8f19dccf4d4b195316', + 'devtools_frontend_revision': '182a24a6540bde3aaa252af3d531746b47d8bcd6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -318,7 +318,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '936ef0a5f21e5622e003257d665f049804d07516', + 'dawn_revision': 'a7b0fdc90fead0d47e3b83169b38fdd1ea22a539', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -881,7 +881,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '84bd221ed748e1d0a3155c8a9a210d4802f94678', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '4fe1d403a22dfa80541234f4553a2d432772d81f', 'condition': 'checkout_chromeos', }, @@ -952,7 +952,7 @@ Var('chromium_git') + '/codecs/libgav1.git' + '@' + 'a9449e612bc251b4271bbe1e3a0d12e9809bf74c', 'src/third_party/glslang/src': - Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '2067d1a93e6edc17f2a6b7e3e5138a9bbcd35ef9', + Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + 'f4f1d8a352ca1908943aea2ad8c54b39b4879080', 'src/third_party/google_toolbox_for_mac/src': { 'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'), @@ -1254,7 +1254,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '7c7b98f060011e2ed9602bede9d8a6a5f875fb3c', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a4b8d27d96b763f6aaccef6610a1f723471f4d5d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1486,7 +1486,7 @@ }, 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1da46abbddb6802fd039853ab5454289658558ce', + Var('webrtc_git') + '/src.git' + '@' + '3e0a5fc2097e6867909d68d3b0c3e8f89e4864b2', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1558,7 +1558,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fb0f797b07aa3fe343867e56364efffabc02e1c8', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c99c8ab390f734954e7cf9610c86052cc2d54ff1', 'condition': 'checkout_src_internal', }, @@ -4884,6 +4884,7 @@ ], }, # Download AFDO profiles for Chrome OS for each architecture. + # TODO(crbug/1135245): silvermont, airmont, broadwell to be replaced by atom and bigcore { 'name': 'Fetch Chrome OS AFDO profiles (silvermont)', 'pattern': '.', @@ -4921,6 +4922,30 @@ ], }, { + 'name': 'Fetch Chrome OS AFDO profiles (from Intel Atom cores)', + 'pattern': '.', + 'condition': 'checkout_chromeos or checkout_simplechrome', + 'action': [ 'vpython', + 'src/tools/download_optimization_profile.py', + '--newest_state=src/chromeos/profiles/atom.afdo.newest.txt', + '--local_state=src/chromeos/profiles/atom.afdo.local.txt', + '--output_name=src/chromeos/profiles/atom.afdo.prof', + '--gs_url_base=chromeos-prebuilt/afdo-job/vetted/release', + ], + }, + { + 'name': 'Fetch Chrome OS AFDO profiles (from Intel big cores)', + 'pattern': '.', + 'condition': 'checkout_chromeos or checkout_simplechrome', + 'action': [ 'vpython', + 'src/tools/download_optimization_profile.py', + '--newest_state=src/chromeos/profiles/bigcore.afdo.newest.txt', + '--local_state=src/chromeos/profiles/bigcore.afdo.local.txt', + '--output_name=src/chromeos/profiles/bigcore.afdo.prof', + '--gs_url_base=chromeos-prebuilt/afdo-job/vetted/release', + ], + }, + { # Pull doclava binaries if building for Android. 'name': 'doclava', 'pattern': '.',
diff --git a/WATCHLISTS b/WATCHLISTS index 8bad9be..ae38b56 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -2216,12 +2216,10 @@ 'rijubrata.bhaumik@intel.com', 'timvolodine@chromium.org'], 'blink_devtools': ['devtools-reviews+blink@chromium.org'], - 'blink_dom': ['blink-reviews-dom@chromium.org', - 'eae+blinkwatch@chromium.org'], + 'blink_dom': ['blink-reviews-dom@chromium.org'], 'blink_dom_storage': ['dmurph+watching-domstorage@chromium.org'], 'blink_events': ['blink-reviews-events@chromium.org', - 'dtapuska+blinkwatch@chromium.org', - 'eae+blinkwatch@chromium.org'], + 'dtapuska+blinkwatch@chromium.org'], 'blink_fetch': ['gavinp+loader@chromium.org', 'japhet@chromium.org', 'loading-reviews+fetch@chromium.org'], @@ -2241,7 +2239,6 @@ 'blink_input': ['dtapuska+blinkwatch@chromium.org'], 'blink_layers': ['blink-layers+watch@chromium.org'], 'blink_layout': ['blink-reviews-layout@chromium.org', - 'eae+blinkwatch@chromium.org', 'zoltan@webkit.org'], 'blink_layout_ng': ['cbiesinger@chromium.org', 'glebl+reviews@chromium.org',
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 31b9f30..49ba797 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -500,6 +500,7 @@ "java/src/org/chromium/android_webview/gfx/AwGLFunctor.java", "java/src/org/chromium/android_webview/gfx/AwPicture.java", "java/src/org/chromium/android_webview/gfx/JavaBrowserViewRendererHelper.java", + "java/src/org/chromium/android_webview/gfx/RectUtils.java", "java/src/org/chromium/android_webview/gfx/RootBeginFrameSourceWebView.java", "java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java", "java/src/org/chromium/android_webview/metrics/AwNonembeddedUmaReplayer.java",
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc index a1b50d5..83df785 100644 --- a/android_webview/browser/aw_contents.cc +++ b/android_webview/browser/aw_contents.cc
@@ -434,6 +434,14 @@ static void JNI_AwContents_SetAwDrawGLFunctionTable(JNIEnv* env, jlong function_table) {} +static void JNI_AwContents_UpdateOpenWebScreenArea(JNIEnv* env, + jint pixels, + jint percentage) { + AwBrowserProcess::GetInstance() + ->visibility_metrics_logger() + ->UpdateOpenWebScreenArea(pixels, percentage); +} + // static jint JNI_AwContents_GetNativeInstanceCount(JNIEnv* env) { return base::subtle::NoBarrier_Load(&g_instance_count); @@ -1199,6 +1207,12 @@ SetDipScaleInternal(dip_scale); } +jboolean AwContents::IsDisplayingOpenWebContent( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj) { + return GetVisibilityInfo().IsDisplayingOpenWebContent(); +} + void AwContents::OnInputEvent(JNIEnv* env, const JavaParamRef<jobject>& obj) { browser_view_renderer_.OnInputEvent(); }
diff --git a/android_webview/browser/aw_contents.h b/android_webview/browser/aw_contents.h index 877c508..1d55edca 100644 --- a/android_webview/browser/aw_contents.h +++ b/android_webview/browser/aw_contents.h
@@ -359,6 +359,9 @@ void SetDipScale(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, jfloat dip_scale); + jboolean IsDisplayingOpenWebContent( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); void OnInputEvent(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); void SetSaveFormData(bool enabled);
diff --git a/android_webview/browser/aw_feature_list.cc b/android_webview/browser/aw_feature_list.cc index 780aae008..48007f6e 100644 --- a/android_webview/browser/aw_feature_list.cc +++ b/android_webview/browser/aw_feature_list.cc
@@ -27,6 +27,7 @@ &features::kWebViewConnectionlessSafeBrowsing, &features::kWebViewDisplayCutout, &features::kWebViewTestFeature, + &features::kWebViewMeasureScreenCoverage, }; const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
diff --git a/android_webview/browser/metrics/visibility_metrics_logger.cc b/android_webview/browser/metrics/visibility_metrics_logger.cc index 81fdab0..30909df 100644 --- a/android_webview/browser/metrics/visibility_metrics_logger.cc +++ b/android_webview/browser/metrics/visibility_metrics_logger.cc
@@ -63,6 +63,16 @@ return *histogram; } +base::HistogramBase* +VisibilityMetricsLogger::GetOpenWebVisibileScreenPortionHistogram() { + static NoDestructor<base::HistogramBase*> histogram( + CreateHistogramForDurationTracking( + "Android.WebView.WebViewOpenWebVisible.ScreenPortion", + static_cast<int>(VisibilityMetricsLogger:: + WebViewOpenWebScreenPortion::kMaxValue))); + return *histogram; +} + VisibilityMetricsLogger::VisibilityMetricsLogger() { DCHECK_CURRENTLY_ON(BrowserThread::UI); last_update_time_ = base::TimeTicks::Now(); @@ -99,6 +109,22 @@ ProcessClientUpdate(client, client->GetVisibilityInfo()); } +void VisibilityMetricsLogger::UpdateOpenWebScreenArea(int pixels, + int percentage) { + DCHECK_CURRENTLY_ON(BrowserThread::UI); + + UpdateDurations(base::TimeTicks::Now()); + + open_web_screen_area_pixels_ = pixels; + open_web_screen_area_percentage_ = percentage; + + DCHECK(percentage >= 0); + DCHECK(percentage <= 100); + current_open_web_screen_portion_ = + static_cast<VisibilityMetricsLogger::WebViewOpenWebScreenPortion>( + percentage / 10); +} + void VisibilityMetricsLogger::UpdateDurations(base::TimeTicks update_time) { base::TimeDelta delta = update_time - last_update_time_; if (visible_client_count_ > 0) { @@ -123,26 +149,32 @@ webcontent_visible_tracker_.per_webview_untracked_duration_ += delta * (client_visibility_.size() - visible_webcontent_client_count_); + open_web_screen_portion_tracked_duration_[static_cast<int>( + current_open_web_screen_portion_)] += delta; + last_update_time_ = update_time; } -bool VisibilityMetricsLogger::IsVisible(const VisibilityInfo& info) { - return info.view_attached && info.view_visible && info.window_visible; +bool VisibilityMetricsLogger::VisibilityInfo::IsVisible() const { + return view_attached && view_visible && window_visible; } -bool VisibilityMetricsLogger::IsDisplayingOpenWebContent( - const VisibilityInfo& info) { - return info.scheme_http_or_https; +bool VisibilityMetricsLogger::VisibilityInfo::ContainsOpenWebContent() const { + return scheme_http_or_https; +} + +bool VisibilityMetricsLogger::VisibilityInfo::IsDisplayingOpenWebContent() + const { + return IsVisible() && ContainsOpenWebContent(); } void VisibilityMetricsLogger::ProcessClientUpdate(Client* client, const VisibilityInfo& info) { VisibilityInfo curr_info = client_visibility_[client]; - bool was_visible = IsVisible(curr_info); - bool is_visible = IsVisible(info); - bool was_visible_web = - IsVisible(curr_info) && IsDisplayingOpenWebContent(curr_info); - bool is_visible_web = IsVisible(info) && IsDisplayingOpenWebContent(info); + bool was_visible = curr_info.IsVisible(); + bool is_visible = info.IsVisible(); + bool was_visible_web = curr_info.IsDisplayingOpenWebContent(); + bool is_visible_web = info.IsDisplayingOpenWebContent(); client_visibility_[client] = info; DCHECK(!was_visible || visible_client_count_ > 0); @@ -164,6 +196,7 @@ UpdateDurations(base::TimeTicks::Now()); RecordVisibilityMetrics(); RecordOpenWebDisplayMetrics(); + RecordScreenPortionMetrics(); } void VisibilityMetricsLogger::RecordVisibilityMetrics() { @@ -257,4 +290,20 @@ } } +void VisibilityMetricsLogger::RecordScreenPortionMetrics() { + int tracked_portion = static_cast<int>(current_open_web_screen_portion_); + + // TODO (idries@): record every bucket, not just + // current_open_web_screen_portion_ + int32_t elapsed_seconds = + open_web_screen_portion_tracked_duration_[tracked_portion].InSeconds(); + if (elapsed_seconds == 0) + return; + + open_web_screen_portion_tracked_duration_[tracked_portion] -= + base::TimeDelta::FromSeconds(elapsed_seconds); + GetOpenWebVisibileScreenPortionHistogram()->AddCount(tracked_portion, + elapsed_seconds); +} + } // namespace android_webview \ No newline at end of file
diff --git a/android_webview/browser/metrics/visibility_metrics_logger.h b/android_webview/browser/metrics/visibility_metrics_logger.h index e30ccc6..bfacafa 100644 --- a/android_webview/browser/metrics/visibility_metrics_logger.h +++ b/android_webview/browser/metrics/visibility_metrics_logger.h
@@ -25,6 +25,10 @@ bool view_visible = false; bool window_visible = false; bool scheme_http_or_https = false; + + bool IsVisible() const; + bool ContainsOpenWebContent() const; + bool IsDisplayingOpenWebContent() const; }; // These values are persisted to logs. Entries should not be renumbered and @@ -37,6 +41,23 @@ // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. + enum class WebViewOpenWebScreenPortion { + kZeroPercent = 0, + kTenPercent = 1, + kTwentyPercent = 2, + kThirtyPercent = 3, + kFortyPercent = 4, + kFiftyPercent = 5, + kSixtyPercent = 6, + kSeventyPercent = 7, + kEightyPercent = 8, + kNinetyPercent = 9, + kOneHundredPercent = 10, + kMaxValue = kOneHundredPercent + }; + + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. enum class WebViewOpenWebVisibility { kDisplayOpenWebContent = 0, kNotDisplayOpenWebContent = 1, @@ -57,6 +78,7 @@ void AddClient(Client* client); void RemoveClient(Client* client); void ClientVisibilityChanged(Client* client); + void UpdateOpenWebScreenArea(int pixels, int percentage); void RecordMetrics(); @@ -65,6 +87,7 @@ static base::HistogramBase* GetPerWebViewVisibilityHistogram(); static base::HistogramBase* GetGlobalOpenWebVisibilityHistogram(); static base::HistogramBase* GetPerWebViewOpenWebVisibilityHistogram(); + static base::HistogramBase* GetOpenWebVisibileScreenPortionHistogram(); static base::HistogramBase* CreateHistogramForDurationTracking( const char* name, int max_value); @@ -75,6 +98,7 @@ bool IsDisplayingOpenWebContent(const VisibilityInfo& info); void RecordVisibilityMetrics(); void RecordOpenWebDisplayMetrics(); + void RecordScreenPortionMetrics(); // Counter for visible clients size_t visible_client_count_ = 0; @@ -101,6 +125,13 @@ base::TimeTicks last_update_time_; std::map<Client*, VisibilityInfo> client_visibility_; + + int open_web_screen_area_pixels_ = 0; + int open_web_screen_area_percentage_ = 0; + WebViewOpenWebScreenPortion current_open_web_screen_portion_ = + WebViewOpenWebScreenPortion::kZeroPercent; + base::TimeDelta open_web_screen_portion_tracked_duration_ + [static_cast<size_t>(WebViewOpenWebScreenPortion::kMaxValue) + 1] = {}; }; } // namespace android_webview
diff --git a/android_webview/common/aw_features.cc b/android_webview/common/aw_features.cc index 6d5d79d..46381dbe 100644 --- a/android_webview/common/aw_features.cc +++ b/android_webview/common/aw_features.cc
@@ -35,6 +35,14 @@ const base::Feature kWebViewExtraHeadersSameOriginOnly{ "WebViewExtraHeadersSameOriginOnly", base::FEATURE_DISABLED_BY_DEFAULT}; +// Measure the number of pixels occupied by one or more WebViews as a +// proportion of the total screen size. Depending on the number of +// WebVieaws and the size of the screen this might be expensive so +// hidden behind a feature flag until the true runtime cost can be +// measured. +const base::Feature kWebViewMeasureScreenCoverage{ + "WebViewMeasureScreenCoverage", base::FEATURE_DISABLED_BY_DEFAULT}; + // A Feature used for WebView variations tests. Not used in production. const base::Feature kWebViewTestFeature{"WebViewTestFeature", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/android_webview/common/aw_features.h b/android_webview/common/aw_features.h index bc91ce9c..a2ca23a 100644 --- a/android_webview/common/aw_features.h +++ b/android_webview/common/aw_features.h
@@ -19,6 +19,7 @@ extern const base::Feature kWebViewDisplayCutout; extern const base::Feature kWebViewExtraHeadersSameDomainOnly; extern const base::Feature kWebViewExtraHeadersSameOriginOnly; +extern const base::Feature kWebViewMeasureScreenCoverage; extern const base::Feature kWebViewTestFeature; extern const base::Feature kWebViewWideColorGamutSupport;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 28eff26..e67733c 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -35,6 +35,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewStructure; +import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityNodeProvider; import android.view.animation.AnimationUtils; import android.view.autofill.AutofillValue; @@ -47,11 +48,13 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import org.chromium.android_webview.common.AwFeatures; import org.chromium.android_webview.common.AwSwitches; import org.chromium.android_webview.gfx.AwDrawFnImpl; import org.chromium.android_webview.gfx.AwFunctor; import org.chromium.android_webview.gfx.AwGLFunctor; import org.chromium.android_webview.gfx.AwPicture; +import org.chromium.android_webview.gfx.RectUtils; import org.chromium.android_webview.permission.AwGeolocationCallback; import org.chromium.android_webview.permission.AwPermissionRequest; import org.chromium.android_webview.renderer_priority.RendererPriority; @@ -120,7 +123,9 @@ import java.lang.ref.WeakReference; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.WeakHashMap; @@ -175,6 +180,9 @@ private static final Pattern sDataURLWithSelectorPattern = Pattern.compile("^[^#]*(#[A-Za-z][A-Za-z0-9\\-_:.]*)$"); + private static final HashMap<View, AwContents.AwOnPreDrawListener> sRootViewPreDrawListeners = + new HashMap<>(); + private static class ForceAuxiliaryBitmapRendering { private static final boolean sResult = lazyCheck(); private static boolean lazyCheck() { @@ -854,6 +862,55 @@ } }; + private static class AwOnPreDrawListener implements ViewTreeObserver.OnPreDrawListener { + private View mRootView; + private List<AwContents> mAwContentsList = new ArrayList<AwContents>(); + + public AwOnPreDrawListener(View rootView) { + mRootView = rootView; + } + + public boolean trackContents(AwContents contents) { + return mAwContentsList.add(contents); + } + + public boolean unTrackContents(AwContents contents) { + return mAwContentsList.remove(contents); + } + + public boolean isTracking() { + return mAwContentsList.size() > 0; + } + + @Override + public boolean onPreDraw() { + if (TRACE) Log.i(TAG, "%s onPreDraw", this); + if (AwFeatureList.isEnabled(AwFeatures.WEBVIEW_MEASURE_SCREEN_COVERAGE)) { + List<Rect> openWebContentRects = new ArrayList<Rect>(); + for (AwContents content : mAwContentsList) { + assert !content.isDestroyed(NO_WARN); + if (AwContentsJni.get().isDisplayingOpenWebContent( + content.mNativeAwContents, content)) { + openWebContentRects.add(content.getGlobalVisibleRect()); + } + } + + Rect rootVisibleRect = new Rect((int) mRootView.getX(), (int) mRootView.getY(), + (int) mRootView.getX() + mRootView.getWidth(), + (int) mRootView.getY() + mRootView.getHeight()); + int openWebPixelCoverage = + RectUtils.calculatePixelsOfCoverage(rootVisibleRect, openWebContentRects); + + float openWebVisiblePercentage = + (float) openWebPixelCoverage / RectUtils.getRectArea(rootVisibleRect); + + AwContentsJni.get().updateOpenWebScreenArea( + openWebPixelCoverage, (int) openWebVisiblePercentage); + } + return true; + } + } + //-------------------------------------------------------------------------------------------- /** * @param browserContext the browsing context to associate this view contents with. @@ -2929,6 +2986,39 @@ mTemporarilyDetached = false; mAwViewMethods.onAttachedToWindow(); mWindowAndroid.getWindowAndroid().getDisplay().addObserver(mDisplayObserver); + + AwOnPreDrawListener listener = getOrCreateOnPreDrawListener(mContainerView); + listener.trackContents(this); + } + + private AwOnPreDrawListener getOrCreateOnPreDrawListener(ViewGroup viewGroup) { + AwOnPreDrawListener listener = null; + View rootView = viewGroup.getRootView(); + if (!sRootViewPreDrawListeners.containsKey(rootView)) { + if (TRACE) Log.i(TAG, "%s installing OnPreDraw Listener for %s", this, rootView); + + ViewTreeObserver viewTreeObserver = rootView.getViewTreeObserver(); + listener = new AwOnPreDrawListener(rootView); + viewTreeObserver.addOnPreDrawListener(listener); + sRootViewPreDrawListeners.put(rootView, listener); + } else { + listener = sRootViewPreDrawListeners.get(rootView); + } + return listener; + } + + private void detachPreDrawListener() { + // Don't use getOrCreateOnPreDrawListener, if we have to create + // the listener at this point then something has gone wrong and + // we should fail rather than create a new one. + AwOnPreDrawListener listener = sRootViewPreDrawListeners.get(mContainerView.getRootView()); + if (listener == null) return; + + listener.unTrackContents(this); + if (listener.isTracking()) return; + + if (TRACE) Log.i(TAG, "%s removing " + listener, this); + sRootViewPreDrawListeners.remove(mContainerView.getRootView()); } /** @@ -2937,6 +3027,7 @@ @SuppressLint("MissingSuperCall") public void onDetachedFromWindow() { if (TRACE) Log.i(TAG, "%s onDetachedFromWindow", this); + detachPreDrawListener(); mWindowAndroid.getWindowAndroid().getDisplay().removeObserver(mDisplayObserver); mAwViewMethods.onDetachedFromWindow(); } @@ -4109,6 +4200,10 @@ boolean isVisible(long nativeAwContents, AwContents caller); boolean isDisplayingInterstitialForTesting(long nativeAwContents, AwContents caller); void setDipScale(long nativeAwContents, AwContents caller, float dipScale); + + boolean isDisplayingOpenWebContent(long nativeAwContents, AwContents caller); + void updateOpenWebScreenArea(int pixels, int percentage); + void onInputEvent(long nativeAwContents, AwContents caller); // Returns null if save state fails. byte[] getOpaqueState(long nativeAwContents, AwContents caller);
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index a3f9d8db..ee3e072d 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -83,6 +83,11 @@ "Only allow extra headers added via loadUrl() to be sent to the same domain " + "(eTLD+1) as the original request. Has no effect when the " + "stricter same-origin feature is enabled."), + Flag.baseFeature(AwFeatures.WEBVIEW_MEASURE_SCREEN_COVERAGE, + "Measure the number of pixels occupied by one or more WebViews as a proportion " + + "of the total screen size. Depending on the number of WebVieaws and " + + "the size of the screen this might be expensive so hidden behind a " + + "feature flag until the true runtime cost can be measured."), Flag.baseFeature("WebComponentsV0", "Re-enables the deprecated Web Components v0 features (Shadow DOM v0, Custom " + "Elements v0, and HTML Imports)."),
diff --git a/android_webview/java/src/org/chromium/android_webview/gfx/RectUtils.java b/android_webview/java/src/org/chromium/android_webview/gfx/RectUtils.java new file mode 100644 index 0000000..d50e77ce --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/gfx/RectUtils.java
@@ -0,0 +1,258 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.gfx; + +import android.graphics.Rect; + +import androidx.annotation.IntDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; +import java.util.List; + +/** + * Utility functions for calculating Rectangle properties (i.e. Area of a single Rect) + */ +public final class RectUtils { + private RectUtils() {} + + public static int getRectArea(Rect rect) { + return rect.width() * rect.height(); + } + + /** + * Segment Type Constants + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({SegmentType.START, SegmentType.END}) + private @interface SegmentType { + int START = 0; + int END = 1; + } + + private static int compareSegmentTypes(int s1, int s2) { + if (s1 == s2) { + return 0; + } else if (s1 == SegmentType.START && s2 == SegmentType.END) { + return -1; + } else { + return 1; + } + } + + private static class HorizontalSegment implements Comparable<HorizontalSegment> { + public int mX; + public int mTop; + public int mBottom; + public @SegmentType int mSegmentType; + + public HorizontalSegment() { + set(0, 0, 0, SegmentType.START); + } + + public void set(int x, int top, int bottom, @SegmentType int segmentType) { + this.mX = x; + this.mTop = top; + this.mBottom = bottom; + this.mSegmentType = segmentType; + } + + @Override + public int compareTo(HorizontalSegment other) { + if (mX == other.mX) { + return compareSegmentTypes(mSegmentType, other.mSegmentType); + } + return mX - other.mX; + } + } + + private static class VerticalSegment implements Comparable<VerticalSegment> { + public int mY; + public @SegmentType int mSegmentType; + + public VerticalSegment() { + set(0, SegmentType.START); + } + + public void set(int y, @SegmentType int segmentType) { + this.mY = y; + this.mSegmentType = segmentType; + } + + public void set(VerticalSegment other) { + set(other.mY, other.mSegmentType); + } + + @Override + public int compareTo(VerticalSegment other) { + if (mY == other.mY) { + return compareSegmentTypes(mSegmentType, other.mSegmentType); + } + return mY - other.mY; + } + } + + private static void insertSorted( + VerticalSegment arr[], int n, VerticalSegment verticalSegment, int capacity) { + assert n < capacity; + + int i; + for (i = n - 1; (i >= 0 && arr[i].compareTo(verticalSegment) > 0); i--) { + arr[i + 1].set(arr[i]); + } + + int insert_index = i + 1; + assert insert_index >= 0 && insert_index < capacity; + arr[insert_index].set(verticalSegment); + } + + private static int deleteElement( + VerticalSegment arr[], int n, VerticalSegment verticalSegment) { + int pos = Arrays.binarySearch(arr, 0, n, verticalSegment); + if (pos < 0) { + return -1; + } + + // In the case of duplicate values, either one can be removed + for (int i = pos + 1; i < n; i++) { + arr[i - 1].set(arr[i]); + } + return n - 1; + } + + private static int getCoverageOfVerticalSegments( + VerticalSegment vSegments[], int numVerticalSegments) { + int scanCount = 0; + int coveredPixels = 0; + int start = -1; + + for (int i = 0; i < numVerticalSegments; i++) { + VerticalSegment verticalSegment = vSegments[i]; + if (scanCount == 0 && verticalSegment.mSegmentType == SegmentType.START) { + start = verticalSegment.mY; + } else if (scanCount == 1 && verticalSegment.mSegmentType == SegmentType.END) { + coveredPixels += verticalSegment.mY - start; + } + scanCount += verticalSegment.mSegmentType == SegmentType.START ? 1 : -1; + } + return coveredPixels; + } + + private static HorizontalSegment sHorizontalSegments[]; + private static VerticalSegment sVerticalSegments[]; + private static VerticalSegment sVerticalSegment1 = new VerticalSegment(); + private static VerticalSegment sVerticalSegment2 = new VerticalSegment(); + private static Rect sClippedRects[]; + + /* + This is a 2d extension of the 1d range intersection problem. + In one dimension we are interested in calculating the + intersected set of ranges for an input. To do this we decompose + each input range into a start and an end position, plus whether + it is entering a range or leaving it. Once these decomposed + positions are sorted, we can compute the intersection by + iterating over the list and recording transitions from not being + in a range to being in a range, and vice versa. + + E.g. [1,4] U [2,5] U [7,9] -> [1,+1] [2,+1] [4,-1] [5,-1] + [7,+1] [9,-1]. Then, summing the second component as we + traverse, and looking for 0->1 and 1->0 transitions, we end up + finding the union ranges [1,5], [7,9] + + In order to extend this to 2d axis aligned rectangles, we + decompose rectangles into top and bottom edges that add or + remove a range from the 1d data data structure. Before we add or + remove a range to the 1d data structure we accumulate area equal + to the current 1d coverage multiplied by the delta-y from the + last point at which we updated the coverage. + +1 4 7 11 14 18 +1 +------+ [4,+1], [11,-1] cov=7 area += 0 +2 +----------------+ [1,+1], [4,+1], [11,-1], [18,-1], cov=17, rea += 7*1 +3 | | +------+ | [1,+1], [4,+1], [7,+1], [11,-1], [14,-1], [18,-1], cov=17 area += 17*1 +4 | +------+ | | [1,+1], [7,+1], [14,-1], [18,-1], cov=17 area += 17*1 +5 +----------------+ [7,+1], [14,-1] cov=7 area += 17*1 +6 +------+ [] area += 7*1 + */ + + public static int calculatePixelsOfCoverage(Rect screenRect, List<Rect> coverageRects) { + if (coverageRects.size() == 0) { + return 0; + } + + // Always allocate enough space for all passed rects and never trim allocations as a result + // of clipping + if ((sClippedRects == null ? 0 : sClippedRects.length) < coverageRects.size()) { + sClippedRects = new Rect[coverageRects.size()]; + } + + int numClippedRects = 0; + for (int i = 0; i < coverageRects.size(); i++) { + Rect clipRect = coverageRects.get(i); + if (clipRect.intersect(screenRect)) { // This line may modify he the value of the passed + // in coverage rects + sClippedRects[numClippedRects++] = clipRect; + } + } + + if (numClippedRects == 0) { + return 0; + } + + int maxSegments = numClippedRects * 2; + int numVerticalSegments = 0; + + if ((sHorizontalSegments == null ? 0 : sHorizontalSegments.length) < maxSegments) { + sHorizontalSegments = new HorizontalSegment[maxSegments]; + sVerticalSegments = new VerticalSegment[maxSegments]; + + for (int i = 0; i < maxSegments; i++) { + sHorizontalSegments[i] = new HorizontalSegment(); + sVerticalSegments[i] = new VerticalSegment(); + } + } + + for (int i = 0; i < maxSegments; i += 2) { + Rect coverageRect = sClippedRects[i / 2]; + sHorizontalSegments[i].set( + coverageRect.left, coverageRect.top, coverageRect.bottom, SegmentType.START); + sHorizontalSegments[i + 1].set( + coverageRect.right, coverageRect.top, coverageRect.bottom, SegmentType.END); + } + + Arrays.sort(sHorizontalSegments, 0, maxSegments); + + int prev_x = -1; + int coveredPixels = 0; + for (int i = 0; i < maxSegments; i++) { + HorizontalSegment hSegment = sHorizontalSegments[i]; + coveredPixels += getCoverageOfVerticalSegments(sVerticalSegments, numVerticalSegments) + * (hSegment.mX - prev_x); + sVerticalSegment1.set(hSegment.mTop, SegmentType.START); + sVerticalSegment2.set(hSegment.mBottom, SegmentType.END); + + if (hSegment.mSegmentType == SegmentType.START) { + insertSorted( + sVerticalSegments, numVerticalSegments, sVerticalSegment1, maxSegments); + numVerticalSegments++; + insertSorted( + sVerticalSegments, numVerticalSegments, sVerticalSegment2, maxSegments); + numVerticalSegments++; + } else { + int ret; + ret = deleteElement(sVerticalSegments, numVerticalSegments, sVerticalSegment1); + assert ret != -1; + numVerticalSegments = ret; + ret = deleteElement(sVerticalSegments, numVerticalSegments, sVerticalSegment2); + assert ret != -1; + numVerticalSegments = ret; + } + prev_x = hSegment.mX; + } + + return coveredPixels; + } +} \ No newline at end of file
diff --git a/android_webview/junit/src/org/chromium/android_webview/robolectric/RectUtilsTest.java b/android_webview/junit/src/org/chromium/android_webview/robolectric/RectUtilsTest.java new file mode 100644 index 0000000..3ee1fe4 --- /dev/null +++ b/android_webview/junit/src/org/chromium/android_webview/robolectric/RectUtilsTest.java
@@ -0,0 +1,88 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.robolectric; + +import android.graphics.Rect; + +import androidx.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.android_webview.gfx.RectUtils; +import org.chromium.base.test.util.Feature; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tests for FindAddress implementation. + */ +@RunWith(LocalRobolectricTestRunner.class) +public class RectUtilsTest { + @Test + @Feature({"AndroidWebView"}) + @SmallTest + public void testPixelCoverage() { + Rect screenRect = new Rect(0, 0, 100, 100); + int coveragePixels; + + List<Rect> singleCoverageRect = new ArrayList<Rect>(); + singleCoverageRect.add(new Rect(10, 10, 30, 30)); + + coveragePixels = RectUtils.calculatePixelsOfCoverage(screenRect, singleCoverageRect); + Assert.assertEquals(400, coveragePixels); + + List<Rect> multipleCoverageRect = new ArrayList<Rect>(); + multipleCoverageRect.add(new Rect(10, 10, 30, 30)); + multipleCoverageRect.add(new Rect(60, 10, 80, 30)); + + coveragePixels = RectUtils.calculatePixelsOfCoverage(screenRect, multipleCoverageRect); + Assert.assertEquals(800, coveragePixels); + + List<Rect> multipleCoverageRectSingleOverlap = new ArrayList<Rect>(); + multipleCoverageRectSingleOverlap.add(new Rect(10, 10, 60, 30)); + multipleCoverageRectSingleOverlap.add(new Rect(50, 10, 80, 30)); + + coveragePixels = + RectUtils.calculatePixelsOfCoverage(screenRect, multipleCoverageRectSingleOverlap); + Assert.assertEquals(1400, coveragePixels); + + List<Rect> multipleCoverageRectDoubleOverlap = new ArrayList<Rect>(); + multipleCoverageRectDoubleOverlap.add(new Rect(10, 10, 60, 30)); + multipleCoverageRectDoubleOverlap.add(new Rect(50, 10, 80, 30)); + multipleCoverageRectDoubleOverlap.add(new Rect(55, 15, 65, 25)); + + coveragePixels = + RectUtils.calculatePixelsOfCoverage(screenRect, multipleCoverageRectDoubleOverlap); + Assert.assertEquals(1400, coveragePixels); + + List<Rect> zeroDimensionsCoverageRect = new ArrayList<Rect>(); + zeroDimensionsCoverageRect.add(new Rect(10, 10, 10, 30)); + zeroDimensionsCoverageRect.add(new Rect(10, 10, 80, 10)); + zeroDimensionsCoverageRect.add(new Rect(10, 10, 10, 10)); + + coveragePixels = + RectUtils.calculatePixelsOfCoverage(screenRect, zeroDimensionsCoverageRect); + Assert.assertEquals(0, coveragePixels); + + List<Rect> touchingCoverageRect = new ArrayList<Rect>(); + touchingCoverageRect.add(new Rect(10, 10, 30, 30)); + touchingCoverageRect.add(new Rect(30, 10, 50, 30)); + touchingCoverageRect.add(new Rect(10, 30, 30, 50)); + + coveragePixels = RectUtils.calculatePixelsOfCoverage(screenRect, touchingCoverageRect); + Assert.assertEquals(1200, coveragePixels); + + List<Rect> clippedCoverageRect = new ArrayList<Rect>(); + clippedCoverageRect.add(new Rect(90, 90, 130, 130)); + clippedCoverageRect.add(new Rect(120, 120, 130, 130)); + + coveragePixels = RectUtils.calculatePixelsOfCoverage(screenRect, clippedCoverageRect); + Assert.assertEquals(100, coveragePixels); + } +} \ No newline at end of file
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index 1e66c696..f754ca74 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -500,6 +500,7 @@ "../junit/src/org/chromium/android_webview/robolectric/AwLayoutSizerTest.java", "../junit/src/org/chromium/android_webview/robolectric/AwScrollOffsetManagerTest.java", "../junit/src/org/chromium/android_webview/robolectric/FindAddressTest.java", + "../junit/src/org/chromium/android_webview/robolectric/RectUtilsTest.java", "../junit/src/org/chromium/android_webview/robolectric/common/FlagOverrideHelperTest.java", "../junit/src/org/chromium/android_webview/robolectric/common/services/ServiceNamesTest.java", "../junit/src/org/chromium/android_webview/robolectric/metrics/AwNonembeddedUmaReplayerTest.java",
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 9e0586b3..e171c6c 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1725,6 +1725,7 @@ "//chromeos/components/quick_answers", "//chromeos/components/quick_answers/public/cpp:prefs", "//chromeos/ui/base", + "//chromeos/ui/frame", "//services/viz/public/mojom", # TODO(https://crbug.com/644336): Make CrasAudioHandler Chrome or Ash only. @@ -2325,6 +2326,7 @@ "//chromeos:test_support", "//chromeos/strings:strings_grit", "//chromeos/ui/base", + "//chromeos/ui/frame", "//chromeos/ui/vector_icons", # TODO(https://crbug.com/644336): Make CrasAudioHandler Chrome or Ash only.
diff --git a/ash/ambient/ambient_controller.cc b/ash/ambient/ambient_controller.cc index 7e95dfa..f1b739ac 100644 --- a/ash/ambient/ambient_controller.cc +++ b/ash/ambient/ambient_controller.cc
@@ -476,7 +476,8 @@ auto* session_controller = Shell::Get()->session_controller(); if (session_controller->CanLockScreen() && session_controller->ShouldLockScreenAutomatically()) { - if (!session_controller->IsScreenLocked()) { + if (!session_controller->IsScreenLocked() && + !delayed_lock_timer_.IsRunning()) { delayed_lock_timer_.Start( FROM_HERE, kLockScreenDelay, base::BindOnce([]() { Shell::Get()->session_controller()->LockScreen();
diff --git a/ash/ambient/ambient_controller_unittest.cc b/ash/ambient/ambient_controller_unittest.cc index df59f3ea..af04ea1 100644 --- a/ash/ambient/ambient_controller_unittest.cc +++ b/ash/ambient/ambient_controller_unittest.cc
@@ -502,6 +502,35 @@ } TEST_F(AmbientControllerTest, + ShouldShowAmbientScreenWithLockscreenWithNoisyPowerEvents) { + GetSessionControllerClient()->SetShouldLockScreenAutomatically(true); + SetPowerStateCharging(); + EXPECT_FALSE(ambient_controller()->IsShown()); + + // Should enter ambient mode when the screen is dimmed. + SetScreenIdleStateAndWait(/*dimmed=*/true, /*off=*/false); + EXPECT_FALSE(IsLocked()); + EXPECT_FALSE(ambient_controller()->IsShown()); + + FastForwardTiny(); + EXPECT_TRUE(ambient_controller()->IsShown()); + + FastForwardHalfLockScreenDelay(); + SetPowerStateCharging(); + + FastForwardHalfLockScreenDelay(); + SetPowerStateCharging(); + + EXPECT_TRUE(IsLocked()); + // Should not disrupt ongoing ambient mode. + EXPECT_TRUE(ambient_controller()->IsShown()); + + // Closes ambient for clean-up. + UnlockScreen(); + EXPECT_FALSE(ambient_controller()->IsShown()); +} + +TEST_F(AmbientControllerTest, ShouldShowAmbientScreenWithoutLockscreenWhenScreenIsDimmed) { GetSessionControllerClient()->SetShouldLockScreenAutomatically(true); // When power is discharging, we do not lock the screen with ambient
diff --git a/ash/ambient/test/ambient_ash_test_base.cc b/ash/ambient/test/ambient_ash_test_base.cc index 4d66fe3b..88b8e7e3 100644 --- a/ash/ambient/test/ambient_ash_test_base.cc +++ b/ash/ambient/test/ambient_ash_test_base.cc
@@ -291,6 +291,11 @@ task_environment()->FastForwardBy(kFastForwardFactor * kLockScreenDelay); } +void AmbientAshTestBase::FastForwardHalfLockScreenDelay() { + task_environment()->FastForwardBy(0.5 * kFastForwardFactor * + kLockScreenDelay); +} + void AmbientAshTestBase::SetPowerStateCharging() { power_manager::PowerSupplyProperties proto; proto.set_battery_state(
diff --git a/ash/ambient/test/ambient_ash_test_base.h b/ash/ambient/test/ambient_ash_test_base.h index 35a8e7b..2bb84a3 100644 --- a/ash/ambient/test/ambient_ash_test_base.h +++ b/ash/ambient/test/ambient_ash_test_base.h
@@ -105,6 +105,7 @@ // Advance the task environment timer to ambient mode lock screen delay. void FastForwardToLockScreen(); + void FastForwardHalfLockScreenDelay(); void SetPowerStateCharging(); void SetPowerStateDischarging();
diff --git a/ash/app_list/app_list_color_provider_impl.cc b/ash/app_list/app_list_color_provider_impl.cc index 0e6df00..9a382f1 100644 --- a/ash/app_list/app_list_color_provider_impl.cc +++ b/ash/app_list/app_list_color_provider_impl.cc
@@ -158,24 +158,19 @@ } SkColor AppListColorProviderImpl::GetSeparatorColor() const { - return ash_color_provider_->GetContentLayerColor( - AshColorProvider::ContentLayerType::kSeparatorColor); + return DeprecatedGetContentLayerColor( + AshColorProvider::ContentLayerType::kSeparatorColor, + SkColorSetA(gfx::kGoogleGrey900, 0x24)); } SkColor AppListColorProviderImpl::GetSearchResultViewInkDropColor() const { - AshColorProvider::RippleAttributes ripple_attributes = - ash_color_provider_->GetRippleAttributes( - GetSearchBoxCardBackgroundColor()); - return SkColorSetA(ripple_attributes.base_color, - ripple_attributes.inkdrop_opacity * 255); + return DeprecatedGetInkDropRippleColor( + SkColorSetA(gfx::kGoogleGrey900, 0x14)); } SkColor AppListColorProviderImpl::GetSearchResultViewHighlightColor() const { - AshColorProvider::RippleAttributes ripple_attributes = - ash_color_provider_->GetRippleAttributes( - GetSearchBoxCardBackgroundColor()); - return SkColorSetA(ripple_attributes.base_color, - ripple_attributes.highlight_opacity * 255); + return DeprecatedGetInkDropHighlightColor( + SkColorSetA(gfx::kGoogleGrey900, 0x12)); } float AppListColorProviderImpl::GetFolderBackgrounBlurSigma() const {
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc index c01c7e8..a31e748 100644 --- a/ash/app_list/app_list_controller_impl_unittest.cc +++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -651,6 +651,29 @@ EXPECT_FALSE(GetAppListView()->GetWidget()->GetNativeWindow()->IsVisible()); } +// Tests that swapping out an AppListModel (simulating a profile swap with +// multiprofile enabled) drops all references to previous folders (see +// https://crbug.com/1130901). +TEST_F(AppListControllerImplTest, SimulateProfileSwapNoCrashOnDestruct) { + // Add a folder, whose AppListItemList the AppListModel will observe. + const std::string folder_id("folder_1"); + auto folder = std::make_unique<AppListFolderItem>(folder_id); + AppListModel* model = Shell::Get()->app_list_controller()->GetModel(); + model->AddItem(std::move(folder)); + + for (int i = 0; i < 2; ++i) { + auto item = std::make_unique<AppListItem>(base::StringPrintf("app_%d", i)); + model->AddItemToFolder(std::move(item), folder_id); + } + + // Set a new model, simulating profile switching in multi-profile mode. This + // should cleanly drop the reference to the folder added earlier. + Shell::Get()->app_list_controller()->SetModelData( + /*profile_id=*/12, /*apps=*/{}, /*is_search_engine_google=*/false); + + // Test that there is no crash on ~AppListModel() when the test finishes. +} + class AppListControllerImplTestWithNotificationBadging : public AppListControllerImplTest { public:
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc index f8a80d7..e591c9f 100644 --- a/ash/app_list/app_list_presenter_delegate_unittest.cc +++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -142,12 +142,14 @@ } // namespace -class AppListPresenterDelegateZeroStateTest - : public AshTestBase, - public testing::WithParamInterface<bool> { +class AppListPresenterDelegateTest : public AshTestBase, + public testing::WithParamInterface<bool> { public: - AppListPresenterDelegateZeroStateTest() = default; - ~AppListPresenterDelegateZeroStateTest() override = default; + AppListPresenterDelegateTest() = default; + AppListPresenterDelegateTest(const AppListPresenterDelegateTest&) = delete; + AppListPresenterDelegateTest& operator=(const AppListPresenterDelegateTest&) = + delete; + ~AppListPresenterDelegateTest() override = default; // testing::Test: void SetUp() override { @@ -164,6 +166,12 @@ AppListView::SetShortAnimationForTesting(false); } + void SetAppListStateAndWait(AppListViewState new_state) { + GetAppListView()->SetState(new_state); + GetAppListTestHelper()->WaitUntilIdle(); + GetAppListTestHelper()->CheckState(new_state); + } + // Whether to run the test with mouse or gesture events. bool TestMouseEventParam() { return GetParam(); } @@ -265,34 +273,6 @@ ->GetWindowBoundsInScreen(); return dialog_bounds.y() - search_box_bounds.y(); } - - private: - DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateZeroStateTest); -}; - -class AppListPresenterDelegateTest - : public AppListPresenterDelegateZeroStateTest { - public: - AppListPresenterDelegateTest() { - // Zeros state changes expected UI behavior. Most test cases in this suite - // are the expected UI behavior with zero state being disabled. - // TODO(jennyz): Add new test cases for zero state, crbug.com/925195. - scoped_feature_list_.InitAndDisableFeature( - app_list_features::kEnableZeroStateSuggestions); - } - ~AppListPresenterDelegateTest() override = default; - - protected: - void SetAppListStateAndWait(AppListViewState new_state) { - GetAppListView()->SetState(new_state); - GetAppListTestHelper()->WaitUntilIdle(); - GetAppListTestHelper()->CheckState(new_state); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateTest); }; // Used to test app_list behavior with a populated apps_grid @@ -396,7 +376,7 @@ // Verifies that context menu click should not activate the search box // (see https://crbug.com/941428). -TEST_F(AppListPresenterDelegateZeroStateTest, RightClickSearchBoxInPeeking) { +TEST_F(AppListPresenterDelegateTest, RightClickSearchBoxInPeeking) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* app_list_view = GetAppListView(); gfx::Rect app_list_bounds = app_list_view->GetBoundsInScreen(); @@ -412,8 +392,7 @@ EXPECT_EQ(AppListViewState::kPeeking, app_list_view->app_list_state()); } -TEST_F(AppListPresenterDelegateZeroStateTest, - ReshownAppListResetsSearchBoxActivation) { +TEST_F(AppListPresenterDelegateTest, ReshownAppListResetsSearchBoxActivation) { // Activate the search box. GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetEventGenerator()->GestureTapAt(GetPointInsideSearchbox()); @@ -431,7 +410,7 @@ // Tests that the SearchBox activation is reset after the AppList is hidden with // no animation from FULLSCREEN_SEARCH. -TEST_F(AppListPresenterDelegateZeroStateTest, +TEST_F(AppListPresenterDelegateTest, SideShelfAppListResetsSearchBoxActivationOnClose) { // Set the shelf to one side, then show the AppList and activate the // searchbox. @@ -457,7 +436,7 @@ // Verifies that tapping on the search box in tablet mode with animation and // zero state enabled should not bring Chrome crash (https://crbug.com/958267). -TEST_F(AppListPresenterDelegateZeroStateTest, ClickSearchBoxInTabletMode) { +TEST_F(AppListPresenterDelegateTest, ClickSearchBoxInTabletMode) { EnableTabletMode(true); GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); @@ -485,8 +464,7 @@ GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); } -TEST_F(AppListPresenterDelegateZeroStateTest, - RemoveSuggestionShowsConfirmDialog) { +TEST_F(AppListPresenterDelegateTest, RemoveSuggestionShowsConfirmDialog) { ShowZeroStateSearchInHalfState(); // Add a zero state suggestion results - the result that will be tested is in @@ -564,7 +542,7 @@ EXPECT_EQ(expected_actions, invoked_actions); } -TEST_F(AppListPresenterDelegateZeroStateTest, RemoveSuggestionUsingLongTap) { +TEST_F(AppListPresenterDelegateTest, RemoveSuggestionUsingLongTap) { ShowZeroStateSearchInHalfState(); // Add a zero state suggestion results - the result that will be tested is in @@ -632,7 +610,7 @@ EXPECT_EQ(expected_actions, invoked_actions); } -TEST_F(AppListPresenterDelegateZeroStateTest, +TEST_F(AppListPresenterDelegateTest, RemoveSuggestionDialogAnimatesWithAppListView) { ShowZeroStateSearchInHalfState(); @@ -678,7 +656,7 @@ EXPECT_EQ(gfx::RectF(initial_dialog_bounds), current_bounds); } -TEST_F(AppListPresenterDelegateZeroStateTest, +TEST_F(AppListPresenterDelegateTest, RemoveSuggestionDialogBoundsUpdateWithAppListState) { ShowZeroStateSearchInHalfState(); @@ -717,7 +695,7 @@ GetSearchResultsAnchoredDialogTopOffset(confirmation_dialog)); } -TEST_F(AppListPresenterDelegateZeroStateTest, +TEST_F(AppListPresenterDelegateTest, TransitionToAppsContainerClosesRemoveSuggestionDialog) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetAppListView()->SetState(AppListViewState::kFullscreenAllApps); @@ -756,7 +734,7 @@ widget_close_waiter.Wait(); } -TEST_F(AppListPresenterDelegateZeroStateTest, +TEST_F(AppListPresenterDelegateTest, RemoveSuggestionDialogBoundsUpdateWhenVKHidden) { // Enable virtual keyboard for this test. KeyboardController* const keyboard_controller = @@ -1620,9 +1598,9 @@ GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenSearch); - // Delete the text in the searchbox, the app list should transition to - // fullscreen all apps. - generator->PressKey(ui::KeyboardCode::VKEY_BACK, 0); + // Pressing escape should transition the app list should to fullscreen all + // apps state. + generator->PressKey(ui::KeyboardCode::VKEY_ESCAPE, 0); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); } @@ -1641,9 +1619,13 @@ generator->PressKey(ui::KeyboardCode::VKEY_0, 0); GetAppListTestHelper()->CheckState(AppListViewState::kHalf); - // Empty the searchbox, this should transition the app list to it's previous - // state. + // Empty the searchbox - app list should remain in half state (and show zero + // state results). generator->PressKey(ui::KeyboardCode::VKEY_BACK, 0); + GetAppListTestHelper()->CheckState(AppListViewState::kHalf); + + // ESC should transition app list to the peeking state. + generator->PressKey(ui::KeyboardCode::VKEY_ESCAPE, 0); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); } @@ -1661,9 +1643,9 @@ GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenSearch); - // Delete the text in the searchbox, the app list should transition to - // fullscreen all apps. - generator->PressKey(ui::KeyboardCode::VKEY_BACK, 0); + // Pressing the escape key should transition the app list to the fullscreen + // all apps state. + generator->PressKey(ui::KeyboardCode::VKEY_ESCAPE, 0); GetAppListTestHelper()->WaitUntilIdle(); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); } @@ -1709,7 +1691,7 @@ // equivalent of the current state. EnableTabletMode(true); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenSearch); - generator->PressKey(ui::KeyboardCode::VKEY_BACK, 0); + generator->PressKey(ui::KeyboardCode::VKEY_ESCAPE, 0); GetAppListTestHelper()->CheckState(AppListViewState::kFullscreenAllApps); } @@ -2220,8 +2202,7 @@ GetAppListTestHelper()->CheckVisibility(false); } -// Tests that the search box is set active with a whitespace query and that the -// app list state doesn't transition with a whitespace query. +// Tests that the search box is set active with a whitespace query. TEST_F(AppListPresenterDelegateTest, WhitespaceQuery) { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); AppListView* view = GetAppListView(); @@ -2229,23 +2210,28 @@ EXPECT_FALSE(view->search_box_view()->is_search_box_active()); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); - // Enter a whitespace query, the searchbox should activate but stay in peeking - // mode. + // Enter a whitespace query, the searchbox should activate (in zero state). generator->PressKey(ui::VKEY_SPACE, 0); EXPECT_TRUE(view->search_box_view()->is_search_box_active()); - GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); - - // Enter a non-whitespace character, the Searchbox should stay active and go - // to HALF - generator->PressKey(ui::VKEY_0, 0); - EXPECT_TRUE(view->search_box_view()->is_search_box_active()); + EXPECT_TRUE(view->search_box_view()->IsSearchBoxTrimmedQueryEmpty()); GetAppListTestHelper()->CheckState(AppListViewState::kHalf); - // Delete the non whitespace character, the Searchbox should not deactivate - // but go to PEEKING + generator->PressKey(ui::VKEY_A, 0); + EXPECT_TRUE(view->search_box_view()->is_search_box_active()); + EXPECT_FALSE(view->search_box_view()->IsSearchBoxTrimmedQueryEmpty()); + GetAppListTestHelper()->CheckState(AppListViewState::kHalf); + + // Delete the non-whitespace character, the Searchbox should not deactivate. generator->PressKey(ui::VKEY_BACK, 0); EXPECT_TRUE(view->search_box_view()->is_search_box_active()); - GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); + EXPECT_TRUE(view->search_box_view()->IsSearchBoxTrimmedQueryEmpty()); + GetAppListTestHelper()->CheckState(AppListViewState::kHalf); + + // Delete the whitespace, the search box remains active, in zero state. + generator->PressKey(ui::VKEY_BACK, 0); + EXPECT_TRUE(view->search_box_view()->is_search_box_active()); + EXPECT_TRUE(view->search_box_view()->IsSearchBoxTrimmedQueryEmpty()); + GetAppListTestHelper()->CheckState(AppListViewState::kHalf); } // Tests that an unhandled two finger tap/right click does not close the app @@ -2703,7 +2689,7 @@ EXPECT_LE(0, view->GetWidget()->GetNativeView()->bounds().y()); // Animate to peeking. - generator->PressKey(ui::KeyboardCode::VKEY_BACK, 0); + generator->PressKey(ui::KeyboardCode::VKEY_ESCAPE, 0); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); EXPECT_LE(0, view->GetWidget()->GetNativeView()->bounds().y()); @@ -2730,7 +2716,7 @@ view->GetWidget()->GetNativeView()->bounds().y()); // Animate to peeking. - generator->PressKey(ui::KeyboardCode::VKEY_BACK, 0); + generator->PressKey(ui::KeyboardCode::VKEY_ESCAPE, 0); GetAppListTestHelper()->CheckState(AppListViewState::kPeeking); EXPECT_LE(GetPrimaryDisplay().work_area().y(), view->GetWidget()->GetNativeView()->bounds().y()); @@ -3538,6 +3524,10 @@ scoped_feature_list_.InitWithFeatures({features::kEnableBackgroundBlur}, {}); } + AppListPresenterDelegateHomeLauncherTest( + const AppListPresenterDelegateHomeLauncherTest&) = delete; + AppListPresenterDelegateHomeLauncherTest& operator=( + const AppListPresenterDelegateHomeLauncherTest&) = delete; ~AppListPresenterDelegateHomeLauncherTest() override = default; // testing::Test: @@ -3577,8 +3567,6 @@ private: base::test::ScopedFeatureList scoped_feature_list_; - - DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateHomeLauncherTest); }; // Verifies that mouse dragging AppListView is enabled. @@ -4383,16 +4371,16 @@ // Tests that involve the virtual keyboard. class AppListPresenterDelegateVirtualKeyboardTest - : public AppListPresenterDelegateZeroStateTest { + : public AppListPresenterDelegateTest { public: AppListPresenterDelegateVirtualKeyboardTest() = default; ~AppListPresenterDelegateVirtualKeyboardTest() override = default; - // AppListPresenterDelegateZeroStateTest: + // AppListPresenterDelegateTest: void SetUp() override { base::CommandLine::ForCurrentProcess()->AppendSwitch( keyboard::switches::kEnableVirtualKeyboard); - AppListPresenterDelegateZeroStateTest::SetUp(); + AppListPresenterDelegateTest::SetUp(); } // Performs mouse click or tap gesture on the provided point, depending on
diff --git a/ash/app_list/model/app_list_model.cc b/ash/app_list/model/app_list_model.cc index 7a895e8..fddd0fb 100644 --- a/ash/app_list/model/app_list_model.cc +++ b/ash/app_list/model/app_list_model.cc
@@ -302,6 +302,10 @@ const std::string id = item->id(); for (auto& observer : observers_) observer.OnAppListItemWillBeDeleted(item); + if (item->GetItemType() == AppListFolderItem::kItemType) { + item_list_scoped_observer_.Remove( + static_cast<AppListFolderItem*>(item)->item_list()); + } top_level_item_list_->DeleteItemAt(0); for (auto& observer : observers_) observer.OnAppListItemDeleted(id);
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc index 8b82834..27f53fdd 100644 --- a/ash/app_list/views/app_list_item_view.cc +++ b/ash/app_list/views/app_list_item_view.cc
@@ -308,14 +308,9 @@ AppListItemView::AppListItemView(AppsGridView* apps_grid_view, AppListItem* item, - AppListViewDelegate* delegate) - : AppListItemView(apps_grid_view, item, delegate, item->IsInFolder()) {} - -AppListItemView::AppListItemView(AppsGridView* apps_grid_view, - AppListItem* item, AppListViewDelegate* delegate, bool is_in_folder) - : Button(apps_grid_view), + : Button(), is_folder_(item->GetItemType() == AppListFolderItem::kItemType), item_weak_(item), delegate_(delegate),
diff --git a/ash/app_list/views/app_list_item_view.h b/ash/app_list/views/app_list_item_view.h index 9dcc3650..77f2ef2 100644 --- a/ash/app_list/views/app_list_item_view.h +++ b/ash/app_list/views/app_list_item_view.h
@@ -47,9 +47,6 @@ AppListItemView(AppsGridView* apps_grid_view, AppListItem* item, - AppListViewDelegate* delegate); - AppListItemView(AppsGridView* apps_grid_view, - AppListItem* item, AppListViewDelegate* delegate, bool is_in_folder); ~AppListItemView() override;
diff --git a/ash/app_list/views/app_list_main_view.cc b/ash/app_list/views/app_list_main_view.cc index 1760538..e5d327e7 100644 --- a/ash/app_list/views/app_list_main_view.cc +++ b/ash/app_list/views/app_list_main_view.cc
@@ -6,6 +6,7 @@ #include <algorithm> #include <memory> +#include <utility> #include "ash/app_list/app_list_metrics.h" #include "ash/app_list/app_list_view_delegate.h" @@ -185,18 +186,13 @@ base::string16 raw_query = search_model_->search_box()->text(); base::string16 query; base::TrimWhitespace(raw_query, base::TRIM_ALL, &query); - bool should_show_search = - app_list_features::IsZeroStateSuggestionsEnabled() - ? search_box_view_->is_search_box_active() || !query.empty() - : !query.empty(); - contents_view_->ShowSearchResults(should_show_search); + contents_view_->ShowSearchResults(search_box_view_->is_search_box_active() || + !query.empty()); delegate_->StartSearch(raw_query); } void AppListMainView::ActiveChanged(SearchBoxViewBase* sender) { - if (!app_list_features::IsZeroStateSuggestionsEnabled()) - return; // Do not update views on closing. if (app_list_view_->app_list_state() == AppListViewState::kClosed) return;
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc index 6cccc64..37dbbf4 100644 --- a/ash/app_list/views/app_list_view.cc +++ b/ash/app_list/views/app_list_view.cc
@@ -1769,40 +1769,21 @@ bool triggered_by_contents_change) { switch (app_list_state_) { case AppListViewState::kPeeking: - if (app_list_features::IsZeroStateSuggestionsEnabled()) { - if (!search_box_is_empty || search_box_view()->is_search_box_active()) - SetState(AppListViewState::kHalf); - } else { - if (!search_box_is_empty) - SetState(AppListViewState::kHalf); - } + if (!search_box_is_empty || search_box_view()->is_search_box_active()) + SetState(AppListViewState::kHalf); break; case AppListViewState::kHalf: - if (app_list_features::IsZeroStateSuggestionsEnabled()) { - if (search_box_is_empty && !triggered_by_contents_change) - SetState(AppListViewState::kPeeking); - } else { - if (search_box_is_empty) - SetState(AppListViewState::kPeeking); - } + if (search_box_is_empty && !triggered_by_contents_change) + SetState(AppListViewState::kPeeking); break; case AppListViewState::kFullscreenSearch: - if (app_list_features::IsZeroStateSuggestionsEnabled()) { - if (search_box_is_empty && !triggered_by_contents_change) - SetState(AppListViewState::kFullscreenAllApps); - } else { - if (search_box_is_empty) - SetState(AppListViewState::kFullscreenAllApps); - } + if (search_box_is_empty && !triggered_by_contents_change) + SetState(AppListViewState::kFullscreenAllApps); break; case AppListViewState::kFullscreenAllApps: - if (app_list_features::IsZeroStateSuggestionsEnabled()) { - if (!search_box_is_empty || - (search_box_is_empty && triggered_by_contents_change)) - SetState(AppListViewState::kFullscreenSearch); - } else { - if (!search_box_is_empty) - SetState(AppListViewState::kFullscreenSearch); + if (!search_box_is_empty || + (search_box_is_empty && triggered_by_contents_change)) { + SetState(AppListViewState::kFullscreenSearch); } break; case AppListViewState::kClosed:
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc index 1e40804..bf6426b 100644 --- a/ash/app_list/views/app_list_view_unittest.cc +++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -1291,48 +1291,31 @@ } // Tests that key event which is not handled by focused view will be redirected -// to search box. +// to search box when search box view is active (but not focused). TEST_F(AppListViewFocusTest, RedirectFocusToSearchBox) { - // UI behavior is different with Zero State enabled. This test is - // the expected UI behavior with zero state feature being disabled. - // TODO(jennyz): Add new test case for UI behavior for zero state. - // crbug.com/925195. - scoped_feature_list_.InitAndDisableFeature( - app_list_features::kEnableZeroStateSuggestions); - EXPECT_FALSE(app_list_features::IsZeroStateSuggestionsEnabled()); - Show(); // Set focus to first suggestion app and type a character. GetAllSuggestions()[0]->RequestFocus(); - SimulateKeyPress(ui::VKEY_SPACE, false); - EXPECT_EQ(search_box_view()->search_box(), focused_view()); - EXPECT_EQ(search_box_view()->search_box()->GetText(), base::UTF8ToUTF16(" ")); - EXPECT_FALSE(search_box_view()->search_box()->HasSelection()); - - // UI and Focus behavior is different with Zero State enabled. - // Set focus to expand arrow and type a character. - expand_arrow_view()->RequestFocus(); SimulateKeyPress(ui::VKEY_A, false); EXPECT_EQ(search_box_view()->search_box(), focused_view()); - EXPECT_EQ(search_box_view()->search_box()->GetText(), - base::UTF8ToUTF16(" a")); + EXPECT_EQ(search_box_view()->search_box()->GetText(), base::UTF8ToUTF16("a")); EXPECT_FALSE(search_box_view()->search_box()->HasSelection()); // Set focus to close button and type a character. search_box_view()->close_button()->RequestFocus(); + EXPECT_NE(search_box_view()->search_box(), focused_view()); SimulateKeyPress(ui::VKEY_B, false); EXPECT_EQ(search_box_view()->search_box(), focused_view()); EXPECT_EQ(search_box_view()->search_box()->GetText(), - base::UTF8ToUTF16(" ab")); + base::UTF8ToUTF16("ab")); EXPECT_FALSE(search_box_view()->search_box()->HasSelection()); // Set focus to close button and hitting backspace. search_box_view()->close_button()->RequestFocus(); SimulateKeyPress(ui::VKEY_BACK, false); EXPECT_EQ(search_box_view()->search_box(), focused_view()); - EXPECT_EQ(search_box_view()->search_box()->GetText(), - base::UTF8ToUTF16(" a")); + EXPECT_EQ(search_box_view()->search_box()->GetText(), base::UTF8ToUTF16("a")); EXPECT_FALSE(search_box_view()->search_box()->HasSelection()); }
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc index 5a456b9..ed6877bd 100644 --- a/ash/app_list/views/apps_grid_view.cc +++ b/ash/app_list/views/apps_grid_view.cc
@@ -397,8 +397,7 @@ AppsGridViewFolderDelegate* folder_delegate) : folder_delegate_(folder_delegate), contents_view_(contents_view), - page_flip_delay_in_ms_(kPageFlipDelayInMsFullscreen), - view_structure_(this) { + page_flip_delay_in_ms_(kPageFlipDelayInMsFullscreen) { DCHECK(contents_view_); SetPaintToLayer(ui::LAYER_NOT_DRAWN); // Clip any icons that are outside the grid view's bounds. These icons would @@ -944,10 +943,7 @@ // Create a new AppListItemView to duplicate the original_drag_view in the // folder's grid view. - auto view = std::make_unique<AppListItemView>( - this, original_drag_view->item(), - contents_view_->GetAppListMainView()->view_delegate(), - false /* is_in_folder */); + auto view = CreateViewForItem(original_drag_view->item()); items_need_layer_for_drag_ = true; auto* view_ptr = items_container_->AddChildView(std::move(view)); for (const auto& entry : view_model_.entries()) @@ -1389,15 +1385,25 @@ } } +std::unique_ptr<AppListItemView> AppsGridView::CreateViewForItem( + AppListItem* item, + bool is_in_folder) { + std::unique_ptr<AppListItemView> view = std::make_unique<AppListItemView>( + this, item, contents_view_->GetAppListMainView()->view_delegate(), + is_in_folder); + view->set_callback(base::BindRepeating( + &AppsGridView::OnAppListItemViewPressed, base::Unretained(this), + base::Unretained(view.get()))); + return view; +} + std::unique_ptr<AppListItemView> AppsGridView::CreateViewForItemAtIndex( size_t index) { // The |drag_view_| might be pending for deletion, therefore |view_model_| // may have one more item than |item_list_|. DCHECK_LE(index, item_list_->item_count()); - std::unique_ptr<AppListItemView> view = std::make_unique<AppListItemView>( - this, item_list_->item_at(index), - contents_view_->GetAppListMainView()->view_delegate()); - return view; + auto* item = item_list_->item_at(index); + return CreateViewForItem(item, item->IsInFolder()); } bool AppsGridView::HandleScroll(const gfx::Vector2d& offset, @@ -2206,15 +2212,10 @@ DCHECK(!folder_delegate_); DCHECK(activated_folder_item_view_); - auto reparented_view_in_root_grid = std::make_unique<AppListItemView>( - this, reparented_view->item(), - contents_view_->GetAppListMainView()->view_delegate(), - false /* is_in_folder */); - - auto* reparented_view_in_root_grid_ptr = - items_container_->AddChildView(std::move(reparented_view_in_root_grid)); - view_model_.Add(reparented_view_in_root_grid_ptr, view_model_.view_size()); - view_structure_.Add(reparented_view_in_root_grid_ptr, GetLastTargetIndex()); + auto* reparented_view_in_root_grid = items_container_->AddChildView( + CreateViewForItem(reparented_view->item())); + view_model_.Add(reparented_view_in_root_grid, view_model_.view_size()); + view_structure_.Add(reparented_view_in_root_grid, GetLastTargetIndex()); // Set |activated_folder_item_view_| selected so |target_index| will be // computed relative to the open folder. @@ -2222,7 +2223,7 @@ const GridIndex target_index = GetTargetGridIndexForKeyboardReparent(key_code); AnnounceReorder(target_index); - ReparentItemForReorder(reparented_view_in_root_grid_ptr, target_index); + ReparentItemForReorder(reparented_view_in_root_grid, target_index); GetViewAtIndex(target_index)->RequestFocus(); Layout(); @@ -2891,14 +2892,11 @@ point_in_parent.y() < kBottomDragBufferMax; } -void AppsGridView::ButtonPressed(views::Button* sender, - const ui::Event& event) { +void AppsGridView::OnAppListItemViewPressed(AppListItemView* pressed_item_view, + const ui::Event& event) { if (dragging()) return; - if (strcmp(sender->GetClassName(), AppListItemView::kViewClassName)) - return; - if (contents_view_->apps_container_view() ->app_list_folder_view() ->IsAnimationRunning()) { @@ -2909,7 +2907,6 @@ // prevents a case where the item would remain hidden due the // |activated_folder_item_view_| changing during the animation. We only // need to track |activated_folder_item_view_| in the root level grid view. - AppListItemView* pressed_item_view = static_cast<AppListItemView*>(sender); if (!folder_delegate_) { if (activated_folder_item_view_) activated_folder_item_view_->SetVisible(true);
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h index 844a370..0dfc9d1 100644 --- a/ash/app_list/views/apps_grid_view.h +++ b/ash/app_list/views/apps_grid_view.h
@@ -34,15 +34,10 @@ #include "ui/gfx/image/image_skia_operations.h" #include "ui/views/animation/bounds_animator.h" #include "ui/views/animation/bounds_animator_observer.h" -#include "ui/views/controls/button/button.h" #include "ui/views/controls/image_view.h" #include "ui/views/view.h" #include "ui/views/view_model.h" -namespace views { -class ButtonListener; -} - namespace ash { namespace test { @@ -52,6 +47,7 @@ class ApplicationDragAndDropHost; class AppListConfig; +class AppListItem; class AppListItemView; class AppsGridViewFolderDelegate; class ContentsView; @@ -61,7 +57,7 @@ // Represents the index to an item view in the grid. struct APP_LIST_EXPORT GridIndex { - GridIndex() : page(-1), slot(-1) {} + GridIndex() = default; GridIndex(int page, int slot) : page(page), slot(slot) {} bool operator==(const GridIndex& other) const { @@ -75,13 +71,12 @@ } std::string ToString() const; - int page; // Which page an item view is on. - int slot; // Which slot in the page an item view is in. + int page = -1; // Which page an item view is on. + int slot = -1; // Which slot in the page an item view is in. }; // AppsGridView displays a grid for AppListItemList sub model. class APP_LIST_EXPORT AppsGridView : public views::View, - public views::ButtonListener, public AppListItemListObserver, public PaginationModelObserver, public AppListModelObserver, @@ -385,6 +380,9 @@ // number of apps. void UpdatePulsingBlockViews(); + std::unique_ptr<AppListItemView> CreateViewForItem(AppListItem* item, + bool is_in_folder = false); + std::unique_ptr<AppListItemView> CreateViewForItemAtIndex(size_t index); // Returns true if the event was handled by the pagination controller. @@ -512,8 +510,9 @@ // shelf. bool IsPointWithinBottomDragBuffer(const gfx::Point& point) const; - // Overridden from views::ButtonListener: - void ButtonPressed(views::Button* sender, const ui::Event& event) override; + // AppListItemView pressed callback binds here: + void OnAppListItemViewPressed(AppListItemView* pressed_item_view, + const ui::Event& event); // Overridden from AppListItemListObserver: void OnListItemAdded(size_t index, AppListItem* item) override; @@ -874,7 +873,7 @@ bool is_end_gesture_ = false; // view structure used only for non-folder. - PagedViewStructure view_structure_; + PagedViewStructure view_structure_{this}; // True if an extra page is opened after the user drags an app to the bottom // of last page with intention to put it in a new page. This is only used for
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc index ae975a0d..3422b53 100644 --- a/ash/app_list/views/apps_grid_view_unittest.cc +++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -44,7 +44,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/icu_test_util.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/window.h"
diff --git a/ash/app_list/views/expand_arrow_view.cc b/ash/app_list/views/expand_arrow_view.cc index 59deca2..6a0f0674 100644 --- a/ash/app_list/views/expand_arrow_view.cc +++ b/ash/app_list/views/expand_arrow_view.cc
@@ -129,7 +129,8 @@ ExpandArrowView::ExpandArrowView(ContentsView* contents_view, AppListView* app_list_view) - : views::Button(this), + : views::Button(base::BindRepeating(&ExpandArrowView::OnButtonPressed, + base::Unretained(this))), contents_view_(contents_view), app_list_view_(app_list_view) { SetFocusBehavior(FocusBehavior::ALWAYS); @@ -244,14 +245,6 @@ canvas->DrawPath(arrow_path, arrow_flags); } -void ExpandArrowView::ButtonPressed(views::Button* /*sender*/, - const ui::Event& /*event*/) { - button_pressed_ = true; - ResetHintingAnimation(); - TransitToFullscreenAllAppsState(); - GetInkDrop()->AnimateToState(views::InkDropState::ACTION_TRIGGERED); -} - gfx::Size ExpandArrowView::CalculatePreferredSize() const { return gfx::Size(kTileWidth, AppListConfig::instance().expand_arrow_tile_height()); @@ -373,6 +366,13 @@ ScheduleHintingAnimation(false); } +void ExpandArrowView::OnButtonPressed() { + button_pressed_ = true; + ResetHintingAnimation(); + TransitToFullscreenAllAppsState(); + GetInkDrop()->AnimateToState(views::InkDropState::ACTION_TRIGGERED); +} + void ExpandArrowView::TransitToFullscreenAllAppsState() { UMA_HISTOGRAM_ENUMERATION(kPageOpenedHistogram, AppListState::kStateApps, AppListState::kStateLast);
diff --git a/ash/app_list/views/expand_arrow_view.h b/ash/app_list/views/expand_arrow_view.h index 3c5b3c6..9d2f276 100644 --- a/ash/app_list/views/expand_arrow_view.h +++ b/ash/app_list/views/expand_arrow_view.h
@@ -29,7 +29,6 @@ // A tile item for the expand arrow on the start page. class APP_LIST_EXPORT ExpandArrowView : public views::Button, - public views::ButtonListener, public views::ViewTargeterDelegate { public: ExpandArrowView(ContentsView* contents_view, AppListView* app_list_view); @@ -38,9 +37,6 @@ // views::Button: void PaintButtonContents(gfx::Canvas* canvas) override; - // views::ButtonListener: - void ButtonPressed(views::Button* sender, const ui::Event& event) override; - // views::View: gfx::Size CalculatePreferredSize() const override; bool OnKeyPressed(const ui::KeyEvent& event) override; @@ -68,6 +64,8 @@ void AnimationProgressed(const gfx::Animation* animation) override; void AnimationEnded(const gfx::Animation* animation) override; + void OnButtonPressed(); + void TransitToFullscreenAllAppsState(); // Schedule a hinting animation. |is_first_time| indicates whether the
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc index f4c3567..16872ad 100644 --- a/ash/app_list/views/search_box_view.cc +++ b/ash/app_list/views/search_box_view.cc
@@ -101,8 +101,7 @@ void SearchBoxView::Init(bool is_tablet_mode) { is_tablet_mode_ = is_tablet_mode; - if (app_list_features::IsZeroStateSuggestionsEnabled()) - set_show_close_button_when_active(true); + set_show_close_button_when_active(true); SearchBoxViewBase::Init(); UpdatePlaceholderTextAndAccessibleName(); current_query_ = search_box()->GetText();
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc index 75f8e5b..63111965c 100644 --- a/ash/app_list/views/search_box_view_unittest.cc +++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -201,16 +201,11 @@ EXPECT_TRUE(view()->close_button()->GetVisible()); } -// Tests that the close button is still invisible after the search box is -// activated. -TEST_F(SearchBoxViewTest, CloseButtonInvisibleAfterSearchBoxActived) { +// Tests that the close button is still visible after the search box is +// activated (in zero state). +TEST_F(SearchBoxViewTest, CloseButtonIVisibleInZeroStateSearchBox) { SetSearchBoxActive(true, ui::ET_MOUSE_PRESSED); - - // UI behavior is different with Zero State enabled. - if (app_list_features::IsZeroStateSuggestionsEnabled()) - EXPECT_TRUE(view()->close_button()->GetVisible()); - else - EXPECT_FALSE(view()->close_button()->GetVisible()); + EXPECT_TRUE(view()->close_button()->GetVisible()); } // Tests that the close button becomes invisible after close button is clicked. @@ -823,17 +818,6 @@ EXPECT_TRUE(view()->assistant_button()->GetVisible()); } -// Tests that the assistant button is visible after the search box is activated. -TEST_F(SearchBoxViewAssistantButtonTest, - AssistantButtonVisibleAfterSearchBoxActived) { - // Assistant button is not showing up under zero state for now. - // TODO(jennyz): Make assistant button show up under zero state. - if (!app_list_features::IsZeroStateSuggestionsEnabled()) { - SetSearchBoxActive(true, ui::ET_MOUSE_PRESSED); - EXPECT_TRUE(view()->assistant_button()->GetVisible()); - } -} - // Tests that the assistant button is invisible after typing in the search box, // and comes back when search box is empty. TEST_F(SearchBoxViewAssistantButtonTest, @@ -841,12 +825,9 @@ KeyPress(ui::VKEY_A); EXPECT_FALSE(view()->assistant_button()->GetVisible()); - // Assistant button is not showing up under zero state for now. - // TODO(crbug.com/925455): Make assistant button show up under zero state. - if (!app_list_features::IsZeroStateSuggestionsEnabled()) { - KeyPress(ui::VKEY_BACK); - EXPECT_TRUE(view()->assistant_button()->GetVisible()); - } + // Assistant button is not showing up under zero state. + KeyPress(ui::VKEY_BACK); + EXPECT_FALSE(view()->assistant_button()->GetVisible()); } class SearchBoxViewAutocompleteTest
diff --git a/ash/app_list/views/search_result_page_view_unittest.cc b/ash/app_list/views/search_result_page_view_unittest.cc index 05a8ca5..443e148 100644 --- a/ash/app_list/views/search_result_page_view_unittest.cc +++ b/ash/app_list/views/search_result_page_view_unittest.cc
@@ -20,7 +20,6 @@ #include "ash/public/cpp/app_list/app_list_features.h" #include "base/macros.h" #include "base/memory/ptr_util.h" -#include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/window.h" #include "ui/views/test/views_test_base.h" @@ -37,15 +36,6 @@ void SetUp() override { views::ViewsTestBase::SetUp(); - // Setting up the feature set. - // Zero State will affect the UI behavior significantly. This test works - // if zero state feature is disabled. - // TODO(crbug.com/925195): Add different test suites for zero state. - scoped_feature_list_.InitWithFeatures( - {}, {app_list_features::kEnableZeroStateSuggestions}); - - ASSERT_FALSE(app_list_features::IsZeroStateSuggestionsEnabled()); - // Setting up views. delegate_ = std::make_unique<AppListTestViewDelegate>(); app_list_view_ = new AppListView(delegate_.get()); @@ -83,7 +73,6 @@ nullptr; // Owned by views hierarchy. SearchResultListView* list_view_ = nullptr; // Owned by views hierarchy. std::unique_ptr<AppListTestViewDelegate> delegate_; - base::test::ScopedFeatureList scoped_feature_list_; DISALLOW_COPY_AND_ASSIGN(SearchResultPageViewTest); };
diff --git a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc index 53d9e8d..7502af4 100644 --- a/ash/app_list/views/search_result_tile_item_list_view_unittest.cc +++ b/ash/app_list/views/search_result_tile_item_list_view_unittest.cc
@@ -58,24 +58,9 @@ protected: void CreateSearchResultTileItemListView() { - std::vector<base::Feature> enabled_features, disabled_features; - // Zero State affects the UI behavior significantly. This test tests the - // UI behavior with zero state being disable. - // TODO(crbug.com/925195): Write new test cases for zero state. - if (IsReinstallAppRecommendationEnabled()) { - enabled_features.push_back( - app_list_features::kEnableAppReinstallZeroState); - } else { - disabled_features.push_back( - app_list_features::kEnableAppReinstallZeroState); - } - - disabled_features.push_back(app_list_features::kEnableZeroStateSuggestions); - - scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); - - ASSERT_EQ(IsReinstallAppRecommendationEnabled(), - app_list_features::IsAppReinstallZeroStateEnabled()); + scoped_feature_list_.InitWithFeatureState( + app_list_features::kEnableAppReinstallZeroState, + IsReinstallAppRecommendationEnabled()); // Sets up the views. textfield_ = std::make_unique<views::Textfield>();
diff --git a/ash/assistant/assistant_web_view_delegate_impl.cc b/ash/assistant/assistant_web_view_delegate_impl.cc index b739f5c..f91255f 100644 --- a/ash/assistant/assistant_web_view_delegate_impl.cc +++ b/ash/assistant/assistant_web_view_delegate_impl.cc
@@ -5,7 +5,7 @@ #include "ash/assistant/assistant_web_view_delegate_impl.h" #include "ash/frame/non_client_frame_view_ash.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" #include "ui/views/widget/widget.h" #include "ui/views/window/caption_button_types.h" #include "ui/views/window/non_client_view.h" @@ -14,7 +14,8 @@ namespace { -class AssistantWebContainerCaptionButtonModel : public CaptionButtonModel { +class AssistantWebContainerCaptionButtonModel + : public chromeos::CaptionButtonModel { public: AssistantWebContainerCaptionButtonModel() = default; ~AssistantWebContainerCaptionButtonModel() override = default;
diff --git a/ash/assistant/ui/assistant_web_container_view_unittest.cc b/ash/assistant/ui/assistant_web_container_view_unittest.cc index fe959a4..dd081d6 100644 --- a/ash/assistant/ui/assistant_web_container_view_unittest.cc +++ b/ash/assistant/ui/assistant_web_container_view_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/shell.h" #include "base/macros.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "ui/events/test/event_generator.h" namespace ash {
diff --git a/ash/autoclick/autoclick_unittest.cc b/ash/autoclick/autoclick_unittest.cc index cb5a69f..dba068c 100644 --- a/ash/autoclick/autoclick_unittest.cc +++ b/ash/autoclick/autoclick_unittest.cc
@@ -18,7 +18,6 @@ #include "ash/wm/window_state.h" #include "ash/wm/wm_event.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h"
diff --git a/ash/display/display_alignment_indicator_unittest.cc b/ash/display/display_alignment_indicator_unittest.cc index 2f6b583..dffe42d 100644 --- a/ash/display/display_alignment_indicator_unittest.cc +++ b/ash/display/display_alignment_indicator_unittest.cc
@@ -8,7 +8,6 @@ #include "ash/public/cpp/shell_window_ids.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" -#include "base/test/scoped_feature_list.h" #include "ui/display/manager/display_manager.h" #include "ui/views/widget/widget.h"
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 5a3e9e0..8419c3d 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -33,7 +33,6 @@ #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h"
diff --git a/ash/display/root_window_transformers_unittest.cc b/ash/display/root_window_transformers_unittest.cc index 2bfa3c1..4cad7fc1 100644 --- a/ash/display/root_window_transformers_unittest.cc +++ b/ash/display/root_window_transformers_unittest.cc
@@ -17,7 +17,6 @@ #include "ash/wm/cursor_manager_test_api.h" #include "base/command_line.h" #include "base/synchronization/waitable_event.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/env.h" #include "ui/aura/window_event_dispatcher.h" #include "ui/aura/window_tracker.h"
diff --git a/ash/display/screen_position_controller_unittest.cc b/ash/display/screen_position_controller_unittest.cc index 11d2371..11bac47 100644 --- a/ash/display/screen_position_controller_unittest.cc +++ b/ash/display/screen_position_controller_unittest.cc
@@ -13,7 +13,6 @@ #include "ash/test/ash_test_base.h" #include "ash/window_factory.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/env.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window_tracker.h"
diff --git a/ash/display/window_tree_host_manager_unittest.cc b/ash/display/window_tree_host_manager_unittest.cc index 91c660df0..c91454c 100644 --- a/ash/display/window_tree_host_manager_unittest.cc +++ b/ash/display/window_tree_host_manager_unittest.cc
@@ -20,7 +20,6 @@ #include "ash/wm/wm_event.h" #include "base/command_line.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/client/focus_change_observer.h" #include "ui/aura/client/focus_client.h" #include "ui/aura/env.h"
diff --git a/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc b/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc index 6260158..2b4b70f0 100644 --- a/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc +++ b/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" @@ -18,6 +18,8 @@ namespace ash { +using ::chromeos::FrameCaptionButtonContainerView; + class FrameCaptionButtonContainerViewTest : public AshTestBase { public: enum MaximizeAllowed { MAXIMIZE_ALLOWED, MAXIMIZE_DISALLOWED }; @@ -212,7 +214,7 @@ // Test that the close button is not visible when // |ShouldShowCloseButton()| returns false. TEST_F(FrameCaptionButtonContainerViewTest, ShouldShowCloseButtonFalse) { - FrameCaptionButtonContainerView container(CreateTestWidget( + chromeos::FrameCaptionButtonContainerView container(CreateTestWidget( MAXIMIZE_ALLOWED, MINIMIZE_ALLOWED, CLOSE_BUTTON_NOT_VISIBLE)); InitContainer(&container); container.Layout();
diff --git a/ash/frame/caption_buttons/frame_size_button_unittest.cc b/ash/frame/caption_buttons/frame_size_button_unittest.cc index 6f943f4a..b787a53 100644 --- a/ash/frame/caption_buttons/frame_size_button_unittest.cc +++ b/ash/frame/caption_buttons/frame_size_button_unittest.cc
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/frame_size_button.h" +#include "chromeos/ui/frame/caption_buttons/frame_size_button.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/wm/window_state.h" #include "base/i18n/rtl.h" #include "base/run_loop.h" #include "chromeos/ui/base/window_properties.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "ui/aura/window.h" #include "ui/display/display.h" @@ -27,6 +27,8 @@ namespace { +using ::chromeos::FrameCaptionButtonContainerView; +using ::chromeos::FrameSizeButton; using ::chromeos::WindowStateType; class TestWidgetDelegate : public views::WidgetDelegateView {
diff --git a/ash/frame/default_frame_header_unittest.cc b/ash/frame/default_frame_header_unittest.cc index f41b4fb5..83b8dc2 100644 --- a/ash/frame/default_frame_header_unittest.cc +++ b/ash/frame/default_frame_header_unittest.cc
@@ -7,8 +7,6 @@ #include <memory> #include "ash/frame/non_client_frame_view_ash.h" -#include "ash/public/cpp/caption_buttons/frame_back_button.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/shell_window_ids.h" #include "ash/public/cpp/window_properties.h" #include "ash/test/ash_test_base.h" @@ -16,6 +14,8 @@ #include "base/i18n/rtl.h" #include "base/stl_util.h" #include "base/test/icu_test_util.h" +#include "chromeos/ui/frame/caption_buttons/frame_back_button.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "ui/aura/window.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/gfx/animation/animation_test_api.h" @@ -25,6 +25,8 @@ #include "ui/views/window/non_client_view.h" #include "ui/wm/core/window_util.h" +using chromeos::FrameBackButton; +using chromeos::FrameCaptionButtonContainerView; using views::NonClientFrameView; using views::Widget;
diff --git a/ash/frame/header_view.cc b/ash/frame/header_view.cc index 9a62b54b..f265c9fe 100644 --- a/ash/frame/header_view.cc +++ b/ash/frame/header_view.cc
@@ -6,15 +6,15 @@ #include <memory> -#include "ash/public/cpp/caption_buttons/caption_button_model.h" -#include "ash/public/cpp/caption_buttons/frame_back_button.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/window_properties.h" #include "ash/shell.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/window_state.h" #include "base/auto_reset.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/frame_back_button.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "ui/aura/client/aura_constants.h" #include "ui/base/ui_base_features.h" #include "ui/views/controls/image_view.h" @@ -57,8 +57,9 @@ header_content_view_ = AddChildView(std::make_unique<HeaderContentView>(this)); - caption_button_container_ = AddChildView( - std::make_unique<FrameCaptionButtonContainerView>(target_widget_)); + caption_button_container_ = + AddChildView(std::make_unique<chromeos::FrameCaptionButtonContainerView>( + target_widget_)); caption_button_container_->UpdateCaptionButtonState(false /*=animate*/); aura::Window* window = target_widget->GetNativeWindow(); @@ -304,7 +305,7 @@ views::FrameCaptionButton* back_button = frame_header_->GetBackButton(); if (has_back_button) { if (!back_button) { - back_button = new FrameBackButton(); + back_button = new chromeos::FrameBackButton(); AddChildView(back_button); frame_header_->SetBackButton(back_button); }
diff --git a/ash/frame/header_view.h b/ash/frame/header_view.h index 35707b55..b15321f 100644 --- a/ash/frame/header_view.h +++ b/ash/frame/header_view.h
@@ -20,6 +20,10 @@ #include "ui/base/ui_base_types.h" #include "ui/views/view.h" +namespace chromeos { +class FrameCaptionButtonContainerView; +} + namespace gfx { class ImageSkia; } @@ -34,7 +38,6 @@ namespace ash { class DefaultFrameHeader; -class FrameCaptionButtonContainerView; enum class FrameBackButtonState; // View which paints the frame header (title, caption buttons...). It slides off @@ -98,7 +101,7 @@ intptr_t old) override; void OnWindowDestroying(aura::Window* window) override; - FrameCaptionButtonContainerView* caption_button_container() { + chromeos::FrameCaptionButtonContainerView* caption_button_container() { return caption_button_container_; } @@ -151,7 +154,8 @@ HeaderContentView* header_content_view_ = nullptr; // View which contains the window caption buttons. - FrameCaptionButtonContainerView* caption_button_container_ = nullptr; + chromeos::FrameCaptionButtonContainerView* caption_button_container_ = + nullptr; // The fraction of the header's height which is visible while in fullscreen. // This value is meaningless when not in fullscreen.
diff --git a/ash/frame/non_client_frame_view_ash.cc b/ash/frame/non_client_frame_view_ash.cc index 3485a40..553fc8f 100644 --- a/ash/frame/non_client_frame_view_ash.cc +++ b/ash/frame/non_client_frame_view_ash.cc
@@ -10,7 +10,6 @@ #include "ash/frame/header_view.h" #include "ash/public/cpp/ash_constants.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/frame_utils.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller.h" @@ -24,6 +23,7 @@ #include "ash/wm/window_state_observer.h" #include "ash/wm/window_util.h" #include "base/bind.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" @@ -257,7 +257,7 @@ } void NonClientFrameViewAsh::SetCaptionButtonModel( - std::unique_ptr<CaptionButtonModel> model) { + std::unique_ptr<chromeos::CaptionButtonModel> model) { header_view_->caption_button_container()->SetModel(std::move(model)); header_view_->UpdateCaptionButtons(); } @@ -406,7 +406,7 @@ return false; } -FrameCaptionButtonContainerView* +chromeos::FrameCaptionButtonContainerView* NonClientFrameViewAsh::GetFrameCaptionButtonContainerViewForTest() { return header_view_->caption_button_container(); }
diff --git a/ash/frame/non_client_frame_view_ash.h b/ash/frame/non_client_frame_view_ash.h index 16dab591..4f549f5 100644 --- a/ash/frame/non_client_frame_view_ash.h +++ b/ash/frame/non_client_frame_view_ash.h
@@ -17,13 +17,16 @@ #include "ui/views/widget/widget.h" #include "ui/views/window/non_client_view.h" +namespace chromeos { +class FrameCaptionButtonContainerView; +} + namespace views { class Widget; } namespace ash { -class FrameCaptionButtonContainerView; class ImmersiveFullscreenController; class NonClientFrameViewAshImmersiveHelper; @@ -48,7 +51,8 @@ static NonClientFrameViewAsh* Get(aura::Window* window); // Sets the caption button modeland updates the caption buttons. - void SetCaptionButtonModel(std::unique_ptr<CaptionButtonModel> model); + void SetCaptionButtonModel( + std::unique_ptr<chromeos::CaptionButtonModel> model); // Inits |immersive_fullscreen_controller| so that the controller reveals // and hides |header_view_| in immersive fullscreen. @@ -118,7 +122,8 @@ // Returns the container for the minimize/maximize/close buttons that is // held by the HeaderView. Used in testing. - FrameCaptionButtonContainerView* GetFrameCaptionButtonContainerViewForTest(); + chromeos::FrameCaptionButtonContainerView* + GetFrameCaptionButtonContainerViewForTest(); // Called when |frame_|'s "paint as active" state has changed. void PaintAsActiveChanged();
diff --git a/ash/frame/non_client_frame_view_ash_unittest.cc b/ash/frame/non_client_frame_view_ash_unittest.cc index c1563381..d529f590 100644 --- a/ash/frame/non_client_frame_view_ash_unittest.cc +++ b/ash/frame/non_client_frame_view_ash_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/frame/header_view.h" #include "ash/frame/wide_frame_view.h" #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h" @@ -27,6 +26,7 @@ #include "ash/wm/wm_event.h" #include "base/command_line.h" #include "base/containers/flat_set.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/window.h" @@ -49,6 +49,8 @@ namespace ash { +using ::chromeos::FrameCaptionButtonContainerView; + // A views::WidgetDelegate which uses a NonClientFrameViewAsh. class NonClientFrameViewAshTestWidgetDelegate : public views::WidgetDelegateView { @@ -417,7 +419,7 @@ namespace { -class TestButtonModel : public CaptionButtonModel { +class TestButtonModel : public chromeos::CaptionButtonModel { public: TestButtonModel() = default; ~TestButtonModel() override = default;
diff --git a/ash/frame/snap_controller_impl.cc b/ash/frame/snap_controller_impl.cc index ec4b9b1..28f24c14 100644 --- a/ash/frame/snap_controller_impl.cc +++ b/ash/frame/snap_controller_impl.cc
@@ -21,8 +21,8 @@ } void SnapControllerImpl::ShowSnapPreview(aura::Window* window, - SnapDirection snap) { - if (snap == SnapDirection::kNone) { + chromeos::SnapDirection snap) { + if (snap == chromeos::SnapDirection::kNone) { phantom_window_controller_.reset(); return; } @@ -33,21 +33,23 @@ std::make_unique<PhantomWindowController>(window); } gfx::Rect phantom_bounds_in_screen = - (snap == SnapDirection::kLeft) + (snap == chromeos::SnapDirection::kLeft) ? GetDefaultLeftSnappedWindowBoundsInParent(window) : GetDefaultRightSnappedWindowBoundsInParent(window); ::wm::ConvertRectToScreen(window->parent(), &phantom_bounds_in_screen); phantom_window_controller_->Show(phantom_bounds_in_screen); } -void SnapControllerImpl::CommitSnap(aura::Window* window, SnapDirection snap) { +void SnapControllerImpl::CommitSnap(aura::Window* window, + chromeos::SnapDirection snap) { phantom_window_controller_.reset(); - if (snap == SnapDirection::kNone) + if (snap == chromeos::SnapDirection::kNone) return; WindowState* window_state = WindowState::Get(window); - const WMEvent snap_event(snap == SnapDirection::kLeft ? WM_EVENT_SNAP_LEFT - : WM_EVENT_SNAP_RIGHT); + const WMEvent snap_event(snap == chromeos::SnapDirection::kLeft + ? WM_EVENT_SNAP_LEFT + : WM_EVENT_SNAP_RIGHT); window_state->OnWMEvent(&snap_event); }
diff --git a/ash/frame/snap_controller_impl.h b/ash/frame/snap_controller_impl.h index 68bf9bc..61065979 100644 --- a/ash/frame/snap_controller_impl.h +++ b/ash/frame/snap_controller_impl.h
@@ -8,22 +8,23 @@ #include <memory> #include "ash/ash_export.h" -#include "ash/public/cpp/caption_buttons/snap_controller.h" #include "base/macros.h" +#include "chromeos/ui/frame/caption_buttons/snap_controller.h" namespace ash { class PhantomWindowController; // A controller for toplevel window actions which can only run in Ash. -class ASH_EXPORT SnapControllerImpl : public SnapController { +class ASH_EXPORT SnapControllerImpl : public chromeos::SnapController { public: SnapControllerImpl(); ~SnapControllerImpl() override; bool CanSnap(aura::Window* window) override; - void ShowSnapPreview(aura::Window* window, SnapDirection snap) override; - void CommitSnap(aura::Window* window, SnapDirection snap) override; + void ShowSnapPreview(aura::Window* window, + chromeos::SnapDirection snap) override; + void CommitSnap(aura::Window* window, chromeos::SnapDirection snap) override; private: std::unique_ptr<PhantomWindowController> phantom_window_controller_;
diff --git a/ash/frame/wide_frame_view.cc b/ash/frame/wide_frame_view.cc index 611500c..9399c90 100644 --- a/ash/frame/wide_frame_view.cc +++ b/ash/frame/wide_frame_view.cc
@@ -6,7 +6,6 @@ #include "ash/frame/header_view.h" #include "ash/frame/non_client_frame_view_ash.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller.h" #include "ash/public/cpp/window_properties.h" @@ -15,6 +14,7 @@ #include "ash/wm/window_state.h" #include "ash/wm/wm_event.h" #include "base/metrics/user_metrics.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "ui/aura/window.h" #include "ui/aura/window_targeter.h" #include "ui/display/display.h" @@ -78,7 +78,7 @@ } void WideFrameView::SetCaptionButtonModel( - std::unique_ptr<CaptionButtonModel> model) { + std::unique_ptr<chromeos::CaptionButtonModel> model) { header_view_->caption_button_container()->SetModel(std::move(model)); header_view_->UpdateCaptionButtons(); }
diff --git a/ash/frame/wide_frame_view.h b/ash/frame/wide_frame_view.h index 32b684da..a843bbc6 100644 --- a/ash/frame/wide_frame_view.h +++ b/ash/frame/wide_frame_view.h
@@ -6,9 +6,9 @@ #define ASH_FRAME_WIDE_FRAME_VIEW_H_ #include "ash/ash_export.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller_delegate.h" #include "ash/wm/overview/overview_observer.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" #include "ui/aura/window_observer.h" #include "ui/display/display_observer.h" #include "ui/views/widget/widget_delegate.h" @@ -44,7 +44,8 @@ void Init(ImmersiveFullscreenController* controller); // Set the caption model for caption buttions on this frame. - void SetCaptionButtonModel(std::unique_ptr<CaptionButtonModel> mode); + void SetCaptionButtonModel( + std::unique_ptr<chromeos::CaptionButtonModel> mode); HeaderView* header_view() { return header_view_; }
diff --git a/ash/magnifier/magnification_controller_unittest.cc b/ash/magnifier/magnification_controller_unittest.cc index 43f0588..2f080f25 100644 --- a/ash/magnifier/magnification_controller_unittest.cc +++ b/ash/magnifier/magnification_controller_unittest.cc
@@ -630,7 +630,7 @@ const int kViewportWidth = 400; // Add some extra distance horizontally from text caret to to left edge of // the text input view. - int x = kViewportWidth - (kCaretPanningMargin + 20) / kScale; + int x = kViewportWidth - (kCaretPanningMargin + 30) / kScale; text_input_helper_.CreateAndShowTextInputView(gfx::Rect(x, 200, 80, 80)); gfx::Rect text_input_bounds = text_input_helper_.GetTextInputViewBounds();
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 8f82490..fdf9769 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -104,16 +104,6 @@ "assistant/conversation_starters_client.h", "back_gesture_contextual_nudge_controller.h", "back_gesture_contextual_nudge_delegate.h", - "caption_buttons/caption_button_model.h", - "caption_buttons/frame_back_button.cc", - "caption_buttons/frame_back_button.h", - "caption_buttons/frame_caption_button_container_view.cc", - "caption_buttons/frame_caption_button_container_view.h", - "caption_buttons/frame_size_button.cc", - "caption_buttons/frame_size_button.h", - "caption_buttons/frame_size_button_delegate.h", - "caption_buttons/snap_controller.cc", - "caption_buttons/snap_controller.h", "cast_config_controller.cc", "cast_config_controller.h", "child_accounts/parent_access_controller.cc", @@ -341,6 +331,7 @@ "//chromeos/services/cellular_setup:in_process_esim_manager", "//chromeos/services/network_config:in_process_instance", "//chromeos/ui/base", + "//chromeos/ui/frame", "//chromeos/ui/vector_icons", "//components/pref_registry", "//components/prefs",
diff --git a/ash/public/cpp/app_list/app_list_config_provider_unittest.cc b/ash/public/cpp/app_list/app_list_config_provider_unittest.cc index c82983c..2e710462 100644 --- a/ash/public/cpp/app_list/app_list_config_provider_unittest.cc +++ b/ash/public/cpp/app_list/app_list_config_provider_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/app_list/app_list_features.h" #include "base/stl_util.h" -#include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash {
diff --git a/ash/public/cpp/app_list/app_list_features.cc b/ash/public/cpp/app_list/app_list_features.cc index 39ef5479..69f78840 100644 --- a/ash/public/cpp/app_list/app_list_features.cc +++ b/ash/public/cpp/app_list/app_list_features.cc
@@ -15,8 +15,6 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kEnableSettingsShortcutSearch{ "EnableSettingsShortcutSearch", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kEnableZeroStateSuggestions{ - "EnableZeroStateSuggestions", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kEnableAppListSearchAutocomplete{ "EnableAppListSearchAutocomplete", base::FEATURE_ENABLED_BY_DEFAULT}; const base::Feature kEnableAppRanker{"EnableAppRanker", @@ -65,10 +63,6 @@ return base::FeatureList::IsEnabled(kEnableSettingsShortcutSearch); } -bool IsZeroStateSuggestionsEnabled() { - return base::FeatureList::IsEnabled(kEnableZeroStateSuggestions); -} - bool IsAppListSearchAutocompleteEnabled() { return base::FeatureList::IsEnabled(kEnableAppListSearchAutocomplete); }
diff --git a/ash/public/cpp/app_list/app_list_features.h b/ash/public/cpp/app_list/app_list_features.h index 0eed5aa5..862ff80e 100644 --- a/ash/public/cpp/app_list/app_list_features.h +++ b/ash/public/cpp/app_list/app_list_features.h
@@ -24,9 +24,6 @@ // Enables the Settings shortcut search. ASH_PUBLIC_EXPORT extern const base::Feature kEnableSettingsShortcutSearch; -// Enables the feature to display zero state suggestions. -ASH_PUBLIC_EXPORT extern const base::Feature kEnableZeroStateSuggestions; - // Enables the feature to autocomplete text typed in the AppList search box. ASH_PUBLIC_EXPORT extern const base::Feature kEnableAppListSearchAutocomplete; @@ -87,7 +84,6 @@ bool ASH_PUBLIC_EXPORT IsAppDataSearchEnabled(); bool ASH_PUBLIC_EXPORT IsSettingsShortcutSearchEnabled(); -bool ASH_PUBLIC_EXPORT IsZeroStateSuggestionsEnabled(); bool ASH_PUBLIC_EXPORT IsAppListSearchAutocompleteEnabled(); bool ASH_PUBLIC_EXPORT IsAppRankerEnabled(); bool ASH_PUBLIC_EXPORT IsZeroStateAppsRankerEnabled();
diff --git a/ash/public/cpp/caption_buttons/frame_back_button.h b/ash/public/cpp/caption_buttons/frame_back_button.h deleted file mode 100644 index 32182eb8a..0000000 --- a/ash/public/cpp/caption_buttons/frame_back_button.h +++ /dev/null
@@ -1,30 +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 ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_BACK_BUTTON_H_ -#define ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_BACK_BUTTON_H_ - -#include "ash/public/cpp/ash_public_export.h" -#include "ui/views/window/frame_caption_button.h" - -namespace ash { - -// A button to send back key events. It's used in Chrome hosted app windows, -// among other places. -class ASH_PUBLIC_EXPORT FrameBackButton : public views::FrameCaptionButton, - public views::ButtonListener { - public: - FrameBackButton(); - ~FrameBackButton() override; - - // views::ButtonListener: - void ButtonPressed(Button* sender, const ui::Event& event) override; - - private: - DISALLOW_COPY_AND_ASSIGN(FrameBackButton); -}; - -} // namespace ash - -#endif // ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_BACK_BUTTON_H_
diff --git a/ash/public/cpp/default_frame_header.cc b/ash/public/cpp/default_frame_header.cc index b205f83f..9e736b4 100644 --- a/ash/public/cpp/default_frame_header.cc +++ b/ash/public/cpp/default_frame_header.cc
@@ -5,12 +5,12 @@ #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/ash_constants.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/window_properties.h" #include "base/logging.h" // DCHECK #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/base/window_state_type.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "third_party/skia/include/core/SkPath.h" #include "ui/gfx/canvas.h" #include "ui/gfx/color_utils.h" @@ -64,7 +64,7 @@ DefaultFrameHeader::DefaultFrameHeader( views::Widget* target_widget, views::View* header_view, - FrameCaptionButtonContainerView* caption_button_container) + chromeos::FrameCaptionButtonContainerView* caption_button_container) : FrameHeader(target_widget, header_view) { DCHECK(caption_button_container); SetCaptionButtonContainer(caption_button_container);
diff --git a/ash/public/cpp/default_frame_header.h b/ash/public/cpp/default_frame_header.h index 8bb5dba..efa8bf0 100644 --- a/ash/public/cpp/default_frame_header.h +++ b/ash/public/cpp/default_frame_header.h
@@ -21,9 +21,10 @@ class ASH_PUBLIC_EXPORT DefaultFrameHeader : public FrameHeader { public: // DefaultFrameHeader does not take ownership of any of the parameters. - DefaultFrameHeader(views::Widget* target_widget, - views::View* header_view, - FrameCaptionButtonContainerView* caption_button_container); + DefaultFrameHeader( + views::Widget* target_widget, + views::View* header_view, + chromeos::FrameCaptionButtonContainerView* caption_button_container); ~DefaultFrameHeader() override; SkColor active_frame_color_for_testing() { return active_frame_color_; }
diff --git a/ash/public/cpp/file_icon_util_unittest.cc b/ash/public/cpp/file_icon_util_unittest.cc index bba78e1..9adf2e1 100644 --- a/ash/public/cpp/file_icon_util_unittest.cc +++ b/ash/public/cpp/file_icon_util_unittest.cc
@@ -11,7 +11,6 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ash/public/cpp/frame_header.cc b/ash/public/cpp/frame_header.cc index 09a23a16..042d86c 100644 --- a/ash/public/cpp/frame_header.cc +++ b/ash/public/cpp/frame_header.cc
@@ -4,11 +4,11 @@ #include "ash/public/cpp/frame_header.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/frame_utils.h" #include "ash/public/cpp/window_properties.h" #include "base/logging.h" // DCHECK +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "ui/base/class_property.h" #include "ui/compositor/layer_animation_observer.h" @@ -261,7 +261,7 @@ return back_button_; } -const CaptionButtonModel* FrameHeader::GetCaptionButtonModel() const { +const chromeos::CaptionButtonModel* FrameHeader::GetCaptionButtonModel() const { return caption_button_container_->model(); } @@ -317,7 +317,7 @@ } void FrameHeader::SetCaptionButtonContainer( - FrameCaptionButtonContainerView* caption_button_container) { + chromeos::FrameCaptionButtonContainerView* caption_button_container) { caption_button_container_ = caption_button_container; caption_button_container_->SetButtonImage(views::CAPTION_BUTTON_ICON_MINIMIZE, views::kWindowControlMinimizeIcon); @@ -365,7 +365,7 @@ : views::kWindowControlMaximizeIcon; // TODO(crbug.com/1092005): Investigate if we can move this to // CaptionButtonModel and just check the model in - // FrameCaptionButtonContainerView. + // chromeos::FrameCaptionButtonContainerView. const bool use_restore_frame = ash::ShouldUseRestoreFrame(target_widget_); caption_button_container()->SetButtonImage( views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE,
diff --git a/ash/public/cpp/frame_header.h b/ash/public/cpp/frame_header.h index 89ce587..9f1e495 100644 --- a/ash/public/cpp/frame_header.h +++ b/ash/public/cpp/frame_header.h
@@ -6,15 +6,19 @@ #define ASH_PUBLIC_CPP_FRAME_HEADER_H_ #include "ash/public/cpp/ash_public_export.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "base/callback.h" #include "base/optional.h" #include "base/strings/string16.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/base/ui_base_types.h" #include "ui/compositor/layer_animation_observer.h" #include "ui/views/window/frame_caption_button.h" +namespace chromeos { +class CaptionButtonModel; +} // namespace chromeos + namespace gfx { class Canvas; class Rect; @@ -27,7 +31,6 @@ } // namespace views namespace ash { -class CaptionButtonModel; // Helper class for managing the window header. class ASH_PUBLIC_EXPORT FrameHeader { @@ -73,7 +76,7 @@ void SetLeftHeaderView(views::View* view); void SetBackButton(views::FrameCaptionButton* view); views::FrameCaptionButton* GetBackButton() const; - const CaptionButtonModel* GetCaptionButtonModel() const; + const chromeos::CaptionButtonModel* GetCaptionButtonModel() const; // Updates the frame header painting to reflect a change in frame colors. virtual void UpdateFrameColors() = 0; @@ -86,7 +89,7 @@ views::View* view() { return view_; } - FrameCaptionButtonContainerView* caption_button_container() { + chromeos::FrameCaptionButtonContainerView* caption_button_container() { return caption_button_container_; } @@ -106,7 +109,7 @@ void PaintTitleBar(gfx::Canvas* canvas); void SetCaptionButtonContainer( - FrameCaptionButtonContainerView* caption_button_container); + chromeos::FrameCaptionButtonContainerView* caption_button_container); Mode mode() const { return mode_; } @@ -137,7 +140,8 @@ views::View* view_; views::FrameCaptionButton* back_button_ = nullptr; // May remain nullptr. views::View* left_header_view_ = nullptr; // May remain nullptr. - FrameCaptionButtonContainerView* caption_button_container_ = nullptr; + chromeos::FrameCaptionButtonContainerView* caption_button_container_ = + nullptr; FrameAnimatorView* frame_animator_ = nullptr; // owned by view tree. // The height of the header to paint.
diff --git a/ash/public/cpp/rounded_corner_decorator_unittest.cc b/ash/public/cpp/rounded_corner_decorator_unittest.cc index 5681b23c..5359094 100644 --- a/ash/public/cpp/rounded_corner_decorator_unittest.cc +++ b/ash/public/cpp/rounded_corner_decorator_unittest.cc
@@ -5,7 +5,6 @@ #include "ash/public/cpp/rounded_corner_decorator.h" #include "ash/public/cpp/ash_features.h" -#include "base/test/scoped_feature_list.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/test/aura_test_base.h" #include "ui/aura/test/test_windows.h"
diff --git a/ash/shell.h b/ash/shell.h index cfee3fe..f47bc16d 100644 --- a/ash/shell.h +++ b/ash/shell.h
@@ -32,6 +32,10 @@ class Window; } // namespace aura +namespace chromeos { +class SnapController; +} // namespace chromeos + namespace dbus { class Bus; } @@ -175,7 +179,6 @@ class ShellObserver; class ShutdownControllerImpl; class SmsObserver; -class SnapController; class StickyKeysController; class SystemGestureEventFilter; class SystemModalContainerEventFilter; @@ -829,7 +832,7 @@ std::unique_ptr<DockedMagnifierControllerImpl> docked_magnifier_controller_; - std::unique_ptr<SnapController> snap_controller_; + std::unique_ptr<chromeos::SnapController> snap_controller_; // |native_cursor_manager_| is owned by |cursor_manager_|, but we keep a // pointer to vend to test code.
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 722f56c..b911f99 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -193,7 +193,7 @@ <translation id="2942350706960889382">Fastgjort lupvindue</translation> <translation id="2942516765047364088">Hyldeplacering</translation> <translation id="2946119680249604491">Tilføj forbindelse</translation> -<translation id="2961963223658824723">Der opstod en fejl. Prøv igen om et par sekunder.</translation> +<translation id="2961963223658824723">Noget gik galt. Prøv igen om et par sekunder.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2970920913501714344">Installer apps, udvidelser og temaer</translation> <translation id="2977598380246111477">Næste tal</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index d872d259..9107000 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -313,6 +313,7 @@ <translation id="4072264167173457037">ഇടത്തരം സിഗ്നൽ</translation> <translation id="4112140312785995938">പുറകിലേക്ക് നീക്കുക</translation> <translation id="4114315158543974537">ഫോൺ ഹബ് ഓണാക്കുക</translation> +<translation id="4121728057981832179">വെർച്വൽ മെഷീൻ നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation> <translation id="4129129681837227511">നിങ്ങളുടെ ലോക്ക് സ്ക്രീനിൽ അറിയിപ്പുകൾ കാണാൻ, ക്രമീകരണം മാറ്റാനായി അൺലോക്ക് ചെയ്യുക</translation> <translation id="4146833061457621061">സംഗീതം പ്ലേ ചെയ്യുക</translation> <translation id="4149156641122542261"><ph name="DEVICE_TYPE" /> മാനേജ് ചെയ്യുന്നത് <ph name="DOMAIN" /> ആണ്</translation> @@ -327,6 +328,7 @@ <translation id="4217571870635786043">പറഞ്ഞ് കൊടുക്കൽ</translation> <translation id="4239069858505860023">GPRS</translation> <translation id="4261870227682513959">അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. അറിയിപ്പുകൾ ഓഫാണ്</translation> +<translation id="4267383818855338811">വെർച്വൽ മെഷീൻ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation> <translation id="4269883910223712419">ഈ ഉപകരണത്തിന്റെ അഡ്മിന് ഇനിപ്പറയുന്ന കാര്യങ്ങൾ ചെയ്യാൻ കഴിയും:</translation> <translation id="4279490309300973883">മിററിംഗ്</translation> <translation id="4285498937028063278">പിൻചെയ്യൽ മാറ്റുക</translation> @@ -362,6 +364,7 @@ <translation id="4513946894732546136">ഫീഡ്ബാക്ക്</translation> <translation id="4527045527269911712">"<ph name="DEVICE_NAME" />" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കുന്നതിനുള്ള അനുമതി ആവശ്യപ്പെടുന്നു.</translation> <translation id="453661520163887813">പൂർത്തിയാകാൻ ശേഷിക്കുന്ന സമയം <ph name="TIME" /></translation> +<translation id="4544483149666270818">റെക്കോർഡ് ചെയ്യാൻ വിൻഡോ തിരഞ്ഞെടുക്കുക</translation> <translation id="4560576029703263363">ഓണാണ്</translation> <translation id="4561267230861221837">3G</translation> <translation id="4565377596337484307">പാസ്വേഡ് മറയ്ക്കുക</translation> @@ -401,6 +404,15 @@ <translation id="4918086044614829423">സ്വീകരിക്കുക</translation> <translation id="4924411785043111640">പുനഃരാരംഭിച്ച് പുനഃസജ്ജീകരിക്കുക</translation> <translation id="4925542575807923399">ഈ അക്കൗണ്ട് ഒന്നിലധികം സൈൻ ഇൻ സെഷനിൽ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന ആദ്യ അക്കൗണ്ട് ആയിരിക്കാൻ ഈ അക്കൗണ്ടിനായുള്ള അഡ്മിനിസ്ട്രേറ്റർ ആവശ്യപ്പെടുന്നു.</translation> +<translation id="4942878304446937978">സ്റ്റാറ്റസ് ട്രേ, സമയം <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> +<translation id="4946376291507881335">ക്യാപ്ചർ ചെയ്യുക</translation> <translation id="495046168593986294">മുകളിലേക്ക് സ്ക്രോള് ചെയ്യുക</translation> <translation id="4961318399572185831">സ്ക്രീൻ കാസ്റ്റ് ചെയ്യുക</translation> <translation id="4969092041573468113"><ph name="HOURS" />മണിക്കൂർ <ph name="MINUTES" />മിനിറ്റ് <ph name="SECONDS" />സെക്കൻഡ്</translation> @@ -446,6 +458,7 @@ <translation id="554893713779400387">പറഞ്ഞ് കൊടുക്കൽ മാറ്റുക</translation> <translation id="556042886152191864">ബട്ടൺ</translation> <translation id="5571066253365925590">Bluetooth പ്രവർത്തനക്ഷമമാക്കി</translation> +<translation id="558849140439112033">ക്യാപ്ചർ ചെയ്യുന്നതിന് ഒരു ഏരിയ തിരഞ്ഞെടുക്കാൻ വലിച്ചിടുക</translation> <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation> <translation id="5600837773213129531">സംഭാഷണ ഫീഡ്ബാക്ക് പ്രവർത്തനരഹിതമാക്കാൻ Ctrl + Alt + Z അമർത്തുക.</translation> <translation id="5625955975703555628">LTE+</translation> @@ -473,9 +486,11 @@ <translation id="5860033963881614850">ഓഫാക്കുക</translation> <translation id="5876666360658629066">രക്ഷാകർതൃ കോഡ് നൽകുക</translation> <translation id="5895138241574237353">പുനരാരംഭിക്കുക</translation> +<translation id="589817443623831496">പോയിന്റ് സ്കാൻ ചെയ്യൽ</translation> <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5909862606227538307">നിഷ്ക്രിയ ഡെസ്ക്.</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> +<translation id="5915278665499293471">പൂർണ്ണസ്ക്രീൻ ക്യാപ്ചർ ചെയ്യാൻ എവിടെയെങ്കിലും ക്ലിക്ക് ചെയ്യുക</translation> <translation id="5916664084637901428">ഓൺ ചെയ്യുക</translation> <translation id="5920710855273935292">മൈക്ക് മ്യൂട്ട് ചെയ്തിരിക്കുന്നു.</translation> <translation id="594179686076170922">നിങ്ങളുടെ ഫോണിലേക്ക് കണക്റ്റ് ചെയ്യുന്നു...</translation> @@ -533,6 +548,7 @@ <translation id="6490471652906364588">USB-C ഉപകരണം (വലത് പോർട്ട്)</translation> <translation id="649452524636452238">സ്മാർട്ട് കാർഡ് പിൻ</translation> <translation id="6501401484702599040"><ph name="RECEIVER_NAME" /> എന്നതിലേക്ക് സ്ക്രീൻ കാസ്റ്റുചെയ്യുന്നു</translation> +<translation id="6520517963145875092">ക്യാപ്ചർ ചെയ്യാൻ വിൻഡോ തിരഞ്ഞെടുക്കുക</translation> <translation id="652139407789908527">ഈ അപ്ഡേറ്റ് നടക്കുമ്പോൾ നിങ്ങളുടെ സ്ക്രീൻ പതിവിലും കൂടുതൽ സമയം (ഒരു മിനിറ്റ് വരെ) ശൂന്യമാകും. അപ്ഡേറ്റ് ചെയ്യൽ പുരോഗമിക്കുമ്പോൾ പവർ ബട്ടൺ അമർത്തരുത്.</translation> <translation id="6528179044667508675">ശല്യപ്പെടുത്തരുത്</translation> <translation id="65320610082834431">ഇമോജികൾ</translation> @@ -562,6 +578,7 @@ <translation id="6751052314767925245">നിങ്ങളുടെ അഡ്മിൻ നടപ്പിലാക്കിയതാണ്</translation> <translation id="6751826523481687655">പ്രകടനം പിന്തുടരൽ ഓണാണ്</translation> <translation id="6752912906630585008">ഡെസ്ക് <ph name="REMOVED_DESK" /> നീക്കം ചെയ്ത്, ഡെസ്ക് <ph name="RECEIVE_DESK" />-മായി ലയിപ്പിച്ചു</translation> +<translation id="6757237461819837179">മീഡിയയൊന്നും പ്ലേ ചെയ്യുന്നില്ല</translation> <translation id="6777216307882431711">കണക്റ്റ് ചെയ്ത USB-C ഉപകരണങ്ങൾ ചാർജ് ചെയ്യുന്നു</translation> <translation id="6790428901817661496">പ്ലേചെയ്യുക</translation> <translation id="6803622936009808957">പിന്തുണയ്ക്കുന്ന മിഴിവുകൾ കണ്ടെത്താത്തതിനാൽ പ്രദർശനങ്ങൾ പ്രതിഫലിപ്പിക്കാനായില്ല. പകരം വിപുലീകൃത ഡെസ്ക്ടോപ്പ് നൽകി.</translation> @@ -610,6 +627,7 @@ <translation id="7348093485538360975">ഓൺ-സ്ക്രീൻ കീബോർഡ്</translation> <translation id="735745346212279324">VPN വിച്ഛേദിച്ചു</translation> <translation id="7377169924702866686">Caps Lock ഓൺ ആണ്.</translation> +<translation id="7378203170292176219">റെക്കോർഡ് ചെയ്യുന്നതിന് ഒരു ഏരിയ തിരഞ്ഞെടുക്കാൻ വലിച്ചിടുക</translation> <translation id="7378594059915113390">മീഡിയ നിയന്ത്രണങ്ങൾ</translation> <translation id="7398254312354928459">നെറ്റ്വർക്ക് കണക്ഷൻ മാറ്റി</translation> <translation id="7405710164030118432">ഉപകരണം അൺലോക്ക് ചെയ്യാൻ നിങ്ങളുടെ Family Link രക്ഷാകർതൃ ആക്സസ് കോഡ് നൽകുക</translation> @@ -637,6 +655,7 @@ <translation id="7618774594543487847">ന്യൂട്രൽ</translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">'സമീപമുള്ള പങ്കിടൽ' ക്രമീകരണം കാണിക്കുക.</translation> +<translation id="7641938616688887143">റെക്കോർഡ് ചെയ്യുക</translation> <translation id="7642647758716480637"><ph name="NETWORK_NAME" /> എന്നതിനുള്ള ക്രമീകരണം തുറക്കുക, <ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (ഉടമ)</translation> <translation id="7647488630410863958">നിങ്ങളുടെ അറിയിപ്പുകൾ കാണാൻ ഉപകരണം അൺലോക്ക് ചെയ്യുക</translation> @@ -733,6 +752,7 @@ <translation id="8563862697512465947">വിജ്ഞാപന ക്രമീകരണങ്ങള്</translation> <translation id="857201607579416096">സ്ക്രീനിന്റെ ചുവടെ വലത് കോണിലേക്ക് മെനു നീക്കിയിരിക്കുന്നു.</translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> +<translation id="861041328460089089">പൂർണ്ണസ്ക്രീൻ ക്യാപ്ചർ ചെയ്യാൻ എവിടെയെങ്കിലും ടാപ്പ് ചെയ്യുക</translation> <translation id="8627191004499078455"><ph name="DEVICE_NAME" /> ഉപകരണത്തിലേക്ക് കണക്റ്റ് ചെയ്തു</translation> <translation id="8631727435199967028">ഉപയോഗസഹായി ക്രമീകരണം</translation> <translation id="8637598503828012618"><ph name="CONNECTION_STATUS" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />, നിങ്ങളുടെ അഡ്മിൻ മാനേജ് ചെയ്യുന്നത്</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 1545c6f..c7a10414 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -313,6 +313,7 @@ <translation id="4072264167173457037">Stredne silný signál</translation> <translation id="4112140312785995938">Pretočiť dozadu</translation> <translation id="4114315158543974537">Zapnutie telefonického centra</translation> +<translation id="4121728057981832179">Váš mikrofón používa virtuálny počítač</translation> <translation id="4129129681837227511">Ak chcete, aby sa na uzamknutej obrazovke zobrazovali upozornenia, odomknite zariadenie a zmeňte nastavenie</translation> <translation id="4146833061457621061">Prehrať hudbu</translation> <translation id="4149156641122542261"><ph name="DEVICE_TYPE" /> spravuje <ph name="DOMAIN" /></translation> @@ -327,6 +328,7 @@ <translation id="4217571870635786043">Diktovanie</translation> <translation id="4239069858505860023">GPRS</translation> <translation id="4261870227682513959">Zobraziť nastavenia upozornení. Upozornenia sú vypnuté</translation> +<translation id="4267383818855338811">Vašu kameru používa virtuálny počítač</translation> <translation id="4269883910223712419">Správca tohto zariadenia môže:</translation> <translation id="4279490309300973883">Zrkadlenie</translation> <translation id="4285498937028063278">Odopnúť</translation> @@ -362,6 +364,7 @@ <translation id="4513946894732546136">Spätná väzba</translation> <translation id="4527045527269911712">Zariadenie Bluetooth s názvom <ph name="DEVICE_NAME" /> žiada o povolenie párovania.</translation> <translation id="453661520163887813"><ph name="TIME" /> do úplného nabitia</translation> +<translation id="4544483149666270818">Vyberte okno, ktoré chcete nahrať</translation> <translation id="4560576029703263363">Zapnuté</translation> <translation id="4561267230861221837">3G</translation> <translation id="4565377596337484307">Skryť heslo</translation> @@ -401,6 +404,15 @@ <translation id="4918086044614829423">Prijať</translation> <translation id="4924411785043111640">Reštartovať a resetovať</translation> <translation id="4925542575807923399">Správca tohto účtu vyžaduje, aby sa tento účet v relácii viacnásobného prihlásenia prihlásil ako prvý.</translation> +<translation id="4942878304446937978">Stavový panel, čas <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> +<translation id="4946376291507881335">Nasnímať</translation> <translation id="495046168593986294">Posunúť nahor</translation> <translation id="4961318399572185831">Prenášanie obrazovky</translation> <translation id="4969092041573468113"><ph name="HOURS" /> h <ph name="MINUTES" /> min <ph name="SECONDS" /> s</translation> @@ -446,6 +458,7 @@ <translation id="554893713779400387">Prepnúť diktovanie</translation> <translation id="556042886152191864">Tlačidlo</translation> <translation id="5571066253365925590">Rozhranie Bluetooth je povolené</translation> +<translation id="558849140439112033">Presunutím vyberte oblasť, ktorú chcete nasnímať</translation> <translation id="5597451508971090205"><ph name="SHORT_WEEKDAY" />, <ph name="DATE" /></translation> <translation id="5600837773213129531">Hovorenú spätnú väzbu zakážete kombináciou klávesov Ctrl+Alt+Z.</translation> <translation id="5625955975703555628">LTE+</translation> @@ -473,9 +486,11 @@ <translation id="5860033963881614850">Vypnuté</translation> <translation id="5876666360658629066">Zadajte kód rodiča</translation> <translation id="5895138241574237353">Reštartovať</translation> +<translation id="589817443623831496">Bodové prehľadávanie</translation> <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5909862606227538307">Plocha je neaktívna.</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> +<translation id="5915278665499293471">Kliknutím na ľubovoľné miesto nasnímate celú obrazovku</translation> <translation id="5916664084637901428">Zapnuté</translation> <translation id="5920710855273935292">Mikrofón je vypnutý.</translation> <translation id="594179686076170922">Pripája sa k vášmu telefónu…</translation> @@ -533,6 +548,7 @@ <translation id="6490471652906364588">Zariadenie USB-C (port vpravo)</translation> <translation id="649452524636452238">PIN inteligentnej karty</translation> <translation id="6501401484702599040">Prenášanie obrazovky do zariadenia <ph name="RECEIVER_NAME" /></translation> +<translation id="6520517963145875092">Vyberte okno, ktoré chcete nasnímať</translation> <translation id="652139407789908527">Počas tejto aktualizácie bude vaša obrazovka prázdna dlhšie ako zvyčajne (maximálne minútu). V priebehu aktualizácie nestláčajte vypínač.</translation> <translation id="6528179044667508675">Nerušiť</translation> <translation id="65320610082834431">Emodži</translation> @@ -562,6 +578,7 @@ <translation id="6751052314767925245">Presadzuje váš správca</translation> <translation id="6751826523481687655">Trasovanie výkonnosti je zapnuté</translation> <translation id="6752912906630585008">Plocha <ph name="REMOVED_DESK" /> bola odstránená a zlúčená s plochou <ph name="RECEIVE_DESK" /></translation> +<translation id="6757237461819837179">Neprehrávajú sa žiadne médiá</translation> <translation id="6777216307882431711">Napájajú sa pripojené zariadenia USB-C</translation> <translation id="6790428901817661496">Prehrať</translation> <translation id="6803622936009808957">Obraz na monitoroch sa nedá zrkadliť, pretože sa nenašli podporované rozlíšenia. Namiesto toho sa spustil režim rozšírenej pracovnej plochy.</translation> @@ -610,6 +627,7 @@ <translation id="7348093485538360975">Klávesnica na obrazovke</translation> <translation id="735745346212279324">Sieť VPN je odpojená</translation> <translation id="7377169924702866686">Kláves Caps Lock je zapnutý.</translation> +<translation id="7378203170292176219">Presunutím vyberte oblasť, ktorú chcete nahrať</translation> <translation id="7378594059915113390">Ovládacie prvky médií</translation> <translation id="7398254312354928459">Prepnuté sieťové pripojenie</translation> <translation id="7405710164030118432">Ak chcete toto zariadenie odomknúť, zadajte prístupový kód rodiča Family Link</translation> @@ -637,6 +655,7 @@ <translation id="7618774594543487847">Neutrálny</translation> <translation id="7624117708979618027"><ph name="TEMPERATURE_F" />° F</translation> <translation id="7633755430369750696">Zobraziť nastavenia zdieľania nablízku</translation> +<translation id="7641938616688887143">Nahrať</translation> <translation id="7642647758716480637">Otvoriť nastavenia siete <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /></translation> <translation id="7645176681409127223"><ph name="USER_NAME" /> (vlastník)</translation> <translation id="7647488630410863958">Ak si chcete zobraziť upozornenia, odomknite zariadenie</translation> @@ -733,6 +752,7 @@ <translation id="8563862697512465947">Nastavenia upozornení</translation> <translation id="857201607579416096">Ponuka bola presunutá do pravého dolného rohu obrazovky.</translation> <translation id="8594115950068821369">-<ph name="FORMATTED_TIME" /></translation> +<translation id="861041328460089089">Klepnutím na ľubovoľné miesto nasnímate celú obrazovku</translation> <translation id="8627191004499078455">Pripojené k zariadeniu <ph name="DEVICE_NAME" /></translation> <translation id="8631727435199967028">Nastavenia dostupnosti</translation> <translation id="8637598503828012618"><ph name="CONNECTION_STATUS" />, sila signálu <ph name="SIGNAL_STRENGTH" />, ovládané správcom</translation>
diff --git a/ash/system/holding_space/holding_space_item_view_delegate.cc b/ash/system/holding_space/holding_space_item_view_delegate.cc index 8172aa9..faab9b22 100644 --- a/ash/system/holding_space/holding_space_item_view_delegate.cc +++ b/ash/system/holding_space/holding_space_item_view_delegate.cc
@@ -4,6 +4,7 @@ #include "ash/system/holding_space/holding_space_item_view_delegate.h" +#include "ash/accessibility/accessibility_controller_impl.h" #include "ash/public/cpp/holding_space/holding_space_client.h" #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_controller.h" @@ -11,6 +12,7 @@ #include "ash/public/cpp/holding_space/holding_space_metrics.h" #include "ash/public/cpp/holding_space/holding_space_model.h" #include "ash/resources/vector_icons/vector_icons.h" +#include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/system/holding_space/holding_space_item_view.h" #include "base/bind.h" @@ -107,6 +109,19 @@ // clear any view that we had cached to ignore mouse released events for. ignore_mouse_released_ = nullptr; + // If ChromeVox is enabled, we assume this mouse `event` to be a result of + // having pressed Search + Space. In this case, we'll open the selected + // holding space items. If the "pressed" `view` is not part of the current + // selection it will become the entire selection. + const bool spoken_feedback_enabled = + Shell::Get()->accessibility_controller()->spoken_feedback().enabled(); + if (spoken_feedback_enabled) { + if (!view->selected()) + SetSelection(view); + OpenItems(GetSelection()); + return true; + } + // If the `view` is already selected, mouse press is a no-op. Actions taken on // selected views are performed on mouse released in order to give drag/drop // a chance to take effect (assuming that drag thresholds are met).
diff --git a/ash/system/night_light/night_light_controller_impl.cc b/ash/system/night_light/night_light_controller_impl.cc index 383ff8c..fd286cc 100644 --- a/ash/system/night_light/night_light_controller_impl.cc +++ b/ash/system/night_light/night_light_controller_impl.cc
@@ -170,12 +170,13 @@ // Returns the color matrix that corresponds to the given |temperature|. // The matrix will be affected by the current |ambient_temperature_| if -// GetAmbientColorEnabled() returns true. +// |apply_ambient_temperature| is true. // If |in_linear_gamma_space| is true, the generated matrix is the one that // should be applied after gamma correction, and it corresponds to the // non-linear temperature value for the given |temperature|. SkMatrix44 MatrixFromTemperature(float temperature, - bool in_linear_gamma_space) { + bool in_linear_gamma_space, + bool apply_ambient_temperature) { if (in_linear_gamma_space) temperature = NightLightControllerImpl::GetNonLinearTemperature(temperature); @@ -194,7 +195,7 @@ auto* night_light_controller = Shell::Get()->night_light_controller(); DCHECK(night_light_controller); - if (night_light_controller->GetAmbientColorEnabled()) { + if (apply_ambient_temperature) { const gfx::Vector3dF& ambient_rgb_scaling_factors = night_light_controller->ambient_rgb_scaling_factors(); @@ -265,10 +266,18 @@ return; } + auto* night_light_controller = Shell::Get()->night_light_controller(); + DCHECK(night_light_controller); + + // Only apply ambient EQ to internal displays. + const bool apply_ambient_temperature = + night_light_controller->GetAmbientColorEnabled() && + display::Display::IsInternalDisplayId(display_id); + const SkMatrix44 linear_gamma_space_matrix = - MatrixFromTemperature(temperature, true); + MatrixFromTemperature(temperature, true, apply_ambient_temperature); const SkMatrix44 gamma_compressed_matrix = - MatrixFromTemperature(temperature, false); + MatrixFromTemperature(temperature, false, apply_ambient_temperature); const bool crtc_result = AttemptSettingHardwareCtm( display_id, linear_gamma_space_matrix, gamma_compressed_matrix); UpdateCompositorMatrix(host, gamma_compressed_matrix, crtc_result); @@ -280,10 +289,6 @@ // by the current |ambient_temperature_| if GetAmbientColorEnabled() returns // true. void ApplyTemperatureToAllDisplays(float temperature) { - const SkMatrix44 linear_gamma_space_matrix = - MatrixFromTemperature(temperature, true); - const SkMatrix44 gamma_compressed_matrix = - MatrixFromTemperature(temperature, false); Shell* shell = Shell::Get(); WindowTreeHostManager* wth_manager = shell->window_tree_host_manager(); @@ -291,9 +296,6 @@ shell->display_manager()->GetCurrentDisplayIdList()) { DCHECK_NE(display_id, display::kUnifiedDisplayId); - const bool crtc_result = AttemptSettingHardwareCtm( - display_id, linear_gamma_space_matrix, gamma_compressed_matrix); - aura::Window* root_window = wth_manager->GetRootWindowForDisplayId(display_id); if (!root_window) { @@ -305,7 +307,7 @@ auto* host = root_window->GetHost(); DCHECK(host); - UpdateCompositorMatrix(host, gamma_compressed_matrix, crtc_result); + ApplyTemperatureToHost(host, temperature); } }
diff --git a/ash/system/night_light/night_light_controller_unittest.cc b/ash/system/night_light/night_light_controller_unittest.cc index 53b1604..a46600e 100644 --- a/ash/system/night_light/night_light_controller_unittest.cc +++ b/ash/system/night_light/night_light_controller_unittest.cc
@@ -124,6 +124,8 @@ class TestObserver : public NightLightController::Observer { public: TestObserver() { GetController()->AddObserver(this); } + TestObserver(const TestObserver& other) = delete; + TestObserver& operator=(const TestObserver& rhs) = delete; ~TestObserver() override { GetController()->RemoveObserver(this); } // ash::NightLightController::Observer: @@ -133,8 +135,6 @@ private: bool status_ = false; - - DISALLOW_COPY_AND_ASSIGN(TestObserver); }; constexpr double kFakePosition1_Latitude = 23.5; @@ -150,6 +150,8 @@ class TestDelegate : public NightLightControllerImpl::Delegate { public: TestDelegate() = default; + TestDelegate(const TestDelegate& other) = delete; + TestDelegate& operator=(const TestDelegate& rhs) = delete; ~TestDelegate() override = default; void SetFakeNow(base::Time time) { fake_now_ = time; } @@ -185,13 +187,13 @@ base::Time fake_sunset_; base::Time fake_sunrise_; bool has_geoposition_ = false; - - DISALLOW_COPY_AND_ASSIGN(TestDelegate); }; class NightLightTest : public NoSessionAshTestBase { public: NightLightTest() : delegate_(new TestDelegate) {} + NightLightTest(const NightLightTest& other) = delete; + NightLightTest& operator=(const NightLightTest& rhs) = delete; ~NightLightTest() override = default; PrefService* user1_pref_service() { @@ -264,8 +266,6 @@ private: TestDelegate* delegate_ = nullptr; // Not owned. - - DISALLOW_COPY_AND_ASSIGN(NightLightTest); }; // Tests toggling NightLight on / off and makes sure the observer is updated and @@ -1077,65 +1077,6 @@ EXPECT_EQ(ambient_temperature, controller->ambient_temperature()); } -TEST_F(NightLightTest, TestAmbientColorMatrix) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(features::kAllowAmbientEQ); - SetNightLightEnabled(false); - SetAmbientColorPrefEnabled(true); - auto scaling_factors = GetAllDisplaysCompositorsRGBScaleFactors(); - // If no temperature is set, we expect 1.0 for each scaling factor. - for (const gfx::Vector3dF& rgb : scaling_factors) { - EXPECT_TRUE((rgb - gfx::Vector3dF(1.0f, 1.0f, 1.0f)).IsZero()); - } - - float ambient_temperature = SimulateAmbientColorFromPowerd(8000, 7350.0f); - - scaling_factors = GetAllDisplaysCompositorsRGBScaleFactors(); - // A cool temperature should affect only red and green. - for (const gfx::Vector3dF& rgb : scaling_factors) { - EXPECT_LT(rgb.x(), 1.0f); - EXPECT_LT(rgb.y(), 1.0f); - EXPECT_EQ(rgb.z(), 1.0f); - } - - ambient_temperature = SimulateAmbientColorFromPowerd(2700, 5800.0f); - - scaling_factors = GetAllDisplaysCompositorsRGBScaleFactors(); - // A warm temperature should affect only green and blue. - for (const gfx::Vector3dF& rgb : scaling_factors) { - EXPECT_EQ(rgb.x(), 1.0f); - EXPECT_LT(rgb.y(), 1.0f); - EXPECT_LT(rgb.z(), 1.0f); - } -} - -TEST_F(NightLightTest, TestNightLightAndAmbientColorInteraction) { - base::test::ScopedFeatureList features; - features.InitAndEnableFeature(features::kAllowAmbientEQ); - - SetNightLightEnabled(true); - - auto night_light_rgb = GetAllDisplaysCompositorsRGBScaleFactors().front(); - - SetAmbientColorPrefEnabled(true); - - auto night_light_and_ambient_rgb = - GetAllDisplaysCompositorsRGBScaleFactors().front(); - // Ambient color with neutral temperature should not affect night light. - EXPECT_TRUE((night_light_rgb - night_light_and_ambient_rgb).IsZero()); - - SimulateAmbientColorFromPowerd(2700, 5800.0f); - - night_light_and_ambient_rgb = - GetAllDisplaysCompositorsRGBScaleFactors().front(); - - // Red should not be affected by a warmed ambient temperature. - EXPECT_EQ(night_light_and_ambient_rgb.x(), night_light_rgb.x()); - // Green and blue should be lowered instead. - EXPECT_LT(night_light_and_ambient_rgb.y(), night_light_rgb.y()); - EXPECT_LT(night_light_and_ambient_rgb.z(), night_light_rgb.z()); -} - // Tests that manual changes to NightLight status while a schedule is being used // will be remembered and reapplied across user switches. TEST_F(NightLightTest, MultiUserManualStatusToggleWithSchedules) { @@ -1293,6 +1234,8 @@ public: NightLightCrtcTest() : logger_(std::make_unique<display::test::ActionLogger>()) {} + NightLightCrtcTest(const NightLightCrtcTest& other) = delete; + NightLightCrtcTest& operator=(const NightLightCrtcTest& rhs) = delete; ~NightLightCrtcTest() override = default; static constexpr gfx::Size kDisplaySize{1024, 768}; @@ -1409,8 +1352,6 @@ std::unique_ptr<display::DisplayConfigurator::TestApi> test_api_; std::vector<std::unique_ptr<display::DisplaySnapshot>> owned_snapshots_; - - DISALLOW_COPY_AND_ASSIGN(NightLightCrtcTest); }; // static @@ -1676,9 +1617,9 @@ class AutoNightLightTest : public NightLightTest { public: AutoNightLightTest() = default; - ~AutoNightLightTest() override = default; AutoNightLightTest(const AutoNightLightTest& other) = delete; AutoNightLightTest& operator=(const AutoNightLightTest& rhs) = delete; + ~AutoNightLightTest() override = default; // NightLightTest: void SetUp() override { @@ -1836,10 +1777,10 @@ class AutoNightLightOnFirstLogin : public AutoNightLightTest { public: AutoNightLightOnFirstLogin() { fake_now_ = 23 * 60; } - ~AutoNightLightOnFirstLogin() override = default; AutoNightLightOnFirstLogin(const AutoNightLightOnFirstLogin& other) = delete; AutoNightLightOnFirstLogin& operator=(const AutoNightLightOnFirstLogin& rhs) = delete; + ~AutoNightLightOnFirstLogin() override = default; }; TEST_F(AutoNightLightOnFirstLogin, NotifyOnFirstLogin) { @@ -1851,23 +1792,78 @@ // Fixture for testing Ambient EQ. class AmbientEQTest : public NightLightTest { public: - AmbientEQTest() = default; - ~AmbientEQTest() override = default; + AmbientEQTest() : logger_(std::make_unique<display::test::ActionLogger>()) {} AmbientEQTest(const AmbientEQTest& other) = delete; AmbientEQTest& operator=(const AmbientEQTest& rhs) = delete; + ~AmbientEQTest() override = default; static constexpr gfx::Vector3dF kDefaultScalingFactors{1.0f, 1.0f, 1.0f}; + static constexpr int64_t kInternalDisplayId = 123; + static constexpr int64_t kExternalDisplayId = 456; // NightLightTest: void SetUp() override { NightLightTest::SetUp(); + features_.InitAndEnableFeature(features::kAllowAmbientEQ); controller_ = GetController(); + + native_display_delegate_ = + new display::test::TestNativeDisplayDelegate(logger_.get()); + display_manager()->configurator()->SetDelegateForTesting( + std::unique_ptr<display::NativeDisplayDelegate>( + native_display_delegate_)); + display_change_observer_ = + std::make_unique<display::DisplayChangeObserver>(display_manager()); + test_api_ = std::make_unique<display::DisplayConfigurator::TestApi>( + display_manager()->configurator()); + } + + void ConfigureMulipleDisplaySetup() { + const gfx::Size kDisplaySize{1024, 768}; + owned_snapshots_.clear(); + owned_snapshots_.emplace_back( + display::FakeDisplaySnapshot::Builder() + .SetId(kInternalDisplayId) + .SetNativeMode(kDisplaySize) + .SetCurrentMode(kDisplaySize) + .SetType(display::DISPLAY_CONNECTION_TYPE_INTERNAL) + .SetOrigin({0, 0}) + .Build()); + owned_snapshots_.emplace_back(display::FakeDisplaySnapshot::Builder() + .SetId(kExternalDisplayId) + .SetNativeMode(kDisplaySize) + .SetCurrentMode(kDisplaySize) + .SetOrigin({1030, 0}) + .Build()); + + std::vector<display::DisplaySnapshot*> outputs = { + owned_snapshots_[0].get(), owned_snapshots_[1].get()}; + + native_display_delegate_->set_outputs(outputs); + display_manager()->configurator()->OnConfigurationChanged(); + EXPECT_TRUE(test_api_->TriggerConfigureTimeout()); + display_change_observer_->GetStateForDisplayIds(outputs); + display_change_observer_->OnDisplayModeChanged(outputs); + } + + void TearDown() override { + // DisplayChangeObserver access DeviceDataManager in its destructor, so + // destroy it first. + display_change_observer_ = nullptr; + NightLightTest::TearDown(); } protected: base::test::ScopedFeatureList features_; - NightLightControllerImpl* controller_; // Not owned. + std::vector<std::unique_ptr<display::DisplaySnapshot>> owned_snapshots_; + std::unique_ptr<display::test::ActionLogger> logger_; + + // Not owned. + NightLightControllerImpl* controller_; + display::test::TestNativeDisplayDelegate* native_display_delegate_; + std::unique_ptr<display::DisplayChangeObserver> display_change_observer_; + std::unique_ptr<display::DisplayConfigurator::TestApi> test_api_; }; // static @@ -1934,6 +1930,69 @@ EXPECT_EQ(kDefaultScalingFactors, controller_->ambient_rgb_scaling_factors()); } +TEST_F(AmbientEQTest, TestAmbientColorMatrix) { + ConfigureMulipleDisplaySetup(); + SetNightLightEnabled(false); + SetAmbientColorPrefEnabled(true); + auto scaling_factors = GetAllDisplaysCompositorsRGBScaleFactors(); + // If no temperature is set, we expect 1.0 for each scaling factor. + for (const gfx::Vector3dF& rgb : scaling_factors) { + EXPECT_TRUE((rgb - gfx::Vector3dF(1.0f, 1.0f, 1.0f)).IsZero()); + } + + // Turn color temperature down. + float ambient_temperature = SimulateAmbientColorFromPowerd(8000, 7350.0f); + auto internal_rgb = GetDisplayCompositorRGBScaleFactors(kInternalDisplayId); + auto external_rgb = GetDisplayCompositorRGBScaleFactors(kExternalDisplayId); + + // A cool temperature should affect only red and green. + EXPECT_LT(internal_rgb.x(), 1.0f); + EXPECT_LT(internal_rgb.y(), 1.0f); + EXPECT_EQ(internal_rgb.z(), 1.0f); + + // The external display should not be affected. + EXPECT_TRUE((external_rgb - gfx::Vector3dF(1.0f, 1.0f, 1.0f)).IsZero()); + + // Turn color temperature up. + ambient_temperature = SimulateAmbientColorFromPowerd(2700, 5800.0f); + internal_rgb = GetDisplayCompositorRGBScaleFactors(kInternalDisplayId); + external_rgb = GetDisplayCompositorRGBScaleFactors(kExternalDisplayId); + + // A warm temperature should affect only green and blue. + EXPECT_EQ(internal_rgb.x(), 1.0f); + EXPECT_LT(internal_rgb.y(), 1.0f); + EXPECT_LT(internal_rgb.z(), 1.0f); + + // The external display should not be affected. + EXPECT_TRUE((external_rgb - gfx::Vector3dF(1.0f, 1.0f, 1.0f)).IsZero()); +} + +TEST_F(AmbientEQTest, TestNightLightAndAmbientColorInteraction) { + ConfigureMulipleDisplaySetup(); + + SetNightLightEnabled(true); + + auto night_light_rgb = GetAllDisplaysCompositorsRGBScaleFactors().front(); + + SetAmbientColorPrefEnabled(true); + + auto night_light_and_ambient_rgb = + GetDisplayCompositorRGBScaleFactors(kInternalDisplayId); + // Ambient color with neutral temperature should not affect night light. + EXPECT_TRUE((night_light_rgb - night_light_and_ambient_rgb).IsZero()); + + SimulateAmbientColorFromPowerd(2700, 5800.0f); + + night_light_and_ambient_rgb = + GetDisplayCompositorRGBScaleFactors(kInternalDisplayId); + + // Red should not be affected by a warmed ambient temperature. + EXPECT_EQ(night_light_and_ambient_rgb.x(), night_light_rgb.x()); + // Green and blue should be lowered instead. + EXPECT_LT(night_light_and_ambient_rgb.y(), night_light_rgb.y()); + EXPECT_LT(night_light_and_ambient_rgb.z(), night_light_rgb.z()); +} + } // namespace } // namespace ash
diff --git a/ash/system/palette/palette_tray_unittest.cc b/ash/system/palette/palette_tray_unittest.cc index 5d8ea73..590e853 100644 --- a/ash/system/palette/palette_tray_unittest.cc +++ b/ash/system/palette/palette_tray_unittest.cc
@@ -31,7 +31,6 @@ #include "base/command_line.h" #include "base/memory/ptr_util.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "chromeos/constants/chromeos_switches.h" #include "chromeos/services/assistant/public/cpp/assistant_prefs.h"
diff --git a/ash/wm/native_cursor_manager_ash_unittest.cc b/ash/wm/native_cursor_manager_ash_unittest.cc index 077c611..5e2765c 100644 --- a/ash/wm/native_cursor_manager_ash_unittest.cc +++ b/ash/wm/native_cursor_manager_ash_unittest.cc
@@ -8,7 +8,6 @@ #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/wm/cursor_manager_test_api.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/test/aura_test_utils.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/test/test_windows.h"
diff --git a/ash/wm/overview/overview_controller_unittest.cc b/ash/wm/overview/overview_controller_unittest.cc index b9343f3..6a870bb 100644 --- a/ash/wm/overview/overview_controller_unittest.cc +++ b/ash/wm/overview/overview_controller_unittest.cc
@@ -30,7 +30,6 @@ #include "base/command_line.h" #include "base/feature_list.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "chromeos/constants/chromeos_features.h" #include "ui/aura/client/window_types.h" #include "ui/base/hit_test.h"
diff --git a/ash/wm/overview/scoped_overview_transform_window_unittest.cc b/ash/wm/overview/scoped_overview_transform_window_unittest.cc index 8ca20684..4edeeb1 100644 --- a/ash/wm/overview/scoped_overview_transform_window_unittest.cc +++ b/ash/wm/overview/scoped_overview_transform_window_unittest.cc
@@ -10,7 +10,6 @@ #include "ash/wm/overview/overview_utils.h" #include "ash/wm/window_state.h" #include "base/numerics/safe_conversions.h" -#include "base/test/scoped_feature_list.h" #include "ui/aura/window.h" #include "ui/display/display.h" #include "ui/display/manager/display_manager.h"
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc index 172c1382..7e7ed28c 100644 --- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc +++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -43,7 +43,6 @@ #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/user_action_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "chromeos/constants/chromeos_switches.h" #include "chromeos/dbus/power/fake_power_manager_client.h"
diff --git a/ash/wm/toplevel_window_event_handler_unittest.cc b/ash/wm/toplevel_window_event_handler_unittest.cc index 286797b..f254dfb 100644 --- a/ash/wm/toplevel_window_event_handler_unittest.cc +++ b/ash/wm/toplevel_window_event_handler_unittest.cc
@@ -30,7 +30,6 @@ #include "base/bind.h" #include "base/compiler_specific.h" #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/client/aura_constants.h"
diff --git a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc index d6addb5..1b18beb7 100644 --- a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -65,6 +65,7 @@ // Semantically equivalent to base::Lock::Acquire(). while (!g_initialization_lock.compare_exchange_strong( expected, true, std::memory_order_acquire, std::memory_order_acquire)) { + expected = false; } root = g_root_.load(std::memory_order_relaxed);
diff --git a/base/allocator/partition_allocator/thread_cache.h b/base/allocator/partition_allocator/thread_cache.h index e1d0c34..3e991b8 100644 --- a/base/allocator/partition_allocator/thread_cache.h +++ b/base/allocator/partition_allocator/thread_cache.h
@@ -9,7 +9,6 @@ #include <cstdint> #include <memory> -#include "base/allocator/partition_allocator/checked_ptr_support.h" #include "base/allocator/partition_allocator/partition_alloc_forward.h" #include "base/allocator/partition_allocator/partition_cookie.h" #include "base/allocator/partition_allocator/partition_freelist_entry.h" @@ -19,7 +18,6 @@ #include "base/no_destructor.h" #include "base/partition_alloc_buildflags.h" #include "base/synchronization/lock.h" -#include "build/build_config.h" namespace base { @@ -95,6 +93,10 @@ #define GET_COUNTER(counter) 0 #endif // defined(PA_ENABLE_THREAD_CACHE_STATISTICS) +ALWAYS_INLINE static constexpr int ConstexprLog2(size_t n) { + return n < 1 ? -1 : (n < 2 ? 0 : (1 + ConstexprLog2(n >> 1))); +} + // Per-thread cache. *Not* threadsafe, must only be accessed from a single // thread. // @@ -170,14 +172,11 @@ }; // TODO(lizeb): Optimize the threshold. -#if defined(ARCH_CPU_64_BITS) || ENABLE_TAG_FOR_MTE_CHECKED_PTR - static constexpr size_t kBucketCount = 41; -#else - static constexpr size_t kBucketCount = 49; -#endif - // Checked in ThreadCache::Init(), not with static_assert() as the size is not - // set at compile-time. static constexpr size_t kSizeThreshold = 512; + static constexpr size_t kBucketCount = + ((ConstexprLog2(kSizeThreshold) - kMinBucketedOrder + 1) + << kNumBucketsPerOrderBits) + + 1; static_assert( kBucketCount < kNumBuckets, "Cannot have more cached buckets than what the allocator supports");
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt index 376eba4..c60b9952 100644 --- a/build/check_gn_headers_whitelist.txt +++ b/build/check_gn_headers_whitelist.txt
@@ -90,7 +90,6 @@ content/renderer/external_popup_menu.h content/shell/android/shell_descriptors.h extensions/browser/api/clipboard/clipboard_api.h -extensions/browser/api/networking_config/networking_config_service_factory.h extensions/browser/api/webcam_private/webcam.h extensions/browser/api/webcam_private/webcam_private_api.h extensions/browser/entry_info.h
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn index 2959d53..212c949 100644 --- a/build/config/BUILDCONFIG.gn +++ b/build/config/BUILDCONFIG.gn
@@ -130,10 +130,6 @@ # separate flags. is_official_build = false - # Whether we're a traditional desktop unix. - # Deprecated: Please use `is_linux` instead. See https://crbug.com/1132395 - is_desktop_linux = current_os == "linux" - # Set to true when compiling with the Clang compiler. is_clang = current_os != "linux" || (current_cpu != "s390x" && current_cpu != "s390" &&
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index c38fef7..b23c95d 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -96,7 +96,7 @@ # the microarchitectures we are using. This is only used if # clang_use_default_sample_profile is true and clang_sample_profile_path is # empty. - chromeos_afdo_platform = "silvermont" + chromeos_afdo_platform = "atom" # Emit debug information for profiling wile building with clang. clang_emit_debug_info_for_profiling = false @@ -2203,10 +2203,14 @@ if (is_android) { _clang_sample_profile = "//chrome/android/profiles/afdo.prof" } else { + # TODO(crbug/1135245): Remove silvermont, airmont and broadwell after + # the change atom and bigcore reaches Chrome OS. assert( chromeos_afdo_platform == "silvermont" || chromeos_afdo_platform == "airmont" || - chromeos_afdo_platform == "broadwell", + chromeos_afdo_platform == "broadwell" || + chromeos_afdo_platform == "atom" || + chromeos_afdo_platform == "bigcore", "Only silvermont, airmont and broadwell are valid Chrome OS profiles.") _clang_sample_profile = "//chromeos/profiles/${chromeos_afdo_platform}.afdo.prof"
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index cbb63df1..b53876c 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20201012.1.1 +0.20201012.2.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index cbb63df1..b53876c 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20201012.1.1 +0.20201012.2.1
diff --git a/build/toolchain/concurrent_links.gni b/build/toolchain/concurrent_links.gni index 6ba25a1d..7671316 100644 --- a/build/toolchain/concurrent_links.gni +++ b/build/toolchain/concurrent_links.gni
@@ -93,7 +93,8 @@ } } } else { - assert(!use_thin_lto, "can't explicitly set concurrent_links with thinlto") + assert(!use_thin_lto || concurrent_links == 1, + "can't explicitly set concurrent_links with thinlto") concurrent_links_logs = [ "concurrent_links set by GN arg (value=$concurrent_links)" ] }
diff --git a/cc/paint/image_transfer_cache_entry.cc b/cc/paint/image_transfer_cache_entry.cc index 90a0cf13..15c3bf6 100644 --- a/cc/paint/image_transfer_cache_entry.cc +++ b/cc/paint/image_transfer_cache_entry.cc
@@ -352,8 +352,8 @@ DLOG(ERROR) << "Could not generate mipmap chain for plane " << plane; return false; } - plane_sizes_.push_back( - GrContext::ComputeImageSize(plane_images[plane], GrMipMapped::kYes)); + plane_sizes_.push_back(GrDirectContext::ComputeImageSize( + plane_images[plane], GrMipMapped::kYes)); safe_total_size += plane_sizes_.back(); } if (!safe_total_size.AssignIfValid(&size_)) { @@ -473,7 +473,8 @@ return false; DCHECK(plane->isTextureBacked()); - const size_t plane_size = GrContext::ComputeImageSize(plane, gr_mips); + const size_t plane_size = + GrDirectContext::ComputeImageSize(plane, gr_mips); size_ += plane_size; plane_sizes_.push_back(plane_size); @@ -542,7 +543,7 @@ if (image_) { // Match GrTexture::onGpuMemorySize so that memory traces agree. auto gr_mips = has_mips_ ? GrMipMapped::kYes : GrMipMapped::kNo; - size_ = GrContext::ComputeImageSize(image_, gr_mips); + size_ = GrDirectContext::ComputeImageSize(image_, gr_mips); } return !!image_; @@ -623,8 +624,8 @@ if (!mipped_plane) return; mipped_planes.push_back(std::move(mipped_plane)); - mipped_plane_sizes.push_back( - GrContext::ComputeImageSize(mipped_planes.back(), GrMipMapped::kYes)); + mipped_plane_sizes.push_back(GrDirectContext::ComputeImageSize( + mipped_planes.back(), GrMipMapped::kYes)); } sk_sp<SkImage> mipped_image = MakeYUVImageFromUploadedPlanes( context_, mipped_planes, plane_images_format_, yuv_color_space_.value(),
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc index 75d0bb0c..e1fd61d 100644 --- a/cc/tiles/gpu_image_decode_cache.cc +++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -471,7 +471,7 @@ size_t GetUploadedTextureSizeFromSkImage(const sk_sp<SkImage>& plane, const GrMipMapped mipped) { - const size_t plane_size = GrContext::ComputeImageSize(plane, mipped); + const size_t plane_size = GrDirectContext::ComputeImageSize(plane, mipped); return plane_size; }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index c26f3e41..b664b69 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -1500,7 +1500,8 @@ } java_cpp_enum("context_menu_image_format_enum_javagen") { - sources = [ "browser/android/context_menu/chrome_context_menu_populator.h" ] + sources = + [ "browser/android/context_menu/context_menu_native_delegate_impl.h" ] } source_set("chrome_android_core") {
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 5847138f..5ff8171 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -570,6 +570,13 @@ # Include sources from public_tab_management_java_sources.gni. sources += public_tab_management_java_sources + if (enable_arcore) { + deps += [ + "//components/webxr/android:ar_java_base", + "//components/webxr/android:webxr_android_enums_java", + ] + } + if (enable_vr) { deps += [ ":chrome_vr_java_resources" ] } @@ -660,6 +667,7 @@ ":chrome_jni_headers", "//chrome/android/features/autofill_assistant:jni_headers", "//chrome/android/features/keyboard_accessory:jni_headers", + "//chrome/browser/contextmenu:jni_headers", "//chrome/browser/download/android:jni_headers", "//chrome/browser/enterprise/util:jni_headers", "//chrome/browser/flags:jni_headers", @@ -715,7 +723,6 @@ java_cpp_enum("chrome_vr_android_java_enums_srcjar") { sources = [ - "//chrome/browser/android/vr/arcore_device/arcore_install_helper.h", "//chrome/browser/android/vr/vrcore_install_helper.h", "//chrome/browser/vr/text_edit_action.h", "//chrome/browser/vr/ui_test_input.h", @@ -750,7 +757,11 @@ "//components/resources/android/page_info_resource_id.h", "//components/resources/android/permissions_resource_id.h", "//components/resources/android/sms_resource_id.h", + "//components/resources/android/webxr_resource_id.h", + "$root_gen_dir/device/vr/buildflags/buildflags.h", ] + + deps = [ "//device/vr/buildflags" ] } junit_binary("chrome_junit_tests") { @@ -792,6 +803,7 @@ "//chrome/browser/android/lifecycle:java", "//chrome/browser/browser_controls/android:java", "//chrome/browser/browser_controls/android:junit", + "//chrome/browser/contextmenu:java", "//chrome/browser/device:java", "//chrome/browser/device:junit", "//chrome/browser/download/android:java", @@ -2572,7 +2584,7 @@ # Include ArCore files directly instead of using bundles. deps += [ - "//chrome/browser/android/vr:ar_java", + "//components/webxr/android:ar_java", "//third_party/arcore-android-sdk-client:com_google_ar_core_java", ] @@ -3127,7 +3139,6 @@ "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java", "java/src/org/chromium/chrome/browser/consent_auditor/ConsentAuditorBridge.java", "java/src/org/chromium/chrome/browser/content/ContentUtils.java", - "java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java", "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java", "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchContext.java", "java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index 6022e71..ced2583 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -787,6 +787,9 @@ "java/res/layout/account_picker_row_legacy.xml", "java/res/layout/add_languages_main.xml", "java/res/layout/add_to_homescreen_dialog.xml", + "java/res/layout/add_to_menu_dialog.xml", + "java/res/layout/add_to_menu_dialog_item.xml", + "java/res/layout/add_to_menu_item.xml", "java/res/layout/auto_sign_in_first_run_dialog.xml", "java/res/layout/autofill_billing_address_dropdown.xml", "java/res/layout/autofill_card_unmask_prompt.xml", @@ -1061,6 +1064,7 @@ "java/res/xml/main_preferences.xml", "java/res/xml/manage_sync_preferences.xml", "java/res/xml/notifications_preferences.xml", + "java/res/xml/phone_as_a_security_key_accessory_filter.xml", "java/res/xml/privacy_preferences.xml", "java/res/xml/search_widget_info.xml", "java/res/xml/sync_and_services_preferences.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 18bb5e3..9d0ef2a 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -69,6 +69,7 @@ "java/src/org/chromium/chrome/browser/accessibility_tab_switcher/OverviewListLayout.java", "java/src/org/chromium/chrome/browser/announcement/AnnouncementNotificationManager.java", "java/src/org/chromium/chrome/browser/app/ChromeActivity.java", + "java/src/org/chromium/chrome/browser/app/appmenu/AddToMenuItemViewBinder.java", "java/src/org/chromium/chrome/browser/app/appmenu/AppMenuIconRowFooter.java", "java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java", "java/src/org/chromium/chrome/browser/app/appmenu/ChipViewMenuItemViewBinder.java", @@ -138,6 +139,9 @@ "java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeBackgroundTaskFactory.java", "java/src/org/chromium/chrome/browser/background_task_scheduler/ChromeNativeBackgroundTaskDelegate.java", "java/src/org/chromium/chrome/browser/background_task_scheduler/ProxyNativeTask.java", + "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpController.java", + "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerFactory.java", + "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java", "java/src/org/chromium/chrome/browser/banners/AppBannerManager.java", "java/src/org/chromium/chrome/browser/banners/AppData.java", "java/src/org/chromium/chrome/browser/banners/AppDetailsDelegate.java", @@ -1697,5 +1701,6 @@ "java/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequest.java", "java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java", "java/src/org/chromium/chrome/browser/webauth/HandlerResponseCallback.java", + "java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorActivity.java", "java/src/org/chromium/chrome/browser/webshare/ShareServiceImplementationFactory.java", ]
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni index 3a01f19..09a67c7 100644 --- a/chrome/android/chrome_public_apk_tmpl.gni +++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -504,7 +504,7 @@ if (!enable_chrome_module) { deps += [ - "//chrome/browser/android/vr:ar_java", + "//components/webxr/android:ar_java", "//third_party/arcore-android-sdk-client:com_google_ar_core_java", ] }
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 730a988..42e00b6 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -559,6 +559,7 @@ "javatests/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataTest.java", "javatests/src/org/chromium/chrome/browser/tab/state/FilePersistedTabDataStorageTest.java", "javatests/src/org/chromium/chrome/browser/tab/state/PersistedTabDataTest.java", + "javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java", "javatests/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorControllerTest.java", "javatests/src/org/chromium/chrome/browser/tabmodel/AsyncTabCreationParamsManagerTest.java", "javatests/src/org/chromium/chrome/browser/tabmodel/ChromeTabCreatorTest.java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected index fb169ac..6060768 100644 --- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -596,6 +596,16 @@ <category android:name="android.intent.category.DEFAULT"/> </intent-filter> # DIFF-ANCHOR: 9c5197e9 </activity> # DIFF-ANCHOR: aea75380 + <activity # DIFF-ANCHOR: a1fac31f + android:exported="false" + android:label="@string/cablev2_activity_title" + android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity" + android:theme="@style/Theme.Chromium.Activity.Fullscreen"> + <intent-filter> # DIFF-ANCHOR: 5873407a + <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> + </intent-filter> # DIFF-ANCHOR: 5873407a + <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/phone_as_a_security_key_accessory_filter"/> + </activity> # DIFF-ANCHOR: a1fac31f <activity # DIFF-ANCHOR: 1d9b4077 android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" android:excludeFromRecents="true"
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected index 9ac3cf4..c907fa2 100644 --- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected +++ b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
@@ -569,6 +569,16 @@ <category android:name="android.intent.category.DEFAULT"/> </intent-filter> # DIFF-ANCHOR: 9c5197e9 </activity> # DIFF-ANCHOR: aea75380 + <activity # DIFF-ANCHOR: a1fac31f + android:exported="false" + android:label="@string/cablev2_activity_title" + android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity" + android:theme="@style/Theme.Chromium.Activity.Fullscreen"> + <intent-filter> # DIFF-ANCHOR: 5873407a + <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> + </intent-filter> # DIFF-ANCHOR: 5873407a + <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/phone_as_a_security_key_accessory_filter"/> + </activity> # DIFF-ANCHOR: a1fac31f <activity # DIFF-ANCHOR: 1d9b4077 android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" android:excludeFromRecents="true"
diff --git a/chrome/android/features/ar/ar_module.gni b/chrome/android/features/ar/ar_module.gni index 65266de9..7a4462f 100644 --- a/chrome/android/features/ar/ar_module.gni +++ b/chrome/android/features/ar/ar_module.gni
@@ -13,7 +13,7 @@ ar_module_desc = { name = "ar" java_deps = [ - "//chrome/browser/android/vr:ar_java", + "//components/webxr/android:ar_java", "//third_party/arcore-android-sdk-client:com_google_ar_core_java", ] android_manifest = "//chrome/android/features/ar/AndroidManifest.xml"
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java index c0df0289..204efd32 100644 --- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java +++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
@@ -107,8 +107,8 @@ } public CableAuthenticator(Context context, CableAuthenticatorUI ui, long networkContext, - long instanceIdDriver, String activityClassName, String fragmentClassName, - boolean isFcmNotification, UsbAccessory accessory) { + long instanceIdDriver, String activityClassName, boolean isFcmNotification, + UsbAccessory accessory) { mContext = context; mUi = ui; mCallback = ui; @@ -129,7 +129,7 @@ assert mTaskRunner.belongsToCurrentThread(); byte[] newStateBytes = CableAuthenticatorJni.get().setup( - instanceIdDriver, activityClassName, fragmentClassName, networkContext, stateBytes); + instanceIdDriver, activityClassName, networkContext, stateBytes); if (newStateBytes.length > 0) { Log.i(TAG, "Writing updated state"); prefs.edit() @@ -464,7 +464,7 @@ // TODO: localize @SuppressLint("SetTextI18n") @CalledByNative - public static void showNotification(String activityClassName, String fragmentClassName) { + public static void showNotification(String activityClassName) { Context context = ContextUtils.getApplicationContext(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -491,7 +491,6 @@ } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - intent.putExtra("show_fragment", fragmentClassName); Bundle bundle = new Bundle(); bundle.putBoolean("org.chromium.chrome.modules.cablev2_authenticator.FCM", true); intent.putExtra("show_fragment_args", bundle); @@ -519,8 +518,8 @@ * ignored. It returns an empty byte array if the given state is valid, or the new contents * of the persisted state otherwise. */ - byte[] setup(long instanceIdDriver, String activityClassName, String fragmentClassName, - long networkContext, byte[] stateBytes); + byte[] setup(long instanceIdDriver, String activityClassName, long networkContext, + byte[] stateBytes); /** * Called to instruct the C++ code to start a new transaction using |usbDevice|.
diff --git a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java index 7a50082..e099c99 100644 --- a/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java +++ b/chrome/android/features/cablev2_authenticator/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorUI.java
@@ -60,18 +60,15 @@ "org.chromium.chrome.modules.cablev2_authenticator.NetworkContext"); final long instanceIdDriver = arguments.getLong( "org.chromium.chrome.modules.cablev2_authenticator.InstanceIDDriver"); - final String settingsActivityClassName = arguments.getString( - "org.chromium.chrome.modules.cablev2_authenticator.SettingsActivityClassName"); - final String wrapperClassName = arguments.getString( - "org.chromium.chrome.modules.cablev2_authenticator.WrapperClassName"); + final String activityClassName = arguments.getString( + "org.chromium.chrome.modules.cablev2_authenticator.ActivityClassName"); final boolean isFcmNotification = arguments.getBoolean("org.chromium.chrome.modules.cablev2_authenticator.FCM"); mPermissionDelegate = new ActivityAndroidPermissionDelegate( new WeakReference<Activity>((Activity) context)); - mAuthenticator = - new CableAuthenticator(getContext(), this, networkContext, instanceIdDriver, - settingsActivityClassName, wrapperClassName, isFcmNotification, accessory); + mAuthenticator = new CableAuthenticator(getContext(), this, networkContext, + instanceIdDriver, activityClassName, isFcmNotification, accessory); } @Override
diff --git a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc index 324fc932..ada1595 100644 --- a/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc +++ b/chrome/android/features/cablev2_authenticator/native/cablev2_authenticator_android.cc
@@ -95,9 +95,6 @@ // activity_class_name is the name of a Java class that should be the target // of any notifications shown. std::string activity_class_name; - // fragment_class_name is the name of a Java class that is passed to the - // |activity_class_name| when a notification is activated. - std::string fragment_class_name; // last_event stores the last cloud message received. Android strongly // discourages keeping state inside the notification itself. Thus @@ -144,10 +141,8 @@ global_data.last_event = std::move(event); Java_CableAuthenticator_showNotification( - global_data.env, - ConvertUTF8ToJavaString(global_data.env, global_data.activity_class_name), - ConvertUTF8ToJavaString(global_data.env, - global_data.fragment_class_name)); + global_data.env, ConvertUTF8ToJavaString( + global_data.env, global_data.activity_class_name)); } // AndroidBLEAdvert wraps a Java |BLEAdvert| object so that @@ -321,7 +316,6 @@ JNIEnv* env, jlong instance_id_driver_long, const JavaParamRef<jstring>& activity_class_name, - const JavaParamRef<jstring>& fragment_class_name, jlong network_context_long, const JavaParamRef<jbyteArray>& state_bytes) { std::vector<uint8_t> serialized_state; @@ -349,8 +343,6 @@ global_data.env = env; global_data.activity_class_name = ConvertJavaStringToUTF8(activity_class_name); - global_data.fragment_class_name = - ConvertJavaStringToUTF8(fragment_class_name); static_assert(sizeof(jlong) >= sizeof(void*), ""); auto* instance_id_driver =
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java index 9b35e8e..6704c21 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -1582,7 +1582,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)).check(matches(not(isDisplayed()))); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); } @Test @@ -1615,7 +1615,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)).check(matches(not(isDisplayed()))); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); Espresso.pressBack(); // Navigate, and verify the chip is shown. @@ -1624,7 +1624,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)) + onView(withId(R.id.page_info_button)) .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); Espresso.pressBack(); @@ -1640,7 +1640,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)).check(matches(not(isDisplayed()))); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); Espresso.pressBack(); // Back to previous page, and verify the chip is back. @@ -1649,15 +1649,15 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)) + onView(withId(R.id.page_info_button)) .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); // Click the chip and check the tab navigates back to the search result page. assertEquals(mUrl, ChromeTabUtils.getUrlStringOnUiThread(currentTab)); OverviewModeBehaviorWatcher hideWatcher = TabUiTestHelper.createOverviewHideWatcher(cta); - onView(withId(R.id.search_button)) + onView(withId(R.id.page_info_button)) .check(waitForView(allOf(withText(expectedTerm), isDisplayed()))); - onView(withId(R.id.search_button)).perform(click()); + onView(withId(R.id.page_info_button)).perform(click()); hideWatcher.waitForBehavior(); ChromeTabUtils.waitForTabPageLoaded(currentTab, searchUrl.get()); @@ -1666,7 +1666,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)).check(matches(not(isDisplayed()))); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); } @Test @@ -1695,7 +1695,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)).check(matches(not(isDisplayed()))); + onView(withId(R.id.page_info_button)).check(matches(not(isDisplayed()))); Espresso.pressBack(); // Navigate, and verify the chip is shown. @@ -1704,7 +1704,7 @@ enterTabSwitcher(mActivityTestRule.getActivity()); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); - onView(withId(R.id.search_button)) + onView(withId(R.id.page_info_button)) .check(waitForView(allOf(withText(searchTerm), isDisplayed()))); // Switch the default search engine from google.com to yahoo.com, the search chip icon @@ -1712,7 +1712,7 @@ RecyclerView tabListRecyclerView = cta.findViewById(R.id.tab_list_view); ChipView chipView = tabListRecyclerView.findViewHolderForAdapterPosition(0).itemView.findViewById( - R.id.search_button); + R.id.page_info_button); ChromeImageView iconImageView = (ChromeImageView) chipView.getChildAt(0); Drawable googleDrawable = iconImageView.getDrawable();
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml index 0e9a410..9f9c19e 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -80,7 +80,7 @@ android:visibility="gone" style="@style/FilledButton"/> <org.chromium.ui.widget.ChipView - android:id="@+id/search_button" + android:id="@+id/page_info_button" android:gravity="center" android:layout_height="wrap_content" android:layout_width="wrap_content"
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java index 52af86c..03366192 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -128,12 +128,13 @@ view.setForeground(model.get(TabProperties.IS_SELECTED) ? drawable : null); } if (TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue()) { - ChipView searchButton = (ChipView) view.fastFindViewById(R.id.search_button); - searchButton.getPrimaryTextView().setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); - searchButton.getPrimaryTextView().setEllipsize(TextUtils.TruncateAt.END); + ChipView pageInfoButton = (ChipView) view.fastFindViewById(R.id.page_info_button); + pageInfoButton.getPrimaryTextView().setTextAlignment( + View.TEXT_ALIGNMENT_VIEW_START); + pageInfoButton.getPrimaryTextView().setEllipsize(TextUtils.TruncateAt.END); // TODO(crbug.com/1048255): The selected state of ChipView doesn't look elevated. // Fix the elevation in style instead. - searchButton.setSelected(false); + pageInfoButton.setSelected(false); } } else if (TabProperties.FAVICON == propertyKey) { Drawable favicon = model.get(TabProperties.FAVICON); @@ -207,29 +208,43 @@ view.setAccessibilityDelegate(model.get(TabProperties.ACCESSIBILITY_DELEGATE)); } else if (TabProperties.SEARCH_QUERY == propertyKey) { String query = model.get(TabProperties.SEARCH_QUERY); - ChipView searchButton = (ChipView) view.fastFindViewById(R.id.search_button); + ChipView pageInfoButton = (ChipView) view.fastFindViewById(R.id.page_info_button); if (TextUtils.isEmpty(query)) { - searchButton.setVisibility(View.GONE); + pageInfoButton.setVisibility(View.GONE); } else { - searchButton.setVisibility(View.VISIBLE); - searchButton.getPrimaryTextView().setText(query); + // Search query and price string are mutually exclusive + assert TextUtils.isEmpty(model.get(TabProperties.PRICE_STRING)); + pageInfoButton.setVisibility(View.VISIBLE); + pageInfoButton.getPrimaryTextView().setText(query); } - } else if (TabProperties.SEARCH_LISTENER == propertyKey) { - TabListMediator.TabActionListener listener = model.get(TabProperties.SEARCH_LISTENER); - ChipView searchButton = (ChipView) view.fastFindViewById(R.id.search_button); + } else if (TabProperties.PRICE_STRING == propertyKey) { + String priceString = model.get(TabProperties.PRICE_STRING); + ChipView pageInfoButton = (ChipView) view.fastFindViewById(R.id.page_info_button); + if (TextUtils.isEmpty(priceString)) { + pageInfoButton.setVisibility(View.GONE); + } else { + // Price string and search query are mutually exclusive + assert TextUtils.isEmpty(model.get(TabProperties.SEARCH_QUERY)); + pageInfoButton.setVisibility(View.VISIBLE); + pageInfoButton.getPrimaryTextView().setText(priceString); + } + } else if (TabProperties.PAGE_INFO_LISTENER == propertyKey) { + TabListMediator.TabActionListener listener = + model.get(TabProperties.PAGE_INFO_LISTENER); + ChipView pageInfoButton = (ChipView) view.fastFindViewById(R.id.page_info_button); if (listener == null) { - searchButton.setOnClickListener(null); + pageInfoButton.setOnClickListener(null); return; } - searchButton.setOnClickListener(v -> { + pageInfoButton.setOnClickListener(v -> { int tabId = model.get(TabProperties.TAB_ID); listener.run(tabId); }); - } else if (TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID == propertyKey) { - ChipView searchButton = (ChipView) view.fastFindViewById(R.id.search_button); - int iconDrawableId = model.get(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID); + } else if (TabProperties.PAGE_INFO_ICON_DRAWABLE_ID == propertyKey) { + ChipView pageInfoButton = (ChipView) view.fastFindViewById(R.id.page_info_button); + int iconDrawableId = model.get(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID); boolean shouldTint = iconDrawableId != R.drawable.ic_logo_googleg_24dp; - searchButton.setIcon(iconDrawableId, shouldTint); + pageInfoButton.setIcon(iconDrawableId, shouldTint); } else if (TabProperties.IS_SELECTED == propertyKey) { view.setSelected(model.get(TabProperties.IS_SELECTED)); } else if (TabUiFeatureUtilities.isLaunchPolishEnabled()
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java index 1b8d3a06..3efc4666 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -241,7 +241,7 @@ TabListFaviconProvider tabListFaviconProvider = new TabListFaviconProvider(mContext, mMode == TabListMode.STRIP); - mMediator = new TabListMediator(context, mModel, tabModelSelector, thumbnailProvider, + mMediator = new TabListMediator(context, mModel, mMode, tabModelSelector, thumbnailProvider, titleProvider, tabListFaviconProvider, actionOnRelatedTabs, selectionDelegateProvider, gridCardOnClickListenerProvider, dialogHandler, componentName, itemType);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 086efe70..9bb2ba8 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -49,6 +49,7 @@ import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.tab.TabSelectionType; +import org.chromium.chrome.browser.tab.state.ShoppingPersistedTabData; import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter; import org.chromium.chrome.browser.tabmodel.TabList; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -61,6 +62,7 @@ import org.chromium.chrome.browser.tasks.tab_groups.EmptyTabGroupModelFilterObserver; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupUtils; +import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListMode; import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType; import org.chromium.chrome.tab_ui.R; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; @@ -255,6 +257,7 @@ private final Context mContext; private final TabListModel mModel; + private final @TabListMode int mMode; private final TabModelSelector mTabModelSelector; private final TabActionListener mTabClosedListener; private final PseudoTab.TitleProvider mTitleProvider; @@ -422,6 +425,7 @@ * ChromeActivity. * @param context The context used to get some configuration information. * @param model The Model to keep state about a list of {@link Tab}s. + * @param mode The {@link TabListMode} * @param tabModelSelector {@link TabModelSelector} that will provide and receive signals about * the tabs concerned. * @param thumbnailProvider {@link ThumbnailProvider} to provide screenshot related details. @@ -437,8 +441,8 @@ * @param componentName This is a unique string to identify different components. * @param uiType The type of UI this mediator should be building. */ - public TabListMediator(Context context, TabListModel model, TabModelSelector tabModelSelector, - @Nullable ThumbnailProvider thumbnailProvider, + public TabListMediator(Context context, TabListModel model, @TabListMode int mode, + TabModelSelector tabModelSelector, @Nullable ThumbnailProvider thumbnailProvider, @Nullable PseudoTab.TitleProvider titleProvider, TabListFaviconProvider tabListFaviconProvider, boolean actionOnRelatedTabs, @Nullable SelectionDelegateProvider selectionDelegateProvider, @@ -449,6 +453,7 @@ mTabModelSelector = tabModelSelector; mThumbnailProvider = thumbnailProvider; mModel = model; + mMode = mode; mTabListFaviconProvider = tabListFaviconProvider; mComponentName = componentName; mTitleProvider = titleProvider; @@ -809,7 +814,7 @@ for (int i = 0; i < mModel.size(); i++) { if (mModel.get(i).model.get(CARD_TYPE) != TAB) continue; mModel.get(i).model.set( - TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID, mSearchChipIconDrawableId); + TabProperties.PAGE_INFO_ICON_DRAWABLE_ID, mSearchChipIconDrawableId); } }; TemplateUrlServiceFactory.get().addObserver(mTemplateUrlObserver); @@ -942,11 +947,9 @@ tabsList = new ArrayList<>(tabs); Collections.sort(tabsList, LAST_SHOWN_COMPARATOR); } - mVisible = tabsList != null; if (areTabsUnchanged(tabsList)) { if (tabsList == null) return true; - for (int i = 0; i < tabsList.size(); i++) { PseudoTab tab = tabsList.get(i); boolean isSelected = mTabModelSelector.getCurrentTabId() == tab.getId(); @@ -1034,11 +1037,20 @@ && isRealTab) { mModel.get(index).model.set( TabProperties.SEARCH_QUERY, getLastSearchTerm(pseudoTab.getTab())); - mModel.get(index).model.set(TabProperties.SEARCH_LISTENER, + mModel.get(index).model.set(TabProperties.PAGE_INFO_LISTENER, SearchTermChipUtils.getSearchQueryListener( pseudoTab.getTab(), mTabSelectedListener)); mModel.get(index).model.set( - TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID, mSearchChipIconDrawableId); + TabProperties.PAGE_INFO_ICON_DRAWABLE_ID, mSearchChipIconDrawableId); + } + + if (TabUiFeatureUtilities.ENABLE_PRICE_TRACKING.getValue() && mMode == TabListMode.GRID + && pseudoTab.hasRealTab()) { + ShoppingPersistedTabData.from(pseudoTab.getTab(), (res) -> { + if (!TextUtils.isEmpty(res.getPriceString())) { + mModel.get(index).model.set(TabProperties.PRICE_STRING, res.getPriceString()); + } + }); } updateFaviconForTab(pseudoTab, null); @@ -1249,10 +1261,10 @@ if (TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.getValue() && mUiType == UiType.CLOSABLE && isRealTab) { tabInfo.set(TabProperties.SEARCH_QUERY, getLastSearchTerm(pseudoTab.getTab())); - tabInfo.set(TabProperties.SEARCH_LISTENER, + tabInfo.set(TabProperties.PAGE_INFO_LISTENER, SearchTermChipUtils.getSearchQueryListener( pseudoTab.getTab(), mTabSelectedListener)); - tabInfo.set(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID, mSearchChipIconDrawableId); + tabInfo.set(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID, mSearchChipIconDrawableId); } if (mUiType == UiType.SELECTABLE) {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java index 4d4af28..b95128e1 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
@@ -103,10 +103,13 @@ public static final WritableObjectPropertyKey<String> SEARCH_QUERY = new WritableObjectPropertyKey<>(); - public static final WritableObjectPropertyKey<TabListMediator.TabActionListener> - SEARCH_LISTENER = new WritableObjectPropertyKey<>(); + public static final WritableObjectPropertyKey<String> PRICE_STRING = + new WritableObjectPropertyKey<>(); - public static final PropertyModel.WritableIntPropertyKey SEARCH_CHIP_ICON_DRAWABLE_ID = + public static final WritableObjectPropertyKey<TabListMediator.TabActionListener> + PAGE_INFO_LISTENER = new WritableObjectPropertyKey<>(); + + public static final PropertyModel.WritableIntPropertyKey PAGE_INFO_ICON_DRAWABLE_ID = new PropertyModel.WritableIntPropertyKey(); public static final WritableObjectPropertyKey<String> CONTENT_DESCRIPTION_STRING = @@ -122,8 +125,8 @@ IS_INCOGNITO, SELECTED_TAB_BACKGROUND_DRAWABLE_ID, TABSTRIP_FAVICON_BACKGROUND_COLOR_ID, SELECTABLE_TAB_ACTION_BUTTON_BACKGROUND, SELECTABLE_TAB_ACTION_BUTTON_SELECTED_BACKGROUND, URL_DOMAIN, ACCESSIBILITY_DELEGATE, - SEARCH_QUERY, SEARCH_LISTENER, SEARCH_CHIP_ICON_DRAWABLE_ID, CARD_TYPE, - CONTENT_DESCRIPTION_STRING, CLOSE_BUTTON_DESCRIPTION_STRING}; + SEARCH_QUERY, PAGE_INFO_LISTENER, PAGE_INFO_ICON_DRAWABLE_ID, CARD_TYPE, + CONTENT_DESCRIPTION_STRING, CLOSE_BUTTON_DESCRIPTION_STRING, PRICE_STRING}; public static final PropertyKey[] ALL_KEYS_TAB_STRIP = new PropertyKey[] {TAB_ID, TAB_SELECTED_LISTENER, TAB_CLOSED_LISTENER, FAVICON,
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index 1b954f6..64417af76 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -51,6 +51,11 @@ new BooleanCachedFieldTrialParameter( ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, SEARCH_CHIP_PARAM, false); + private static final String PRICE_TRACKING_PARAM = "enable_price_tracking"; + public static final BooleanCachedFieldTrialParameter ENABLE_PRICE_TRACKING = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, PRICE_TRACKING_PARAM, false); + private static final String SEARCH_CHIP_ADAPTIVE_PARAM = "enable_search_term_chip_adaptive_icon"; public static final BooleanCachedFieldTrialParameter ENABLE_SEARCH_CHIP_ADAPTIVE =
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java index 5b76d8d..afe72d79 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
@@ -54,6 +54,7 @@ public class TabListViewHolderTest extends DummyUiActivityTestCase { private static final int TAB1_ID = 456; private static final int TAB2_ID = 789; + private static final String EXPECTED_PRICE_STRING = "$2.87"; private ViewGroup mTabGridView; private PropertyModel mGridModel; @@ -536,38 +537,54 @@ String searchTerm = "hello world"; testGridSelected(mTabGridView, mGridModel); - ChipView searchButton = mTabGridView.findViewById(R.id.search_button); + ChipView pageInfoButton = mTabGridView.findViewById(R.id.page_info_button); mGridModel.set(TabProperties.SEARCH_QUERY, searchTerm); - Assert.assertEquals(View.VISIBLE, searchButton.getVisibility()); - Assert.assertEquals(searchTerm, searchButton.getPrimaryTextView().getText()); + Assert.assertEquals(View.VISIBLE, pageInfoButton.getVisibility()); + Assert.assertEquals(searchTerm, pageInfoButton.getPrimaryTextView().getText()); mGridModel.set(TabProperties.SEARCH_QUERY, null); - Assert.assertEquals(View.GONE, searchButton.getVisibility()); + Assert.assertEquals(View.GONE, pageInfoButton.getVisibility()); mGridModel.set(TabProperties.SEARCH_QUERY, searchTerm); - Assert.assertEquals(View.VISIBLE, searchButton.getVisibility()); + Assert.assertEquals(View.VISIBLE, pageInfoButton.getVisibility()); mGridModel.set(TabProperties.SEARCH_QUERY, null); - Assert.assertEquals(View.GONE, searchButton.getVisibility()); + Assert.assertEquals(View.GONE, pageInfoButton.getVisibility()); + } + + @Test + @MediumTest + @UiThreadTest + public void testPriceString() { + TabUiFeatureUtilities.ENABLE_PRICE_TRACKING.setForTesting(true); + testGridSelected(mTabGridView, mGridModel); + ChipView pageInfoButton = mTabGridView.findViewById(R.id.page_info_button); + + mGridModel.set(TabProperties.PRICE_STRING, EXPECTED_PRICE_STRING); + Assert.assertEquals(View.VISIBLE, pageInfoButton.getVisibility()); + Assert.assertEquals(EXPECTED_PRICE_STRING, pageInfoButton.getPrimaryTextView().getText()); + + mGridModel.set(TabProperties.PRICE_STRING, null); + Assert.assertEquals(View.GONE, pageInfoButton.getVisibility()); } @Test @MediumTest @UiThreadTest public void testSearchListener() { - ChipView searchButton = mTabGridView.findViewById(R.id.search_button); + ChipView pageInfoButton = mTabGridView.findViewById(R.id.page_info_button); AtomicInteger clickedTabId = new AtomicInteger(Tab.INVALID_TAB_ID); TabListMediator.TabActionListener searchListener = clickedTabId::set; - mGridModel.set(TabProperties.SEARCH_LISTENER, searchListener); + mGridModel.set(TabProperties.PAGE_INFO_LISTENER, searchListener); - searchButton.performClick(); + pageInfoButton.performClick(); Assert.assertEquals(TAB1_ID, clickedTabId.get()); clickedTabId.set(Tab.INVALID_TAB_ID); - mGridModel.set(TabProperties.SEARCH_LISTENER, null); - searchButton.performClick(); + mGridModel.set(TabProperties.PAGE_INFO_LISTENER, null); + pageInfoButton.performClick(); Assert.assertEquals(Tab.INVALID_TAB_ID, clickedTabId.get()); } @@ -575,15 +592,15 @@ @MediumTest @UiThreadTest public void testSearchChipIcon() { - ChipView searchButton = mTabGridView.findViewById(R.id.search_button); - View iconView = searchButton.getChildAt(0); + ChipView pageInfoButton = mTabGridView.findViewById(R.id.page_info_button); + View iconView = pageInfoButton.getChildAt(0); Assert.assertTrue(iconView instanceof ChromeImageView); ChromeImageView iconImageView = (ChromeImageView) iconView; - mGridModel.set(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID, R.drawable.ic_logo_googleg_24dp); + mGridModel.set(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID, R.drawable.ic_logo_googleg_24dp); Drawable googleDrawable = iconImageView.getDrawable(); - mGridModel.set(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID, R.drawable.ic_search); + mGridModel.set(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID, R.drawable.ic_search); Drawable magnifierDrawable = iconImageView.getDrawable(); Assert.assertNotEquals(magnifierDrawable, googleDrawable);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index f86a3dc..3e15b565 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -18,7 +18,9 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.contains; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.refEq; import static org.mockito.Mockito.doAnswer; @@ -75,6 +77,8 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import org.robolectric.annotation.Config; import org.chromium.base.Callback; @@ -82,6 +86,9 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.endpoint_fetcher.EndpointFetcher; +import org.chromium.chrome.browser.endpoint_fetcher.EndpointFetcherJni; +import org.chromium.chrome.browser.endpoint_fetcher.EndpointResponse; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -96,6 +103,7 @@ import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.tab.state.CriticalPersistedTabData; +import org.chromium.chrome.browser.tab.state.PersistedTabDataConfiguration; import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelFilter; @@ -105,6 +113,7 @@ import org.chromium.chrome.browser.tasks.pseudotab.PseudoTab; import org.chromium.chrome.browser.tasks.pseudotab.TabAttributeCache; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; +import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListMode; import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.util.browser.Features; @@ -126,7 +135,9 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Tests for {@link TabListMediator}. @@ -165,6 +176,10 @@ private static final int TAB3_ID = 123; private static final int POSITION1 = 0; private static final int POSITION2 = 1; + private static final String EMPTY_ENDPOINT_RESPONSE = "{}"; + private static final String ENDPOINT_RESPONSE = + "{\"representations\" : [{\"type\" : \"SHOPPING\", \"productTitle\" : \"Book of Pie\"," + + "\"price\" : 3.14, \"currency\" : \"USD\"}]}"; @IntDef({TabListMediatorType.TAB_SWITCHER, TabListMediatorType.TAB_STRIP, TabListMediatorType.TAB_GRID_DIALOG}) @@ -235,6 +250,8 @@ ArgumentCaptor<ComponentCallbacks> mComponentCallbacksCaptor; @Captor ArgumentCaptor<TemplateUrlService.TemplateUrlServiceObserver> mTemplateUrlServiceObserver; + @Mock + EndpointFetcher.Natives mEndpointFetcherJniMock; private TabImpl mTab1; private TabImpl mTab2; @@ -254,6 +271,7 @@ MockitoAnnotations.initMocks(this); mMocker.mock(UrlUtilitiesJni.TEST_HOOKS, mUrlUtilitiesJniMock); + mMocker.mock(EndpointFetcherJni.TEST_HOOKS, mEndpointFetcherJniMock); CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false); TabUiFeatureUtilities.ENABLE_SEARCH_CHIP.setForTesting(true); @@ -322,7 +340,7 @@ mModel = new TabListModel(); TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); - mMediator = new TabListMediator(mContext, mModel, mTabModelSelector, + mMediator = new TabListMediator(mContext, mModel, TabListMode.GRID, mTabModelSelector, mTabContentManager::getTabThumbnailWithCallback, mTitleProvider, mTabListFaviconProvider, false, null, mGridCardOnClickListenerProvider, null, getClass().getSimpleName(), UiType.CLOSABLE); @@ -1828,6 +1846,26 @@ } @Test + public void testPriceTrackingProperty() { + TabUiFeatureUtilities.ENABLE_PRICE_TRACKING.setForTesting(true); + Profile.setLastUsedProfileForTesting(mProfile); + Map<String, String> responses = new HashMap<>(); + responses.put(TAB1_URL, ENDPOINT_RESPONSE); + responses.put(TAB2_URL, EMPTY_ENDPOINT_RESPONSE); + mockEndpointResponse(responses); + PersistedTabDataConfiguration.setUseTestConfig(true); + initAndAssertAllProperties(); + List<Tab> tabs = new ArrayList<>(); + tabs.add(mTabModel.getTabAt(0)); + tabs.add(mTabModel.getTabAt(1)); + + mMediator.resetWithListOfTabs( + PseudoTab.getListOfPseudoTab(tabs), /*quickMode =*/false, /*mruMode =*/false); + assertThat(mModel.get(0).model.get(TabProperties.PRICE_STRING), equalTo("$3.14")); + assertThat(mModel.get(1).model.get(TabProperties.PRICE_STRING), equalTo(null)); + } + + @Test public void testSearchTermProperty_TabGroups_TabSwitcher() { setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER); String searchTerm1 = "hello world"; @@ -1975,7 +2013,7 @@ doReturn(searchUrl).when(navigationEntry0).getOriginalUrl(); mModel.get(0) - .model.get(TabProperties.SEARCH_LISTENER) + .model.get(TabProperties.PAGE_INFO_LISTENER) .run(mModel.get(0).model.get(TabProperties.TAB_ID)); verify(mGridCardOnClickListenerProvider) @@ -2006,7 +2044,7 @@ doReturn(searchUrl).when(navigationEntry).getOriginalUrl(); mModel.get(0) - .model.get(TabProperties.SEARCH_LISTENER) + .model.get(TabProperties.PAGE_INFO_LISTENER) .run(mModel.get(0).model.get(TabProperties.TAB_ID)); verify(mGridCardOnClickListenerProvider) @@ -2026,7 +2064,7 @@ doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); // Re-initialize the mediator to setup TemplateUrlServiceObserver if needed. - mMediator = new TabListMediator(mContext, mModel, mTabModelSelector, + mMediator = new TabListMediator(mContext, mModel, TabListMode.GRID, mTabModelSelector, mTabContentManager::getTabThumbnailWithCallback, mTitleProvider, mTabListFaviconProvider, true, null, null, null, getClass().getSimpleName(), TabProperties.UiType.CLOSABLE); @@ -2037,7 +2075,7 @@ // When the search chip adaptive icon is turned off, the search chip icon is initialized as // R.drawable.ic_search even if the default search engine is google. for (int i = 0; i < mModel.size(); i++) { - assertThat(mModel.get(i).model.get(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID), + assertThat(mModel.get(i).model.get(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID), equalTo(R.drawable.ic_search)); } } @@ -2050,7 +2088,7 @@ doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); // Re-initialize the mediator to setup TemplateUrlServiceObserver if needed. - mMediator = new TabListMediator(mContext, mModel, mTabModelSelector, + mMediator = new TabListMediator(mContext, mModel, TabListMode.GRID, mTabModelSelector, mTabContentManager::getTabThumbnailWithCallback, mTitleProvider, mTabListFaviconProvider, true, null, null, null, getClass().getSimpleName(), TabProperties.UiType.CLOSABLE); @@ -2060,7 +2098,7 @@ // The search chip icon should be initialized as R.drawable.ic_logo_googleg_24dp. for (int i = 0; i < mModel.size(); i++) { - assertThat(mModel.get(i).model.get(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID), + assertThat(mModel.get(i).model.get(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID), equalTo(R.drawable.ic_logo_googleg_24dp)); } @@ -2070,7 +2108,7 @@ // The search chip icon should be updated to R.drawable.ic_search. for (int i = 0; i < mModel.size(); i++) { - assertThat(mModel.get(i).model.get(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID), + assertThat(mModel.get(i).model.get(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID), equalTo(R.drawable.ic_search)); } @@ -2080,7 +2118,7 @@ // The search chip icon should be updated as R.drawable.ic_logo_googleg_24dp. for (int i = 0; i < mModel.size(); i++) { - assertThat(mModel.get(i).model.get(TabProperties.SEARCH_CHIP_ICON_DRAWABLE_ID), + assertThat(mModel.get(i).model.get(TabProperties.PAGE_INFO_ICON_DRAWABLE_ID), equalTo(R.drawable.ic_logo_googleg_24dp)); } } @@ -2416,7 +2454,7 @@ // TODO(crbug.com/1058196): avoid re-instanciate TabListMediator by using annotation. CachedFeatureFlags.setForTesting(TAB_GROUPS_ANDROID, true); - mMediator = new TabListMediator(mContext, mModel, mTabModelSelector, + mMediator = new TabListMediator(mContext, mModel, TabListMode.GRID, mTabModelSelector, mTabContentManager::getTabThumbnailWithCallback, mTitleProvider, mTabListFaviconProvider, actionOnRelatedTabs, null, null, handler, getClass().getSimpleName(), uiType); @@ -2443,4 +2481,21 @@ doReturn(rootId).when(criticalPersistedTabData).getRootId(); } } + + private void mockEndpointResponse(Map<String, String> responses) { + for (Map.Entry<String, String> entry : responses.entrySet()) { + doAnswer(new Answer<Void>() { + @Override + public Void answer(InvocationOnMock invocation) { + Callback callback = (Callback) invocation.getArguments()[8]; + callback.onResult(new EndpointResponse(entry.getValue())); + return null; + } + }) + .when(mEndpointFetcherJniMock) + .nativeFetchOAuth(any(Profile.class), anyString(), contains(entry.getKey()), + anyString(), anyString(), any(String[].class), anyString(), anyLong(), + any(Callback.class)); + } + } }
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index c019a44..b8ce0a9e 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml
@@ -886,6 +886,22 @@ </intent-filter> </activity> + <activity android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity" + android:theme="@style/Theme.Chromium.Activity.Fullscreen" + android:label="@string/cablev2_activity_title" + android:exported="false"> + <!-- This has an intent filter but is not exported. This works + because the intent is sent by the Android system, not another + application. We want to limit this activity to only be invoked by + Chromium or the OS because otherwise applications could fool + Chromium into communicating with a fake USB device. --> + <intent-filter> + <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" /> + </intent-filter> + <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" + android:resource="@xml/phone_as_a_security_key_accessory_filter" /> + </activity> + <receiver android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver" android:exported="false" />
diff --git a/chrome/android/java/ResourceId.template b/chrome/android/java/ResourceId.template index 7dc8a9f..8aa8fe2 100644 --- a/chrome/android/java/ResourceId.template +++ b/chrome/android/java/ResourceId.template
@@ -16,6 +16,7 @@ #include "components/resources/android/page_info_resource_id.h" #include "components/resources/android/permissions_resource_id.h" #include "components/resources/android/sms_resource_id.h" +#include "components/resources/android/webxr_resource_id.h" }; return resourceList; }
diff --git a/chrome/android/java/res/layout/add_to_menu_dialog.xml b/chrome/android/java/res/layout/add_to_menu_dialog.xml new file mode 100644 index 0000000..7e139456 --- /dev/null +++ b/chrome/android/java/res/layout/add_to_menu_dialog.xml
@@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- Copyright 2020 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. +--> + +<ListView xmlns:android="http://schemas.android.com/apk/res/android" + android:divider="@null" + android:layout_height="match_parent" + android:layout_width="match_parent" /> \ No newline at end of file
diff --git a/chrome/android/java/res/layout/add_to_menu_dialog_item.xml b/chrome/android/java/res/layout/add_to_menu_dialog_item.xml new file mode 100644 index 0000000..625a60d --- /dev/null +++ b/chrome/android/java/res/layout/add_to_menu_dialog_item.xml
@@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2020 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. +--> + +<org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + style="@style/AppMenuItemTextViewWithCompoundDrawables" + android:layout_width="match_parent" + android:layout_height="?android:attr/listPreferredItemHeightSmall" + android:background="?android:attr/listChoiceBackgroundIndicator" + android:paddingStart="16dp" + android:paddingEnd="16dp" />
diff --git a/chrome/android/java/res/layout/add_to_menu_item.xml b/chrome/android/java/res/layout/add_to_menu_item.xml new file mode 100644 index 0000000..9ffe836 --- /dev/null +++ b/chrome/android/java/res/layout/add_to_menu_item.xml
@@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2020 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="?android:attr/listPreferredItemHeightSmall" + android:orientation="vertical" > + + <org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables + android:id="@+id/title" + style="@style/AppMenuItemTextViewWithCompoundDrawables" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingStart="16dp" + android:paddingEnd="16dp" + android:background="?android:attr/listChoiceBackgroundIndicator" + android:text="@string/menu_add_to" + android:drawableStart="@drawable/ic_add" /> + +</LinearLayout> \ No newline at end of file
diff --git a/chrome/android/java/res/menu/main_menu_regroup.xml b/chrome/android/java/res/menu/main_menu_regroup.xml index 34a82414..15ad433 100644 --- a/chrome/android/java/res/menu/main_menu_regroup.xml +++ b/chrome/android/java/res/menu/main_menu_regroup.xml
@@ -92,6 +92,31 @@ <item android:id="@+id/recent_tabs_menu_id" android:title="@string/menu_recent_tabs" android:icon="@drawable/devices_black_24dp" /> + <item android:id="@+id/add_to_divider_line_id" + android:title="@null" /> + <item android:id="@+id/add_to_menu_id" + android:title="@string/menu_add_to"> + <menu> + <item android:id="@+id/add_to_bookmarks_menu_id" + android:title="@string/menu_add_to_bookmarks" + android:icon="@drawable/btn_star" /> + <item android:id="@+id/add_to_downloads_menu_id" + android:title="@string/menu_add_to_downloads" + android:icon="@drawable/ic_file_download_white_24dp" /> + <item android:id="@+id/add_to_homescreen_menu_id" + android:title="@string/menu_add_to_homescreen" + android:icon="@drawable/ic_add_to_home_screen" /> + </menu> + </item> + <!-- Duplicating add_to_homescreen/install_app/open_webapk is for + the purpose of experiment, one of them will be removed once the + experiments are done. --> + <item android:id="@+id/install_app_id" + android:title="@string/menu_add_to_homescreen" + android:icon="@drawable/ic_add_to_home_screen" /> + <item android:id="@+id/menu_open_webapk_id" + android:title="@string/menu_open_webapk" + android:icon="@drawable/ic_add_to_home_screen" /> <item android:id="@id/divider_line_id" android:title="@null" /> <item android:id="@+id/share_row_menu_id"
diff --git a/chrome/android/java/res/xml/phone_as_a_security_key_accessory_filter.xml b/chrome/android/java/res/xml/phone_as_a_security_key_accessory_filter.xml new file mode 100644 index 0000000..854df55 --- /dev/null +++ b/chrome/android/java/res/xml/phone_as_a_security_key_accessory_filter.xml
@@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> + +<!-- +This filter captures desktop Chrome (using AOA[1]) trying to use this phone +as a security key over USB. The version string is a random, magic value +that identifies such requests. On the desktop side this magic value is +known as |kCableOverAOAVersion| in device/fido/fido_constants.h. + +[1] https://source.android.com/devices/accessories/aoa +--> +<resources> + <usb-accessory version="12eba9f901039b36"/> +</resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 0e9764c..46ebcc9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -1610,7 +1610,7 @@ return new TabbedAppMenuPropertiesDelegate(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), getWindow().getDecorView(), this, mOverviewModeBehaviorSupplier, - mBookmarkBridgeSupplier); + mBookmarkBridgeSupplier, getModalDialogManager()); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index fe4cf431..c5743f48 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -727,7 +727,7 @@ public AppMenuPropertiesDelegate createAppMenuPropertiesDelegate() { return new AppMenuPropertiesDelegateImpl(this, getActivityTabProvider(), getMultiWindowModeStateDispatcher(), getTabModelSelector(), getToolbarManager(), - getWindow().getDecorView(), null, mBookmarkBridgeSupplier); + getWindow().getDecorView(), null, mBookmarkBridgeSupplier, getModalDialogManager()); } /** @@ -1997,10 +1997,12 @@ currentTab.goForward(); RecordUserAction.record("MobileMenuForward"); } - } else if (id == R.id.bookmark_this_page_id || id == R.id.bookmark_this_page_chip_id) { + } else if (id == R.id.bookmark_this_page_id || id == R.id.bookmark_this_page_chip_id + || id == R.id.add_to_bookmarks_menu_id) { addOrEditBookmark(currentTab); RecordUserAction.record("MobileMenuAddToBookmarks"); - } else if (id == R.id.offline_page_id || id == R.id.offline_page_chip_id) { + } else if (id == R.id.offline_page_id || id == R.id.offline_page_chip_id + || id == R.id.add_to_downloads_menu_id) { DownloadUtils.downloadOfflinePage(this, currentTab); RecordUserAction.record("MobileMenuDownloadPage"); } else if (id == R.id.reload_menu_id) { @@ -2035,7 +2037,7 @@ new TabPrinter(currentTab), new PrintManagerDelegateImpl(this)); RecordUserAction.record("MobileMenuPrint"); } - } else if (id == R.id.add_to_homescreen_id) { + } else if (id == R.id.add_to_homescreen_id || id == R.id.add_to_homescreen_menu_id) { AddToHomescreenCoordinator.showForAppMenu(currentTab, this, getWindowAndroid(), getModalDialogManager(), currentTab.getWebContents(), mMenuItemData); RecordUserAction.record("MobileMenuAddToHomescreen");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AddToMenuItemViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AddToMenuItemViewBinder.java new file mode 100644 index 0000000..ad8d941 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AddToMenuItemViewBinder.java
@@ -0,0 +1,220 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.app.appmenu; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import androidx.annotation.ColorRes; +import androidx.annotation.Nullable; +import androidx.appcompat.content.res.AppCompatResources; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ui.appmenu.AppMenuClickHandler; +import org.chromium.chrome.browser.ui.appmenu.CustomViewBinder; +import org.chromium.components.browser_ui.widget.text.TextViewWithCompoundDrawables; +import org.chromium.ui.modaldialog.DialogDismissalCause; +import org.chromium.ui.modaldialog.ModalDialogManager; +import org.chromium.ui.modaldialog.ModalDialogProperties; +import org.chromium.ui.modelutil.PropertyModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * A custom binder used to bind the add to menu item, also implementation of all dependencies for + * the add to dialog. + */ +class AddToMenuItemViewBinder extends ArrayAdapter<MenuItem> + implements CustomViewBinder, OnItemClickListener, ModalDialogProperties.Controller { + private static final int ADD_TO_ITEM_VIEW_TYPE = 0; + private final List<MenuItem> mAddToMenuItems; + private final ModalDialogManager mModalDialogManager; + private AppMenuClickHandler mAppMenuClickHandler; + private PropertyModel mPropertyModel; + private Context mContext; + + /** + * @param context The {@link Context} for the dialog. + * @param modalDialogManager {@link ModalDialogManager} to control the dialog. + */ + AddToMenuItemViewBinder(Context context, ModalDialogManager modalDialogManager) { + super(context, R.layout.add_to_menu_item); + mAddToMenuItems = new ArrayList<MenuItem>(); + mContext = context; + mModalDialogManager = modalDialogManager; + } + + /** + * Implementation of {@link CustomViewBinder#getViewTypeCount}. + */ + @Override + public int getViewTypeCount() { + return 1; + } + + /** + * Implementation of {@link CustomViewBinder#getItemViewType}. + */ + @Override + public int getItemViewType(int id) { + return id == R.id.add_to_menu_id ? ADD_TO_ITEM_VIEW_TYPE : CustomViewBinder.NOT_HANDLED; + } + + /** + * Implementation of {@link CustomViewBinder#getView}. + */ + @Override + public View getView(MenuItem item, @Nullable View convertView, ViewGroup parent, + LayoutInflater inflater, AppMenuClickHandler appMenuClickHandler, + @Nullable Integer highlightedItemId) { + // TODO(crbug.com/1136677): Need to support IPH for the items in the add to dialog. + assert item.getItemId() == R.id.add_to_menu_id; + mAppMenuClickHandler = appMenuClickHandler; + + AddToMenuItemViewHolder holder; + if (convertView == null || !(convertView.getTag() instanceof AddToMenuItemViewHolder)) { + holder = new AddToMenuItemViewHolder(); + convertView = inflater.inflate(R.layout.add_to_menu_item, parent, false); + holder.title = convertView.findViewById(R.id.title); + convertView.setTag(holder); + } else { + holder = (AddToMenuItemViewHolder) convertView.getTag(); + } + + convertView.setOnClickListener(v -> showAddToDialog()); + + // The submenu is prepared by AppMenuPropertiesDelegateImpl. + // TODO(1136985): Move the logic for "Add to" option out of AppMenuPropertiesDelegateImpl + // once the experiment is done. + assert item.hasSubMenu(); + for (int i = 0; i < item.getSubMenu().size(); ++i) { + if (item.getSubMenu().getItem(i).isVisible()) { + mAddToMenuItems.add(item.getSubMenu().getItem(i)); + } + } + + return convertView; + } + + /** + * Implementation of {@link CustomViewBinder#supportsEnterAnimation}. + */ + @Override + public boolean supportsEnterAnimation(int id) { + return true; + } + + /** + * Implementation of {@link CustomViewBinder#getPixelHeight}. + */ + @Override + public int getPixelHeight(Context context) { + TypedArray a = context.obtainStyledAttributes( + new int[] {android.R.attr.listPreferredItemHeightSmall}); + return a.getDimensionPixelSize(0, 0); + } + + /** + * Implementation of {@link ArrayAdapter#getView}. + */ + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + LayoutInflater inflater = LayoutInflater.from(mContext); + convertView = inflater.inflate(R.layout.add_to_menu_dialog_item, parent, false); + } + TextViewWithCompoundDrawables option = (TextViewWithCompoundDrawables) convertView; + + MenuItem item = mAddToMenuItems.get(position); + option.setCompoundDrawablesRelative(item.getIcon(), null, null, null); + option.setText(item.getTitle()); + option.setEnabled(item.isEnabled()); + @ColorRes + int theme = item.isChecked() ? R.color.blue_mode_tint + : R.color.default_icon_color_secondary_tint_list; + option.setDrawableTintColor( + AppCompatResources.getColorStateList(convertView.getContext(), theme)); + + return convertView; + } + + /** + * Implementation of {@link ArrayAdapter#getCount}. + */ + @Override + public int getCount() { + return mAddToMenuItems.size(); + } + + /** + * Implementation of {@link AdapterView.OnItemClickListener#onItemClick}. + */ + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + if (!view.isEnabled()) { + return; + } + mAppMenuClickHandler.onItemClick(mAddToMenuItems.get(position)); + mModalDialogManager.dismissDialog(mPropertyModel, DialogDismissalCause.ACTION_ON_CONTENT); + } + + /** + * Implementation of {@link ModalDialogProperties.Controller#onClick}. + */ + @Override + public void onClick(PropertyModel model, int buttonType) { + switch (buttonType) { + case ModalDialogProperties.ButtonType.POSITIVE: + mModalDialogManager.dismissDialog( + model, DialogDismissalCause.POSITIVE_BUTTON_CLICKED); + break; + default: + } + } + + /** + * Implementation of {@link ModalDialogProperties.Controller#onDismiss}. + */ + @Override + public void onDismiss(PropertyModel model, int dismissalCause) { + mPropertyModel = null; + } + + private PropertyModel getModalDialogModel() { + Resources resources = mContext.getResources(); + return new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS) + .with(ModalDialogProperties.CONTROLLER, this) + .with(ModalDialogProperties.TITLE, resources, R.string.menu_add_to_dialog_title) + .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT, resources, R.string.close) + .with(ModalDialogProperties.CUSTOM_VIEW, createAddToList()) + .with(ModalDialogProperties.CANCEL_ON_TOUCH_OUTSIDE, true) + .build(); + } + + private void showAddToDialog() { + mPropertyModel = getModalDialogModel(); + mModalDialogManager.showDialog(mPropertyModel, ModalDialogManager.ModalDialogType.APP); + } + + private ListView createAddToList() { + LayoutInflater inflater = LayoutInflater.from(mContext); + ListView addToMenu = (ListView) inflater.inflate(R.layout.add_to_menu_dialog, null); + addToMenu.setAdapter(this); + addToMenu.setOnItemClickListener(this); + return addToMenu; + } + + private static class AddToMenuItemViewHolder { public TextViewWithCompoundDrawables title; } +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index 802c469..76cd040a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -62,6 +62,7 @@ import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.webapk.lib.client.WebApkValidator; import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.modaldialog.ModalDialogManager; import java.util.ArrayList; import java.util.List; @@ -97,6 +98,7 @@ private ShareUtils mShareUtils; // Keeps track of which menu item was shown when installable app is detected. private int mAddAppTitleShown; + private final ModalDialogManager mModalDialogManager; @VisibleForTesting @IntDef({MenuGroup.INVALID, MenuGroup.PAGE_MENU, MenuGroup.OVERVIEW_MODE_MENU, @@ -117,11 +119,12 @@ } @IntDef({ThreeButtonActionBarType.DISABLED, ThreeButtonActionBarType.ACTION_CHIP_VIEW, - ThreeButtonActionBarType.DESTINATION_CHIP_VIEW}) + ThreeButtonActionBarType.DESTINATION_CHIP_VIEW, ThreeButtonActionBarType.ADD_TO_OPTION}) @interface ThreeButtonActionBarType { int DISABLED = 0; int ACTION_CHIP_VIEW = 1; int DESTINATION_CHIP_VIEW = 2; + int ADD_TO_OPTION = 3; } protected @Nullable OverviewModeBehavior mOverviewModeBehavior; @@ -142,12 +145,15 @@ * {@link OverviewModeBehavior} associated with the containing activity. * @param bookmarkBridgeSupplier An {@link ObservableSupplier} for the {@link BookmarkBridge} * associated with the containing activity. + * @param modalDialogManager The {@link ModalDialogManager} that should be used to show "Add To" + * dialog. */ public AppMenuPropertiesDelegateImpl(Context context, ActivityTabProvider activityTabProvider, MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, @Nullable OneshotSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier, - ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier) { + ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier, + ModalDialogManager modalDialogManager) { mContext = context; mIsTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext); mActivityTabProvider = activityTabProvider; @@ -155,6 +161,7 @@ mTabModelSelector = tabModelSelector; mToolbarManager = toolbarManager; mDecorView = decorView; + mModalDialogManager = modalDialogManager; if (overviewModeBehaviorSupplier != null) { overviewModeBehaviorSupplier.onAvailable(mCallbackController.makeCancelable( @@ -192,6 +199,7 @@ customViewBinders.add(new IncognitoMenuItemViewBinder()); customViewBinders.add(new DividerLineMenuItemViewBinder()); customViewBinders.add(new ChipViewMenuItemViewBinder(getThreeButtonActionBarType())); + customViewBinders.add(new AddToMenuItemViewBinder(mContext, mModalDialogManager)); return customViewBinders; } @@ -341,10 +349,34 @@ menu.findItem(R.id.move_to_other_window_menu_id).setVisible(shouldShowMoveToOtherWindow()); - if (shouldShowThreeButtonActionBar()) { - @ThreeButtonActionBarType - int threeButtonActionBarType = getThreeButtonActionBarType(); + @ThreeButtonActionBarType + int threeButtonActionBarType = getThreeButtonActionBarType(); + boolean addToOptionVisible = + threeButtonActionBarType == ThreeButtonActionBarType.ADD_TO_OPTION; + MenuItem addToDividerLineItem = menu.findItem(R.id.add_to_divider_line_id); + if (addToDividerLineItem != null) { + addToDividerLineItem.setVisible(addToOptionVisible); + addToDividerLineItem.setEnabled(false); + } + // Duplicating add_to_homescreen/install_app/open_webapk is for + // the purpose of experiment, one of them will be removed once the + // experiments are done. + MenuItem addToMenuItem = menu.findItem(R.id.add_to_menu_id); + if (addToMenuItem != null) { + addToMenuItem.setVisible(addToOptionVisible); + } + MenuItem installAppItem = menu.findItem(R.id.install_app_id); + if (installAppItem != null) { + // Visible will be changed later by #prepareAddToHomescreenMenuItem. + installAppItem.setVisible(addToOptionVisible); + } + MenuItem menuOpenWebApkItem = menu.findItem(R.id.menu_open_webapk_id); + if (menuOpenWebApkItem != null) { + // Visible will be changed later by #prepareAddToHomescreenMenuItem. + menuOpenWebApkItem.setVisible(addToOptionVisible); + } + if (shouldShowThreeButtonActionBar()) { MenuItem downloadMenuItem = menu.findItem(R.id.downloads_row_menu_id).getSubMenu().getItem(1); assert downloadMenuItem.getItemId() == R.id.offline_page_chip_id; @@ -373,6 +405,21 @@ menu.findItem(R.id.all_bookmarks_row_menu_id).getSubMenu().getItem(0); assert allBookmarkMenuItem.getItemId() == R.id.all_bookmarks_menu_id; allBookmarkMenuItem.setTitle(R.string.all); + } else if (threeButtonActionBarType == ThreeButtonActionBarType.ADD_TO_OPTION) { + MenuItem addToBookmarksMenuItem = + addToMenuItem.getSubMenu().findItem(R.id.add_to_bookmarks_menu_id); + updateBookmarkMenuItem(addToBookmarksMenuItem, currentTab); + + MenuItem addToDownloadsMenuItem = + addToMenuItem.getSubMenu().findItem(R.id.add_to_downloads_menu_id); + addToDownloadsMenuItem.setEnabled(shouldEnableDownloadPage(currentTab)); + + MenuItem addToHomescreenMenuItem = + addToMenuItem.getSubMenu().findItem(R.id.add_to_homescreen_menu_id); + prepareAddToHomescreenMenuItem(addToHomescreenMenuItem, installAppItem, + menuOpenWebApkItem, menu, currentTab, + shouldShowHomeScreenMenuItem( + isChromeScheme, isFileScheme, isContentScheme, isIncognito, url)); } } @@ -404,9 +451,16 @@ // Prepare translate menu button. prepareTranslateMenuItem(menu, currentTab); - prepareAddToHomescreenMenuItem(menu, currentTab, - shouldShowHomeScreenMenuItem( - isChromeScheme, isFileScheme, isContentScheme, isIncognito, url)); + MenuItem homescreenItem = menu.findItem(R.id.add_to_homescreen_id); + MenuItem openWebApkItem = menu.findItem(R.id.open_webapk_id); + if (addToOptionVisible) { + homescreenItem.setVisible(false); + openWebApkItem.setVisible(false); + } else { + prepareAddToHomescreenMenuItem(homescreenItem, null, openWebApkItem, menu, currentTab, + shouldShowHomeScreenMenuItem( + isChromeScheme, isFileScheme, isContentScheme, isIncognito, url)); + } updateRequestDesktopSiteMenuItem(menu, currentTab, true /* can show */); @@ -610,44 +664,64 @@ /** * Sets the visibility and labels of the "Add to Home screen" and "Open WebAPK" menu items. */ - protected void prepareAddToHomescreenMenuItem( - Menu menu, Tab currentTab, boolean shouldShowHomeScreenMenuItem) { - MenuItem homescreenItem = menu.findItem(R.id.add_to_homescreen_id); - MenuItem openWebApkItem = menu.findItem(R.id.open_webapk_id); + protected void prepareAddToHomescreenMenuItem(MenuItem homescreenItem, + @Nullable MenuItem installAppItem, MenuItem openWebApkItem, Menu menu, Tab currentTab, + boolean shouldShowHomeScreenMenuItem) { mAddAppTitleShown = AppMenuVerbiage.APP_MENU_OPTION_UNKNOWN; - if (shouldShowHomeScreenMenuItem) { - Context context = ContextUtils.getApplicationContext(); - long addToHomeScreenStart = SystemClock.elapsedRealtime(); - ResolveInfo resolveInfo = - WebApkValidator.queryFirstWebApkResolveInfo(context, currentTab.getUrlString()); - RecordHistogram.recordTimesHistogram("Android.PrepareMenu.OpenWebApkVisibilityCheck", - SystemClock.elapsedRealtime() - addToHomeScreenStart); - - boolean openWebApkItemVisible = - resolveInfo != null && resolveInfo.activityInfo.packageName != null; - - if (openWebApkItemVisible) { - String appName = resolveInfo.loadLabel(context.getPackageManager()).toString(); - openWebApkItem.setTitle(context.getString(R.string.menu_open_webapk, appName)); - - homescreenItem.setVisible(false); - openWebApkItem.setVisible(true); - } else { - AppBannerManager.InstallStringPair installStrings = - getAddToHomeScreenTitle(currentTab); - homescreenItem.setTitle(installStrings.titleTextId); - homescreenItem.setVisible(true); - openWebApkItem.setVisible(false); - - if (installStrings.titleTextId == AppBannerManager.NON_PWA_PAIR.titleTextId) { - mAddAppTitleShown = AppMenuVerbiage.APP_MENU_OPTION_ADD_TO_HOMESCREEN; - } else if (installStrings.titleTextId == AppBannerManager.PWA_PAIR.titleTextId) { - mAddAppTitleShown = AppMenuVerbiage.APP_MENU_OPTION_INSTALL; - } - } - } else { + if (!shouldShowHomeScreenMenuItem) { homescreenItem.setVisible(false); openWebApkItem.setVisible(false); + if (installAppItem != null) { + installAppItem.setVisible(false); + } + return; + } + + Context context = ContextUtils.getApplicationContext(); + long addToHomeScreenStart = SystemClock.elapsedRealtime(); + ResolveInfo resolveInfo = + WebApkValidator.queryFirstWebApkResolveInfo(context, currentTab.getUrlString()); + RecordHistogram.recordTimesHistogram("Android.PrepareMenu.OpenWebApkVisibilityCheck", + SystemClock.elapsedRealtime() - addToHomeScreenStart); + + boolean openWebApkItemVisible = + resolveInfo != null && resolveInfo.activityInfo.packageName != null; + + if (openWebApkItemVisible) { + String appName = resolveInfo.loadLabel(context.getPackageManager()).toString(); + openWebApkItem.setTitle(context.getString(R.string.menu_open_webapk, appName)); + + homescreenItem.setVisible(false); + openWebApkItem.setVisible(true); + if (installAppItem != null) { + installAppItem.setVisible(false); + } + } else { + AppBannerManager.InstallStringPair installStrings = getAddToHomeScreenTitle(currentTab); + // When "Add to" mernu item is enabled for the app menu, if the current webpage is a PWA + // then the menu item to "Install app" ({@code installAppItem}) will be shown in the + // main menu. If the current webpage is not a PWA "Add to homescreen" will be shown in + // the "Add to dialog" instead. If {@code installAppItem} is not null, ensure that only + // one of installAppItem or homescreenItem are visible. + if (installAppItem != null + && installStrings.titleTextId == AppBannerManager.PWA_PAIR.titleTextId) { + installAppItem.setTitle(installStrings.titleTextId); + installAppItem.setVisible(true); + homescreenItem.setVisible(false); + } else { + homescreenItem.setTitle(installStrings.titleTextId); + homescreenItem.setVisible(true); + if (installAppItem != null) { + installAppItem.setVisible(false); + } + } + openWebApkItem.setVisible(false); + + if (installStrings.titleTextId == AppBannerManager.NON_PWA_PAIR.titleTextId) { + mAddAppTitleShown = AppMenuVerbiage.APP_MENU_OPTION_ADD_TO_HOMESCREEN; + } else if (installStrings.titleTextId == AppBannerManager.PWA_PAIR.titleTextId) { + mAddAppTitleShown = AppMenuVerbiage.APP_MENU_OPTION_INSTALL; + } } } @@ -659,7 +733,8 @@ @Override public Bundle getBundleForMenuItem(MenuItem item) { Bundle bundle = new Bundle(); - if (item.getItemId() == R.id.add_to_homescreen_id) { + if (item.getItemId() == R.id.add_to_homescreen_id + || item.getItemId() == R.id.add_to_homescreen_menu_id) { bundle.putInt(AppBannerManager.MENU_TITLE_KEY, mAddAppTitleShown); } return bundle; @@ -865,6 +940,8 @@ } else if (THREE_BUTTON_ACTION_BAR_VARIATION.getValue().equals( "destination_chip_view")) { return ThreeButtonActionBarType.DESTINATION_CHIP_VIEW; + } else if (THREE_BUTTON_ACTION_BAR_VARIATION.getValue().equals("add_to_option")) { + return ThreeButtonActionBarType.ADD_TO_OPTION; } } return ThreeButtonActionBarType.DISABLED;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java index b732155..0426f10 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/DividerLineMenuItemViewBinder.java
@@ -29,15 +29,17 @@ @Override public int getItemViewType(int id) { - return id == R.id.divider_line_id ? DIVIDER_LINE_ITEM_VIEW_TYPE - : CustomViewBinder.NOT_HANDLED; + return (id == R.id.divider_line_id || id == R.id.add_to_divider_line_id) + ? DIVIDER_LINE_ITEM_VIEW_TYPE + : CustomViewBinder.NOT_HANDLED; } @Override public View getView(MenuItem item, @Nullable View convertView, ViewGroup parent, LayoutInflater inflater, AppMenuClickHandler appMenuClickHandler, @Nullable Integer highlightedItemId) { - assert item.getItemId() == R.id.divider_line_id; + assert item.getItemId() == R.id.divider_line_id + || item.getItemId() == R.id.add_to_divider_line_id; if (convertView == null) { convertView = inflater.inflate(R.layout.divider_line_menu_item, parent, false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index c78b5682..0707b61 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -102,6 +102,7 @@ TabContentManager.ALLOW_TO_REFETCH_TAB_THUMBNAIL_VARIATION, TabUiFeatureUtilities.ENABLE_LAUNCH_POLISH, TabUiFeatureUtilities.ENABLE_SEARCH_CHIP, + TabUiFeatureUtilities.ENABLE_PRICE_TRACKING, TabUiFeatureUtilities.ENABLE_SEARCH_CHIP_ADAPTIVE, TabUiFeatureUtilities.ZOOMING_MIN_MEMORY, TabUiFeatureUtilities.ZOOMING_MIN_SDK,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpController.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpController.java new file mode 100644 index 0000000..be4f461b --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpController.java
@@ -0,0 +1,66 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.banners; + +import android.app.Activity; +import android.os.Handler; +import android.view.View; + +import org.chromium.base.UnownedUserData; +import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; +import org.chromium.chrome.browser.user_education.IPHCommandBuilder; +import org.chromium.chrome.browser.user_education.UserEducationHelper; +import org.chromium.components.feature_engagement.FeatureConstants; + +/** + * This class is responsible for managing the in-product help for the PWA app banners. + */ +public class AppBannerInProductHelpController implements UnownedUserData { + private final Activity mActivity; + private final AppMenuHandler mAppMenuHandler; + private final Supplier<View> mMenuButtonView; + private final Handler mHandler = new Handler(); + private final UserEducationHelper mUserEducationHelper; + + /** + * Constructs an AppBannerInProductHelpController. + * @param activity The current activity. + * @param appMenuHandler The app menu containing the menu entry to highlight. + * @param menuButtonView The menu button view to anchor the bubble to. + */ + public AppBannerInProductHelpController( + Activity activity, AppMenuHandler appMenuHandler, Supplier<View> menuButtonView) { + mActivity = activity; + mAppMenuHandler = appMenuHandler; + mMenuButtonView = menuButtonView; + mUserEducationHelper = + new UserEducationHelper(mActivity, mHandler, TrackerFactory::getTrackerForProfile); + } + + /** + * Makes an asynchronous request to show the in-product help, anchored to app menu. + */ + public void requestInProductHelp() { + IPHCommandBuilder builder = new IPHCommandBuilder(mActivity.getResources(), + FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE, + R.string.iph_pwa_install_available_text, R.string.iph_pwa_install_available_text); + mUserEducationHelper.requestShowIPH( + builder.setAnchorView(mMenuButtonView.get()) + .setOnShowCallback(this::turnOnHighlightForMenu) + .setOnDismissCallback(this::turnOffHighlightForMenu) + .build()); + } + + private void turnOnHighlightForMenu() { + mAppMenuHandler.setMenuHighlight(R.id.add_to_homescreen_id, true); + } + + private void turnOffHighlightForMenu() { + mAppMenuHandler.clearMenuHighlight(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerFactory.java new file mode 100644 index 0000000..17c892e --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerFactory.java
@@ -0,0 +1,31 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.banners; + +import android.app.Activity; +import android.view.View; + +import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; +import org.chromium.ui.base.WindowAndroid; + +/** + * A factory for producing a {@link AppBannerInProductHelpController}. + */ +public class AppBannerInProductHelpControllerFactory { + public static AppBannerInProductHelpController createAppBannerInProductHelpController( + Activity activity, AppMenuHandler appMenuHandler, Supplier<View> menuButtonView) { + return new AppBannerInProductHelpController(activity, appMenuHandler, menuButtonView); + } + + public static void attach( + WindowAndroid windowAndroid, AppBannerInProductHelpController controller) { + AppBannerInProductHelpControllerProvider.attach(windowAndroid, controller); + } + + public static void detach(AppBannerInProductHelpController controller) { + AppBannerInProductHelpControllerProvider.detach(controller); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java new file mode 100644 index 0000000..332a677 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java
@@ -0,0 +1,36 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.banners; + +import org.chromium.base.UnownedUserDataKey; +import org.chromium.ui.base.WindowAndroid; + +/** + * This class manages the details associated with binding a {@link AppBannerInProductHelpController} + * to user data on a {@link WindowAndroid}. + */ +public class AppBannerInProductHelpControllerProvider { + /** The key used to bind the controller to the unowned data host. */ + private static final UnownedUserDataKey<AppBannerInProductHelpController> KEY = + new UnownedUserDataKey<>(AppBannerInProductHelpController.class); + + /** + * Get the shared {@link AppBannerInProductHelpController} from the provided {@link + * WindowAndroid}. + * @param windowAndroid The window to pull the controller from. + * @return A shared instance of a {@link AppBannerInProductHelpController}. + */ + public static AppBannerInProductHelpController from(WindowAndroid windowAndroid) { + return KEY.retrieveDataFromHost(windowAndroid.getUnownedUserDataHost()); + } + + static void attach(WindowAndroid windowAndroid, AppBannerInProductHelpController controller) { + KEY.attachToHost(windowAndroid.getUnownedUserDataHost(), controller); + } + + static void detach(AppBannerInProductHelpController controller) { + KEY.detachFromAllHosts(controller); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java index 88144576..cbc165d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java
@@ -17,9 +17,14 @@ import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.R; import org.chromium.chrome.browser.ShortcutHelper; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.vr.VrModuleProvider; +import org.chromium.components.feature_engagement.FeatureConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.WindowAndroid; /** * Manages an AppBannerInfoBar for a Tab. @@ -129,6 +134,31 @@ createAppDetailsObserver(), url, packageName, referrer, iconSizeInPx); } + /** + * Request to show the in-product help for installing a PWA. + * @param webContents The current WebContents. + * @return An error message, if unsuccessful. Blank if the request was made. + */ + @CalledByNative + private String showInProductHelp(WebContents webContents) { + // Consult the tracker to see if the IPH can be shown. + Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.fromWebContents(webContents)); + if (!tracker.wouldTriggerHelpUI(FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE)) { + // Tracker replied that the request to show will not be honored. Return whether the + // limit of how often to show has been exceeded. + return "Trigger state: " + + tracker.getTriggerState(FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE); + } + + WindowAndroid window = webContents.getTopLevelNativeWindow(); + if (window == null) return "No window"; + AppBannerInProductHelpController controller = + AppBannerInProductHelpControllerProvider.from(window); + if (controller == null) return "No controller"; + controller.requestInProductHelp(); + return ""; + } + private AppDetailsDelegate.Observer createAppDetailsObserver() { return new AppDetailsDelegate.Observer() { /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index 91ed163..5ecf87a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -14,8 +14,6 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; -import android.content.res.Resources; -import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.MailTo; import android.net.Uri; @@ -28,10 +26,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import org.chromium.base.Callback; import org.chromium.base.ContextUtils; -import org.chromium.base.annotations.CalledByNative; -import org.chromium.base.annotations.NativeMethods; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.R; @@ -55,7 +50,6 @@ import org.chromium.chrome.browser.share.LensUtils; import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.chrome.browser.share.ShareHelper; -import org.chromium.components.browser_ui.share.ShareImageFileUtils; import org.chromium.components.browser_ui.share.ShareParams; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; import org.chromium.components.embedder_support.util.UrlUtilities; @@ -64,7 +58,6 @@ import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.content_public.browser.BrowserStartupController; -import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.ui.base.WindowAndroid; @@ -86,17 +79,15 @@ * A {@link ContextMenuPopulator} used for showing the default Chrome context menu. */ public class ChromeContextMenuPopulator implements ContextMenuPopulator { - private static final int MAX_SHARE_DIMEN_PX = 2048; - private final Context mContext; - private final ContextMenuItemDelegate mDelegate; + private final ContextMenuItemDelegate mItemDelegate; private final @ContextMenuMode int mMode; private final Supplier<ShareDelegate> mShareDelegateSupplier; private final ExternalAuthUtils mExternalAuthUtils; private final ContextMenuParams mParams; private boolean mEnableLensWithSearchByImageText; private @Nullable UkmRecorder.Bridge mUkmRecorderBridge; - private long mNativeChromeContextMenuPopulator; + private ContextMenuNativeDelegate mNativeDelegate; private static final String LENS_SEARCH_MENU_ITEM_KEY = "searchWithGoogleLensMenuItem"; private static final String LENS_SHOP_MENU_ITEM_KEY = "shopWithGoogleLensMenuItem"; private static final String SEARCH_BY_IMAGE_MENU_ITEM_KEY = "searchByImageMenuItem"; @@ -126,27 +117,6 @@ int WEB_APP = 2; /* Full screen mode */ } - /** - * See function for details. - */ - private static byte[] sHardcodedImageBytesForTesting; - private static String sHardcodedImageExtensionForTesting; - - /** - * The tests trigger the context menu via JS rather than via a true native call which means - * the native code does not have a reference to the image's render frame host. Instead allow - * test cases to hardcode the test image bytes that will be shared. - * @param hardcodedImageBytes The hard coded image bytes to fake or null if image should not be - * faked. - * @param hardcodedImageExtension The hard coded image extension. - */ - @VisibleForTesting - public static void setHardcodedImageBytesForTesting( - byte[] hardcodedImageBytes, String hardcodedImageExtension) { - sHardcodedImageBytesForTesting = hardcodedImageBytes; - sHardcodedImageExtensionForTesting = hardcodedImageExtension; - } - static class ContextMenuUma { // Note: these values must match the ContextMenuOptionAndroid enum in enums.xml. // Only add values to the end, right before NUM_ENTRIES! @@ -339,7 +309,7 @@ /** * Builds a {@link ChromeContextMenuPopulator}. - * @param delegate The {@link ContextMenuItemDelegate} that will be notified with actions + * @param itemDelegate The {@link ContextMenuItemDelegate} that will be notified with actions * to perform when menu items are selected. * @param shareDelegate The Supplier of {@link ShareDelegate} that will be notified when a share * action is performed. @@ -347,25 +317,19 @@ * @param externalAuthUtils {@link ExternalAuthUtils} instance. * @param context The {@link Context} used to retrieve the strings. * @param params The {@link ContextMenuParams} to populate the menu items. - * @param renderFrameHost The {@link RenderFrameHost} to fetch the decoded images from. + * @param nativeDelegate The {@link ContextMenuNativeDelegate} used to interact with native. */ - public ChromeContextMenuPopulator(ContextMenuItemDelegate delegate, + public ChromeContextMenuPopulator(ContextMenuItemDelegate itemDelegate, Supplier<ShareDelegate> shareDelegate, @ContextMenuMode int mode, ExternalAuthUtils externalAuthUtils, Context context, ContextMenuParams params, - RenderFrameHost renderFrameHost) { - mDelegate = delegate; + ContextMenuNativeDelegate nativeDelegate) { + mItemDelegate = itemDelegate; mShareDelegateSupplier = shareDelegate; mMode = mode; mExternalAuthUtils = externalAuthUtils; mContext = context; mParams = params; - mNativeChromeContextMenuPopulator = ChromeContextMenuPopulatorJni.get().init( - delegate.getWebContents(), params, renderFrameHost); - } - - @Override - public void onDestroy() { - mNativeChromeContextMenuPopulator = 0; + mNativeDelegate = nativeDelegate; } /** @@ -403,10 +367,10 @@ && UrlUtilities.isAcceptedScheme(mParams.getUrl())) { if (mMode == ContextMenuMode.NORMAL) { linkGroup.add(createListItem(Item.OPEN_IN_NEW_TAB)); - if (!mDelegate.isIncognito() && mDelegate.isIncognitoSupported()) { + if (!mItemDelegate.isIncognito() && mItemDelegate.isIncognitoSupported()) { linkGroup.add(createListItem(Item.OPEN_IN_INCOGNITO_TAB)); } - if (mDelegate.isOpenInOtherWindowSupported()) { + if (mItemDelegate.isOpenInOtherWindowSupported()) { linkGroup.add(createListItem(Item.OPEN_IN_OTHER_WINDOW)); } } @@ -425,28 +389,28 @@ } } if (FirstRunStatus.getFirstRunFlowComplete()) { - if (!mDelegate.isIncognito() + if (!mItemDelegate.isIncognito() && UrlUtilities.isDownloadableScheme(mParams.getLinkUrl())) { linkGroup.add(createListItem(Item.SAVE_LINK_AS)); } linkGroup.add(createShareListItem(Item.SHARE_LINK, Item.DIRECT_SHARE_LINK)); if (UrlUtilities.isTelScheme(mParams.getLinkUrl())) { - if (mDelegate.supportsCall()) { + if (mItemDelegate.supportsCall()) { linkGroup.add(createListItem(Item.CALL)); } - if (mDelegate.supportsSendTextMessage()) { + if (mItemDelegate.supportsSendTextMessage()) { linkGroup.add(createListItem(Item.SEND_MESSAGE)); } - if (mDelegate.supportsAddToContacts()) { + if (mItemDelegate.supportsAddToContacts()) { linkGroup.add(createListItem(Item.ADD_TO_CONTACTS)); } } if (MailTo.isMailTo(mParams.getLinkUrl())) { - if (mDelegate.supportsSendEmailMessage()) { + if (mItemDelegate.supportsSendEmailMessage()) { linkGroup.add(createListItem(Item.SEND_MESSAGE)); } if (!TextUtils.isEmpty(MailTo.parse(mParams.getLinkUrl()).getTo()) - && mDelegate.supportsAddToContacts()) { + && mItemDelegate.supportsAddToContacts()) { linkGroup.add(createListItem(Item.ADD_TO_CONTACTS)); } } @@ -467,7 +431,7 @@ boolean showLensShoppingMenuItem = false; // Avoid showing open image option for same image which is already opened. if (mMode == ContextMenuMode.CUSTOM_TAB - && !mDelegate.getPageUrl().equals(mParams.getSrcUrl())) { + && !mItemDelegate.getPageUrl().equals(mParams.getSrcUrl())) { imageGroup.add(createListItem(Item.OPEN_IMAGE)); } if (mMode == ContextMenuMode.NORMAL) { @@ -500,8 +464,8 @@ // All behavior relating to Lens integration is gated by Feature Flag. // A map to indicate which image search menu item would be shown. Map<String, Boolean> imageSearchMenuItemsToShow = - getSearchByImageMenuItemsToShowAndRecordMetrics( - mParams.getPageUrl(), isShoppyImage, mDelegate.isIncognito()); + getSearchByImageMenuItemsToShowAndRecordMetrics(mParams.getPageUrl(), + isShoppyImage, mItemDelegate.isIncognito()); if (imageSearchMenuItemsToShow.get(LENS_SEARCH_MENU_ITEM_KEY)) { if (LensUtils.useLensWithSearchByImageText()) { mEnableLensWithSearchByImageText = true; @@ -578,7 +542,7 @@ if (SharedPreferencesManager.getInstance().readBoolean( ChromePreferenceKeys.CHROME_DEFAULT_BROWSER, false) && addNewEntries) { - if (mDelegate.isIncognitoSupported()) { + if (mItemDelegate.isIncognitoSupported()) { items.add(0, createListItem(Item.OPEN_IN_CHROME_INCOGNITO_TAB)); } items.add(0, createListItem(Item.OPEN_IN_NEW_CHROME_TAB)); @@ -617,87 +581,87 @@ @Override public boolean isIncognito() { - return mDelegate.isIncognito(); + return mItemDelegate.isIncognito(); } @Override public boolean onItemSelected(int itemId) { if (itemId == R.id.contextmenu_open_in_new_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_NEW_TAB); - mDelegate.onOpenInNewTab(mParams.getUrl(), mParams.getReferrer()); + mItemDelegate.onOpenInNewTab(mParams.getUrl(), mParams.getReferrer()); } else if (itemId == R.id.contextmenu_open_in_incognito_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_INCOGNITO_TAB); - mDelegate.onOpenInNewIncognitoTab(mParams.getUrl()); + mItemDelegate.onOpenInNewIncognitoTab(mParams.getUrl()); } else if (itemId == R.id.contextmenu_open_in_other_window) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_OTHER_WINDOW); - mDelegate.onOpenInOtherWindow(mParams.getUrl(), mParams.getReferrer()); + mItemDelegate.onOpenInOtherWindow(mParams.getUrl(), mParams.getReferrer()); } else if (itemId == R.id.contextmenu_open_in_ephemeral_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_EPHEMERAL_TAB); - mDelegate.onOpenInEphemeralTab(mParams.getUrl(), mParams.getLinkText()); + mItemDelegate.onOpenInEphemeralTab(mParams.getUrl(), mParams.getLinkText()); } else if (itemId == R.id.contextmenu_open_image) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IMAGE); - mDelegate.onOpenImageUrl(mParams.getSrcUrl(), mParams.getReferrer()); + mItemDelegate.onOpenImageUrl(mParams.getSrcUrl(), mParams.getReferrer()); } else if (itemId == R.id.contextmenu_open_image_in_new_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IMAGE_IN_NEW_TAB); - mDelegate.onOpenImageInNewTab(mParams.getSrcUrl(), mParams.getReferrer()); + mItemDelegate.onOpenImageInNewTab(mParams.getSrcUrl(), mParams.getReferrer()); } else if (itemId == R.id.contextmenu_open_image_in_ephemeral_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IMAGE_IN_EPHEMERAL_TAB); String title = mParams.getTitleText(); if (TextUtils.isEmpty(title)) { title = URLUtil.guessFileName(mParams.getSrcUrl(), null, null); } - mDelegate.onOpenInEphemeralTab(mParams.getSrcUrl(), title); + mItemDelegate.onOpenInEphemeralTab(mParams.getSrcUrl(), title); } else if (itemId == R.id.contextmenu_copy_image) { recordContextMenuSelection(ContextMenuUma.Action.COPY_IMAGE); copyImageToClipboard(); } else if (itemId == R.id.contextmenu_copy_link_address) { recordContextMenuSelection(ContextMenuUma.Action.COPY_LINK_ADDRESS); - mDelegate.onSaveToClipboard( + mItemDelegate.onSaveToClipboard( mParams.getUnfilteredLinkUrl(), ContextMenuItemDelegate.ClipboardType.LINK_URL); } else if (itemId == R.id.contextmenu_call) { recordContextMenuSelection(ContextMenuUma.Action.CALL); - mDelegate.onCall(mParams.getLinkUrl()); + mItemDelegate.onCall(mParams.getLinkUrl()); } else if (itemId == R.id.contextmenu_send_message) { if (MailTo.isMailTo(mParams.getLinkUrl())) { recordContextMenuSelection(ContextMenuUma.Action.SEND_EMAIL); - mDelegate.onSendEmailMessage(mParams.getLinkUrl()); + mItemDelegate.onSendEmailMessage(mParams.getLinkUrl()); } else if (UrlUtilities.isTelScheme(mParams.getLinkUrl())) { recordContextMenuSelection(ContextMenuUma.Action.SEND_TEXT_MESSAGE); - mDelegate.onSendTextMessage(mParams.getLinkUrl()); + mItemDelegate.onSendTextMessage(mParams.getLinkUrl()); } } else if (itemId == R.id.contextmenu_add_to_contacts) { recordContextMenuSelection(ContextMenuUma.Action.ADD_TO_CONTACTS); - mDelegate.onAddToContacts(mParams.getLinkUrl()); + mItemDelegate.onAddToContacts(mParams.getLinkUrl()); } else if (itemId == R.id.contextmenu_copy) { if (MailTo.isMailTo(mParams.getLinkUrl())) { recordContextMenuSelection(ContextMenuUma.Action.COPY_EMAIL_ADDRESS); - mDelegate.onSaveToClipboard(MailTo.parse(mParams.getLinkUrl()).getTo(), + mItemDelegate.onSaveToClipboard(MailTo.parse(mParams.getLinkUrl()).getTo(), ContextMenuItemDelegate.ClipboardType.LINK_URL); } else if (UrlUtilities.isTelScheme(mParams.getLinkUrl())) { recordContextMenuSelection(ContextMenuUma.Action.COPY_PHONE_NUMBER); - mDelegate.onSaveToClipboard(UrlUtilities.getTelNumber(mParams.getLinkUrl()), + mItemDelegate.onSaveToClipboard(UrlUtilities.getTelNumber(mParams.getLinkUrl()), ContextMenuItemDelegate.ClipboardType.LINK_URL); } } else if (itemId == R.id.contextmenu_copy_link_text) { recordContextMenuSelection(ContextMenuUma.Action.COPY_LINK_TEXT); - mDelegate.onSaveToClipboard( + mItemDelegate.onSaveToClipboard( mParams.getLinkText(), ContextMenuItemDelegate.ClipboardType.LINK_TEXT); } else if (itemId == R.id.contextmenu_save_image) { recordContextMenuSelection(ContextMenuUma.Action.SAVE_IMAGE); - if (mDelegate.startDownload(mParams.getSrcUrl(), false)) { - startContextMenuDownload(false); + if (mItemDelegate.startDownload(mParams.getSrcUrl(), false)) { + mNativeDelegate.startDownload(false); } } else if (itemId == R.id.contextmenu_save_video) { recordContextMenuSelection(ContextMenuUma.Action.SAVE_VIDEO); - if (mDelegate.startDownload(mParams.getSrcUrl(), false)) { - startContextMenuDownload(false); + if (mItemDelegate.startDownload(mParams.getSrcUrl(), false)) { + mNativeDelegate.startDownload(false); } } else if (itemId == R.id.contextmenu_save_link_as) { recordContextMenuSelection(ContextMenuUma.Action.SAVE_LINK); String url = mParams.getUnfilteredLinkUrl(); - if (mDelegate.startDownload(url, true)) { + if (mItemDelegate.startDownload(url, true)) { ContextMenuUma.recordSaveLinkTypes(url); - startContextMenuDownload(true); + mNativeDelegate.startDownload(true); } } else if (itemId == R.id.contextmenu_share_link) { recordContextMenuSelection(ContextMenuUma.Action.SHARE_LINK); @@ -716,34 +680,34 @@ ShareHelper.shareWithLastUsedComponent(shareParams); } else if (itemId == R.id.contextmenu_search_with_google_lens) { recordContextMenuSelection(ContextMenuUma.Action.SEARCH_WITH_GOOGLE_LENS); - searchWithGoogleLens(mDelegate.isIncognito()); + searchWithGoogleLens(mItemDelegate.isIncognito()); SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(); prefManager.writeBoolean( ChromePreferenceKeys.CONTEXT_MENU_SEARCH_WITH_GOOGLE_LENS_CLICKED, true); } else if (itemId == R.id.contextmenu_search_by_image) { if (mEnableLensWithSearchByImageText) { recordContextMenuSelection(ContextMenuUma.Action.SEARCH_WITH_GOOGLE_LENS); - searchWithGoogleLens(mDelegate.isIncognito()); + searchWithGoogleLens(mItemDelegate.isIncognito()); } else { recordContextMenuSelection(ContextMenuUma.Action.SEARCH_BY_IMAGE); - searchForImage(); + mNativeDelegate.searchForImage(); } } else if (itemId == R.id.contextmenu_shop_similar_products) { recordContextMenuSelection(ContextMenuUma.Action.SHOP_SIMILAR_PRODUCTS); - shopWithGoogleLens(mDelegate.isIncognito(), + shopWithGoogleLens(mItemDelegate.isIncognito(), /*requiresConfirmation=*/true); SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(); prefManager.writeBoolean( ChromePreferenceKeys.CONTEXT_MENU_SHOP_SIMILAR_PRODUCTS_CLICKED, true); } else if (itemId == R.id.contextmenu_shop_image_with_google_lens) { recordContextMenuSelection(ContextMenuUma.Action.SHOP_IMAGE_WITH_GOOGLE_LENS); - shopWithGoogleLens(mDelegate.isIncognito(), /*requiresConfirmation=*/false); + shopWithGoogleLens(mItemDelegate.isIncognito(), /*requiresConfirmation=*/false); SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(); prefManager.writeBoolean( ChromePreferenceKeys.CONTEXT_MENU_SHOP_IMAGE_WITH_GOOGLE_LENS_CLICKED, true); } else if (itemId == R.id.contextmenu_search_similar_products) { recordContextMenuSelection(ContextMenuUma.Action.SEARCH_SIMILAR_PRODUCTS); - shopWithGoogleLens(mDelegate.isIncognito(), + shopWithGoogleLens(mItemDelegate.isIncognito(), /*requiresConfirmation=*/true); SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(); prefManager.writeBoolean( @@ -753,21 +717,21 @@ shareImage(); } else if (itemId == R.id.contextmenu_direct_share_image) { recordContextMenuSelection(ContextMenuUma.Action.DIRECT_SHARE_IMAGE); - retrieveImage(ContextMenuImageFormat.ORIGINAL, (Uri uri) -> { + mNativeDelegate.retrieveImageForShare(ContextMenuImageFormat.ORIGINAL, (Uri uri) -> { ShareHelper.shareImage(getWindow(), ShareHelper.getLastShareComponentName(), uri); }); } else if (itemId == R.id.contextmenu_open_in_chrome) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_CHROME); - mDelegate.onOpenInChrome(mParams.getUrl(), mParams.getPageUrl()); + mItemDelegate.onOpenInChrome(mParams.getUrl(), mParams.getPageUrl()); } else if (itemId == R.id.contextmenu_open_in_new_chrome_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_NEW_CHROME_TAB); - mDelegate.onOpenInNewChromeTabFromCCT(mParams.getUrl(), false); + mItemDelegate.onOpenInNewChromeTabFromCCT(mParams.getUrl(), false); } else if (itemId == R.id.contextmenu_open_in_chrome_incognito_tab) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_CHROME_INCOGNITO_TAB); - mDelegate.onOpenInNewChromeTabFromCCT(mParams.getUrl(), true); + mItemDelegate.onOpenInNewChromeTabFromCCT(mParams.getUrl(), true); } else if (itemId == R.id.contextmenu_open_in_browser_id) { recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_BROWSER); - mDelegate.onOpenInDefaultBrowser(mParams.getUrl()); + mItemDelegate.onOpenInDefaultBrowser(mParams.getUrl()); } else { assert false; } @@ -788,7 +752,7 @@ } private WindowAndroid getWindow() { - return mDelegate.getWebContents().getTopLevelNativeWindow(); + return mItemDelegate.getWebContents().getTopLevelNativeWindow(); } private Activity getActivity() { @@ -799,8 +763,8 @@ * Copy the image, that triggered the current context menu, to system clipboard. */ private void copyImageToClipboard() { - retrieveImage(ContextMenuImageFormat.ORIGINAL, - (Uri imageUri) -> { mDelegate.onSaveImageToClipboard(imageUri); }); + mNativeDelegate.retrieveImageForShare( + ContextMenuImageFormat.ORIGINAL, mItemDelegate::onSaveImageToClipboard); } /** @@ -808,7 +772,7 @@ * @param isIncognito Whether the image to search came from an incognito context. */ private void searchWithGoogleLens(boolean isIncognito) { - retrieveImage(ContextMenuImageFormat.PNG, (Uri imageUri) -> { + mNativeDelegate.retrieveImageForShare(ContextMenuImageFormat.PNG, (Uri imageUri) -> { ShareHelper.shareImageWithGoogleLens(getWindow(), imageUri, isIncognito, mParams.getSrcUrl(), mParams.getTitleText(), /* isShoppyImage*/ false, /* requiresConfirmation*/ false); @@ -821,7 +785,7 @@ * @param requiresConfirmation Whether the request requires an account dialog. */ private void shopWithGoogleLens(boolean isIncognito, boolean requiresConfirmation) { - retrieveImage(ContextMenuImageFormat.PNG, (Uri imageUri) -> { + mNativeDelegate.retrieveImageForShare(ContextMenuImageFormat.PNG, (Uri imageUri) -> { ShareHelper.shareImageWithGoogleLens(getWindow(), imageUri, isIncognito, mParams.getSrcUrl(), mParams.getTitleText(), /* isShoppyImage*/ true, requiresConfirmation); @@ -834,7 +798,7 @@ * it will use the right activity set when the menu was displayed. */ private void shareImage() { - retrieveImage(ContextMenuImageFormat.ORIGINAL, (Uri imageUri) -> { + mNativeDelegate.retrieveImageForShare(ContextMenuImageFormat.ORIGINAL, (Uri imageUri) -> { if (!mShareDelegateSupplier.get().isSharingHubV15Enabled()) { ShareHelper.shareImage(getWindow(), null, imageUri); return; @@ -855,64 +819,6 @@ }); } - @Override - public void retrieveImage(@ContextMenuImageFormat int imageFormat, Callback<Uri> callback) { - if (mNativeChromeContextMenuPopulator == 0) return; - final Activity activity = getActivity(); - - Callback<ImageCallbackResult> imageRetrievalCallback = (result) -> { - if (activity == null) return; - ShareImageFileUtils.generateTemporaryUriFromData( - activity, result.imageData, result.extension, callback); - }; - - if (sHardcodedImageBytesForTesting != null) { - imageRetrievalCallback.onResult(createImageCallbackResultForTesting()); - } else { - ChromeContextMenuPopulatorJni.get().retrieveImageForShare( - mNativeChromeContextMenuPopulator, ChromeContextMenuPopulator.this, - imageRetrievalCallback, MAX_SHARE_DIMEN_PX, MAX_SHARE_DIMEN_PX, imageFormat); - } - } - - /** - * Starts a download based on the current {@link ContextMenuParams}. - * @param isLink Whether or not the download target is a link. - */ - private void startContextMenuDownload(boolean isLink) { - if (mNativeChromeContextMenuPopulator == 0) return; - ChromeContextMenuPopulatorJni.get().onStartDownload( - mNativeChromeContextMenuPopulator, ChromeContextMenuPopulator.this, isLink); - } - - /** - * Trigger an image search for the current image that triggered the context menu. - */ - private void searchForImage() { - if (mNativeChromeContextMenuPopulator == 0) return; - ChromeContextMenuPopulatorJni.get().searchForImage( - mNativeChromeContextMenuPopulator, ChromeContextMenuPopulator.this); - } - - /** - * Gets the thumbnail of the current image that triggered the context menu. - * @param callback Called once the the thumbnail is received. - */ - @Override - public void getThumbnail(final Callback<Bitmap> callback) { - if (mNativeChromeContextMenuPopulator == 0) return; - - final Resources res = getActivity().getResources(); - final int maxHeightPx = - res.getDimensionPixelSize(R.dimen.revamped_context_menu_header_image_max_size); - final int maxWidthPx = - res.getDimensionPixelSize(R.dimen.revamped_context_menu_header_image_max_size); - - ChromeContextMenuPopulatorJni.get().retrieveImageForContextMenu( - mNativeChromeContextMenuPopulator, ChromeContextMenuPopulator.this, callback, - maxWidthPx, maxHeightPx); - } - /** * @return The service that handles TemplateUrls. */ @@ -949,7 +855,7 @@ * Record a UMA ping and a UKM ping if enabled. */ private void recordContextMenuSelection(int actionId) { - ContextMenuUma.record(mDelegate.getWebContents(), mParams, actionId); + ContextMenuUma.record(mItemDelegate.getWebContents(), mParams, actionId); maybeRecordActionUkm("ContextMenuAndroid.Selected", actionId); } @@ -1154,9 +1060,9 @@ * @param metricName The name of the UKM metric to record. */ private void maybeRecordBooleanUkm(String eventName, String metricName) { - if (!LensUtils.shouldLogUkm(mDelegate.isIncognito())) return; + if (!LensUtils.shouldLogUkm(mItemDelegate.isIncognito())) return; initializeUkmRecorderBridge(); - WebContents webContents = mDelegate.getWebContents(); + WebContents webContents = mItemDelegate.getWebContents(); if (webContents != null) { mUkmRecorderBridge.recordEventWithBooleanMetric(webContents, eventName, metricName); } @@ -1168,9 +1074,9 @@ * @param actionId The id of the action corresponding the ContextMenuUma.Action enum. */ private void maybeRecordActionUkm(String eventName, int actionId) { - if (!LensUtils.shouldLogUkm(mDelegate.isIncognito())) return; + if (!LensUtils.shouldLogUkm(mItemDelegate.isIncognito())) return; initializeUkmRecorderBridge(); - WebContents webContents = mDelegate.getWebContents(); + WebContents webContents = mItemDelegate.getWebContents(); if (webContents != null) { mUkmRecorderBridge.recordEventWithIntegerMetric( webContents, eventName, "Action", actionId); @@ -1189,45 +1095,4 @@ && templateUrlServiceInstance.getDefaultSearchEngineTemplateUrl() != null && !LocaleManager.getInstance().needToCheckForSearchEnginePromo(); } - - /** - * The class hold the |retrieveImageForShare| callback result. - */ - @VisibleForTesting - static class ImageCallbackResult { - public byte[] imageData; - public String extension; - - public ImageCallbackResult(byte[] imageData, String extension) { - this.imageData = imageData; - this.extension = extension; - } - } - - private static ImageCallbackResult createImageCallbackResultForTesting() { - return new ImageCallbackResult( - sHardcodedImageBytesForTesting, sHardcodedImageExtensionForTesting); - } - - @CalledByNative - private static ImageCallbackResult createImageCallbackResult( - byte[] imageData, String extension) { - return new ImageCallbackResult(imageData, extension); - } - - @NativeMethods - interface Natives { - long init(WebContents webContents, ContextMenuParams contextMenuParams, - RenderFrameHost renderFrameHost); - void onStartDownload(long nativeChromeContextMenuPopulator, - ChromeContextMenuPopulator caller, boolean isLink); - void retrieveImageForShare(long nativeChromeContextMenuPopulator, - ChromeContextMenuPopulator caller, Callback<ImageCallbackResult> callback, - int maxWidthPx, int maxHeightPx, @ContextMenuImageFormat int imageFormat); - void retrieveImageForContextMenu(long nativeChromeContextMenuPopulator, - ChromeContextMenuPopulator caller, Callback<Bitmap> callback, int maxWidthPx, - int maxHeightPx); - void searchForImage( - long nativeChromeContextMenuPopulator, ChromeContextMenuPopulator caller); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory.java index 69783ff..fd946b64a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorFactory.java
@@ -13,7 +13,6 @@ import org.chromium.chrome.browser.externalauth.ExternalAuthUtils; import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; -import org.chromium.content_public.browser.RenderFrameHost; /** * Factory for creating {@link ContextMenuPopulator}s. @@ -40,8 +39,8 @@ @Override public ContextMenuPopulator createContextMenuPopulator( - Context context, ContextMenuParams params, RenderFrameHost renderFrameHost) { + Context context, ContextMenuParams params, ContextMenuNativeDelegate nativeDelegate) { return new ChromeContextMenuPopulator(mItemDelegate, mShareDelegateSupplier, - mContextMenuMode, mExternalAuthUtils, context, params, renderFrameHost); + mContextMenuMode, mExternalAuthUtils, context, params, nativeDelegate); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java index 6809a9d..6e4dc8f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java
@@ -36,6 +36,7 @@ private final WebContents mWebContents; private long mNativeContextMenuHelper; + private ContextMenuNativeDelegate mCurrentNativeDelegate; private ContextMenuPopulator mCurrentPopulator; private ContextMenuPopulatorFactory mPopulatorFactory; private ContextMenuParams mCurrentContextMenuParams; @@ -64,7 +65,7 @@ mCurrentContextMenu.dismiss(); mCurrentContextMenu = null; } - if (mCurrentPopulator != null) mCurrentPopulator.onDestroy(); + if (mCurrentNativeDelegate != null) mCurrentNativeDelegate.destroy(); if (mPopulatorFactory != null) mPopulatorFactory.onDestroy(); mNativeContextMenuHelper = 0; } @@ -75,7 +76,7 @@ mCurrentContextMenu.dismiss(); mCurrentContextMenu = null; } - if (mCurrentPopulator != null) mCurrentPopulator.onDestroy(); + if (mCurrentNativeDelegate != null) mCurrentNativeDelegate.destroy(); mCurrentPopulator = null; if (mPopulatorFactory != null) mPopulatorFactory.onDestroy(); mPopulatorFactory = populatorFactory; @@ -100,8 +101,10 @@ return; } + mCurrentNativeDelegate = + new ContextMenuNativeDelegateImpl(mWebContents, renderFrameHost, params); mCurrentPopulator = mPopulatorFactory.createContextMenuPopulator( - windowAndroid.getActivity().get(), params, renderFrameHost); + windowAndroid.getActivity().get(), params, mCurrentNativeDelegate); mIsIncognito = mCurrentPopulator.isIncognito(); mCurrentContextMenuParams = params; mWindow = windowAndroid; @@ -122,9 +125,12 @@ mOnMenuClosed = () -> { recordTimeToTakeActionHistogram(mSelectedItemBeforeDismiss); mCurrentContextMenu = null; + if (mCurrentNativeDelegate != null) { + mCurrentNativeDelegate.destroy(); + mCurrentNativeDelegate = null; + } if (mCurrentPopulator != null) { mCurrentPopulator.onMenuClosed(); - mCurrentPopulator.onDestroy(); mCurrentPopulator = null; } if (LensUtils.enableShoppyImageMenuItem() || LensUtils.enableImageChip(mIsIncognito)) { @@ -141,11 +147,12 @@ // not be enabled under any circumstances on Stable Chrome builds due to potential // latency impact. if (LensUtils.enableShoppyImageMenuItem()) { - mCurrentPopulator.retrieveImage(ContextMenuImageFormat.ORIGINAL, (Uri uri) -> { - LensController.getInstance().classifyImage(uri, (Boolean isShoppyImage) -> { - displayRevampedContextMenu(topContentOffsetPx, isShoppyImage); - }); - }); + Callback<Uri> callback = (Uri uri) -> { + LensController.getInstance().classifyImage(uri, + (Boolean isShoppyImage) + -> displayRevampedContextMenu(topContentOffsetPx, isShoppyImage)); + }; + mCurrentNativeDelegate.retrieveImageForShare(ContextMenuImageFormat.ORIGINAL, callback); } else { displayRevampedContextMenu(topContentOffsetPx, /* addShoppyMenuItem */ false); } @@ -160,12 +167,12 @@ } final RevampedContextMenuCoordinator menuCoordinator = - new RevampedContextMenuCoordinator(topContentOffsetPx); + new RevampedContextMenuCoordinator(topContentOffsetPx, mCurrentNativeDelegate); mCurrentContextMenu = menuCoordinator; if (LensUtils.enableImageChip(mIsIncognito)) { LensAsyncManager lensAsyncManager = - new LensAsyncManager(mCurrentContextMenuParams, mCurrentPopulator); + new LensAsyncManager(mCurrentContextMenuParams, mCurrentNativeDelegate); menuCoordinator.displayMenuWithLensChip(mWindow, mWebContents, mCurrentContextMenuParams, items, mCallback, mOnMenuShown, mOnMenuClosed, lensAsyncManager); @@ -177,10 +184,6 @@ if (sRevampedContextMenuShownCallback != null) { sRevampedContextMenuShownCallback.onResult(menuCoordinator); } - // TODO(sinansahin): This could be pushed in to the header mediator. - if (mCurrentContextMenuParams.isImage()) { - mCurrentPopulator.getThumbnail(menuCoordinator.getOnImageThumbnailRetrievedReference()); - } } private void recordTimeToTakeActionHistogram(boolean selectedItem) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensAsyncManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensAsyncManager.java index ab4b1e1..2b777f2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensAsyncManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensAsyncManager.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.contextmenu; +import android.net.Uri; + import org.chromium.base.Callback; import org.chromium.chrome.browser.lens.LensController; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; @@ -15,16 +17,16 @@ private static final String TAG = "LensAsyncManager"; private ContextMenuParams mParams; - private ContextMenuPopulator mPopulator; + private ContextMenuNativeDelegate mNativeDelegate; /** * Construct a lens async manager. * @param params Context menu params used to retrieve additional metadata. - * @param populator A populator reference used to retrieve image bytes. + * @param nativeDelegate {@link ContextMenuNativeDelegate} used to retrieve image bytes. */ - public LensAsyncManager(ContextMenuParams params, ContextMenuPopulator populator) { + public LensAsyncManager(ContextMenuParams params, ContextMenuNativeDelegate nativeDelegate) { mParams = params; - mPopulator = populator; + mNativeDelegate = nativeDelegate; } /** @@ -32,14 +34,12 @@ * @param replyCallback The function to callback with the classification. */ public void classifyImageAsync(Callback<Boolean> replyCallback) { + Callback<Uri> callback = (uri) + -> LensController.getInstance().classifyImage(uri, mParams.getPageUrl(), + mParams.getTitleText(), (isClassificationSuccessful) -> { + replyCallback.onResult(isClassificationSuccessful); + }); // Must occur on UI thread. - mPopulator.retrieveImage(ContextMenuImageFormat.ORIGINAL, (uri) -> { - LensController.getInstance().classifyImage(uri, - mParams.getPageUrl(), - mParams.getTitleText(), - (isClassificationSuccessful) -> { - replyCallback.onResult(isClassificationSuccessful); - }); - }); + mNativeDelegate.retrieveImageForShare(ContextMenuImageFormat.ORIGINAL, callback); } } \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java index 1dd3460..d771df4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinator.java
@@ -9,7 +9,6 @@ import static org.chromium.chrome.browser.contextmenu.RevampedContextMenuItemWithIconButtonProperties.BUTTON_MENU_ID; import android.app.Activity; -import android.graphics.Bitmap; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; @@ -66,14 +65,19 @@ private float mTopContentOffsetPx; private ContextMenuDialog mDialog; private Runnable mOnMenuClosed; + private ContextMenuNativeDelegate mNativeDelegate; /** * Constructor that also sets the content offset. * * @param topContentOffsetPx content offset from the top. + * @param nativeDelegate The {@link ContextMenuNativeDelegate} to retrieve the thumbnail from + * native. */ - RevampedContextMenuCoordinator(float topContentOffsetPx) { + RevampedContextMenuCoordinator( + float topContentOffsetPx, ContextMenuNativeDelegate nativeDelegate) { mTopContentOffsetPx = topContentOffsetPx; + mNativeDelegate = nativeDelegate; } @Override @@ -135,8 +139,8 @@ ? PerformanceHintsObserver.getPerformanceClassForURL( webContents, params.getLinkUrl()) : PerformanceClass.PERFORMANCE_UNKNOWN; - mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator( - activity, performanceClass, params, Profile.fromWebContents(mWebContents)); + mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator(activity, performanceClass, + params, Profile.fromWebContents(mWebContents), mNativeDelegate); // The Integer here specifies the {@link ListItemType}. ModelList listItems = getItemList(activity, items, onItemClicked); @@ -271,15 +275,11 @@ mDialog.dismiss(); } - Callback<Bitmap> getOnImageThumbnailRetrievedReference() { - return mHeaderCoordinator.getOnImageThumbnailRetrievedReference(); - } - @VisibleForTesting - void initializeHeaderCoordinatorForTesting( - Activity activity, ContextMenuParams params, Profile profile) { + void initializeHeaderCoordinatorForTesting(Activity activity, ContextMenuParams params, + Profile profile, ContextMenuNativeDelegate nativeDelegate) { mHeaderCoordinator = new RevampedContextMenuHeaderCoordinator( - activity, PerformanceClass.PERFORMANCE_UNKNOWN, params, profile); + activity, PerformanceClass.PERFORMANCE_UNKNOWN, params, profile, nativeDelegate); } @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java index b9c61472..5a748f08 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderCoordinator.java
@@ -5,11 +5,9 @@ package org.chromium.chrome.browser.contextmenu; import android.app.Activity; -import android.graphics.Bitmap; import android.text.SpannableString; import android.text.TextUtils; -import org.chromium.base.Callback; import org.chromium.chrome.browser.ChromeBaseAppCompatActivity; import org.chromium.chrome.browser.night_mode.GlobalNightModeStateProviderHolder; import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier; @@ -25,10 +23,10 @@ private RevampedContextMenuHeaderMediator mMediator; RevampedContextMenuHeaderCoordinator(Activity activity, @PerformanceClass int performanceClass, - ContextMenuParams params, Profile profile) { + ContextMenuParams params, Profile profile, ContextMenuNativeDelegate nativeDelegate) { mModel = buildModel(ContextMenuUtils.getTitle(params), getUrl(activity, params, profile)); mMediator = new RevampedContextMenuHeaderMediator( - activity, mModel, performanceClass, params, profile); + activity, mModel, performanceClass, params, profile, nativeDelegate); } private PropertyModel buildModel(String title, CharSequence url) { @@ -70,10 +68,6 @@ return url; } - Callback<Bitmap> getOnImageThumbnailRetrievedReference() { - return mMediator::onImageThumbnailRetrieved; - } - PropertyModel getModel() { return mModel; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java index 66dfd50..74e34787 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java
@@ -41,13 +41,20 @@ private String mPlainUrl; RevampedContextMenuHeaderMediator(Context context, PropertyModel model, - @PerformanceClass int performanceClass, ContextMenuParams params, Profile profile) { + @PerformanceClass int performanceClass, ContextMenuParams params, Profile profile, + ContextMenuNativeDelegate nativeDelegate) { mContext = context; mPlainUrl = params.getUrl(); mModel = model; mModel.set(RevampedContextMenuHeaderProperties.TITLE_AND_URL_CLICK_LISTENER, this); - if (!params.isImage() && !params.isVideo()) { + if (params.isImage()) { + final Resources res = mContext.getResources(); + final int imageMaxSize = + res.getDimensionPixelSize(R.dimen.revamped_context_menu_header_image_max_size); + nativeDelegate.retrieveImageForContextMenu( + imageMaxSize, imageMaxSize, this::onImageThumbnailRetrieved); + } else if (!params.isImage() && !params.isVideo()) { LargeIconBridge iconBridge = new LargeIconBridge(profile); iconBridge.getLargeIconForStringUrl(mPlainUrl, context.getResources().getDimensionPixelSize(R.dimen.default_favicon_min_size),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java index fd42155..bd70c19 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -397,7 +397,8 @@ mIntentDataProvider.isOpenedByChrome(), mIntentDataProvider.shouldShowShareMenuItem(), mIntentDataProvider.shouldShowStarButton(), - mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito()); + mIntentDataProvider.shouldShowDownloadButton(), mIntentDataProvider.isIncognito(), + getModalDialogManager()); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java index 97bbdcb..50f9e89 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.appmenu.CustomViewBinder; import org.chromium.components.embedder_support.util.UrlConstants; +import org.chromium.ui.modaldialog.ModalDialogManager; import java.util.Collections; import java.util.HashMap; @@ -69,9 +70,10 @@ TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier, Verifier verifier, @CustomTabsUiType final int uiType, List<String> menuEntries, boolean isOpenedByChrome, - boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito) { + boolean showShare, boolean showStar, boolean showDownload, boolean isIncognito, + ModalDialogManager modalDialogManager) { super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector, - toolbarManager, decorView, null, bookmarkBridgeSupplier); + toolbarManager, decorView, null, bookmarkBridgeSupplier, modalDialogManager); mVerifier = verifier; mUiType = uiType; mMenuEntries = menuEntries; @@ -222,7 +224,10 @@ } updateRequestDesktopSiteMenuItem(menu, currentTab, requestDesktopSiteVisible); - prepareAddToHomescreenMenuItem(menu, currentTab, addToHomeScreenVisible); + MenuItem homescreenItem = menu.findItem(R.id.add_to_homescreen_id); + MenuItem openWebApkItem = menu.findItem(R.id.open_webapk_id); + prepareAddToHomescreenMenuItem( + homescreenItem, null, openWebApkItem, menu, currentTab, addToHomeScreenVisible); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java index e305f81..54e053f2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
@@ -377,9 +377,9 @@ } @Override - protected void onNativeDestroyed() { + protected void resetNativeInfoBar() { mNativeTranslateInfoBarPtr = 0; - super.onNativeDestroyed(); + super.resetNativeInfoBar(); } private void closeInfobar(boolean explicitly) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS index 680533f4..7c3b2545 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -15,6 +15,7 @@ "+chrome/android/java/src/org/chromium/chrome/browser/ssl/SecurityStateModel.java", "+chrome/android/java/src/org/chromium/chrome/browser/tab", "+chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java", + "+chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegate.java", "+chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulator.java", "+chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory.java", "+chrome/android/java/src/org/chromium/chrome/browser/ui/TabObscuringHandler.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java index c61573e..7ebb6fa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java
@@ -4,15 +4,11 @@ package org.chromium.chrome.browser.tab; -import android.graphics.Bitmap; -import android.net.Uri; import android.util.Pair; import androidx.annotation.Nullable; -import org.chromium.base.Callback; import org.chromium.base.ObserverList.RewindableIterator; -import org.chromium.chrome.browser.contextmenu.ContextMenuImageFormat; import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -38,13 +34,6 @@ } @Override - public void onDestroy() { - // |mPopulator| can be null for activities that do not use context menu. Following - // methods are not called, but |onDestroy| is. - if (mPopulator != null) mPopulator.onDestroy(); - } - - @Override public List<Pair<Integer, ModelList>> buildContextMenu(boolean isShoppyImage) { List<Pair<Integer, ModelList>> itemGroups = mPopulator.buildContextMenu(isShoppyImage); RewindableIterator<TabObserver> observers = mTab.getTabObservers(); @@ -60,16 +49,6 @@ } @Override - public void getThumbnail(final Callback<Bitmap> callback) { - mPopulator.getThumbnail(callback); - } - - @Override - public void retrieveImage(@ContextMenuImageFormat int imageFormat, Callback<Uri> callback) { - mPopulator.retrieveImage(imageFormat, callback); - } - - @Override public void onMenuClosed() { mPopulator.onMenuClosed(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory.java index e185050..39ff41ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulatorFactory.java
@@ -6,10 +6,10 @@ import android.content.Context; +import org.chromium.chrome.browser.contextmenu.ContextMenuNativeDelegate; import org.chromium.chrome.browser.contextmenu.ContextMenuPopulator; import org.chromium.chrome.browser.contextmenu.ContextMenuPopulatorFactory; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; -import org.chromium.content_public.browser.RenderFrameHost; /** * A simple wrapper around a {@link ContextMenuPopulatorFactory} for creating @@ -37,9 +37,9 @@ @Override public ContextMenuPopulator createContextMenuPopulator( - Context context, ContextMenuParams params, RenderFrameHost renderFrameHost) { + Context context, ContextMenuParams params, ContextMenuNativeDelegate nativeDelegate) { return new TabContextMenuPopulator( - mPopulatorFactory.createContextMenuPopulator(context, params, renderFrameHost), + mPopulatorFactory.createContextMenuPopulator(context, params, nativeDelegate), mTab); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java index b75c9ab..f096695 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; +import org.chromium.ui.modaldialog.ModalDialogManager; /** * An {@link AppMenuPropertiesDelegateImpl} for ChromeTabbedActivity. @@ -39,9 +40,11 @@ TabModelSelector tabModelSelector, ToolbarManager toolbarManager, View decorView, AppMenuDelegate appMenuDelegate, OneshotSupplier<OverviewModeBehavior> overviewModeBehaviorSupplier, - ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier) { + ObservableSupplier<BookmarkBridge> bookmarkBridgeSupplier, + ModalDialogManager modalDialogManager) { super(context, activityTabProvider, multiWindowModeStateDispatcher, tabModelSelector, - toolbarManager, decorView, overviewModeBehaviorSupplier, bookmarkBridgeSupplier); + toolbarManager, decorView, overviewModeBehaviorSupplier, bookmarkBridgeSupplier, + modalDialogManager); mAppMenuDelegate = appMenuDelegate; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index 6363f905a..bebf3bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -19,6 +19,8 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.app.ChromeActivity; +import org.chromium.chrome.browser.banners.AppBannerInProductHelpController; +import org.chromium.chrome.browser.banners.AppBannerInProductHelpControllerFactory; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.browser_controls.BrowserControlsSizer; import org.chromium.chrome.browser.compositor.bottombar.ephemeraltab.EphemeralTabCoordinator; @@ -77,6 +79,7 @@ private OfflineIndicatorInProductHelpController mOfflineIndicatorInProductHelpController; private UrlFocusChangeListener mUrlFocusChangeListener; private @Nullable ToolbarButtonInProductHelpController mToolbarButtonInProductHelpController; + private AppBannerInProductHelpController mAppBannerInProductHelpController; private ObservableSupplier<Boolean> mIntentWithEffect; private Callback<Boolean> mIntentWithEffectObserver; private HistoryNavigationCoordinator mHistoryNavigationCoordinator; @@ -152,6 +155,10 @@ mToolbarButtonInProductHelpController.destroy(); } + if (mAppBannerInProductHelpController != null) { + AppBannerInProductHelpControllerFactory.detach(mAppBannerInProductHelpController); + } + if (mHistoryNavigationCoordinator != null) { mHistoryNavigationCoordinator.destroy(); mHistoryNavigationCoordinator = null; @@ -319,6 +326,13 @@ new OfflineIndicatorInProductHelpController(mActivity, mToolbarManager, mAppMenuCoordinator.getAppMenuHandler(), mStatusIndicatorCoordinator); } + + mAppBannerInProductHelpController = + AppBannerInProductHelpControllerFactory.createAppBannerInProductHelpController( + mActivity, mAppMenuCoordinator.getAppMenuHandler(), + () -> mActivity.getToolbarManager().getMenuButtonView()); + AppBannerInProductHelpControllerFactory.attach( + mActivity.getWindowAndroid(), mAppBannerInProductHelpController); } private void initStatusIndicatorCoordinator(LayoutManager layoutManager) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java new file mode 100644 index 0000000..738b65b --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java
@@ -0,0 +1,29 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.vr; + +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; + +/** + * Helper used to ensure that the ArCore device is appropriately "installed" in + * the browser after any requisite dependencies (e.g. the AR DFM), have been + * installed. + */ +@JNINamespace("vr") +public class ArCoreDeviceUtils { + /** + * Installs the ArCoreDeviceProvider, so that the browser can use an ArCore device. + * Should be called once any ArCore dependencies (except ArCore itself) have been installed. + */ + public static void installArCoreDeviceProviderFactory() { + ArCoreDeviceUtilsJni.get().installArCoreDeviceProviderFactory(); + } + + @NativeMethods + /* package */ interface ArCodeDeviceUtilsNative { + void installArCoreDeviceProviderFactory(); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java index 854483aee..ee85d8f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java
@@ -17,7 +17,7 @@ @Override public void init() { - ArCoreInstallUtils.installArCoreDeviceProviderFactory(); + ArCoreDeviceUtils.installArCoreDeviceProviderFactory(); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorActivity.java new file mode 100644 index 0000000..c1d07ce8 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorActivity.java
@@ -0,0 +1,94 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.webauth.authenticator; + +import android.annotation.SuppressLint; +import android.app.ActivityManager; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.BitmapFactory; +import android.hardware.usb.UsbAccessory; +import android.hardware.usb.UsbManager; +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeBaseAppCompatActivity; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.init.ChromeBrowserInitializer; +import org.chromium.chrome.browser.webauthn.CableAuthenticatorModuleProvider; + +/** + * Phone as a Security Key activity. + * + * This activity lives in the main APK and is the target for: + * 1. Notifications triggered by cloud messages telling us that an authentication + * is pending. + * 2. A USB host telling the device that it wishes to speak CTAP2 over AOA. + * (See https://source.android.com/devices/accessories/aoa.) + * + * It hosts the {@link Fragment} that drives the security key process, which + * pulls in the dynamic feature module containing the needed code. + */ +public class CableAuthenticatorActivity extends ChromeBaseAppCompatActivity { + static final String EXTRA_SHOW_FRAGMENT_ARGUMENTS = "show_fragment_args"; + // See https://developer.android.com/guide/topics/connectivity/usb/accessory#java + static final String USB_ACCESSORY_ATTACHED = + "android.hardware.usb.action.USB_ACCESSORY_ATTACHED"; + + @Override + @SuppressLint("SetTextI18n") // TODO(BUG=1002262): translate + protected void onCreate(Bundle savedInstanceState) { + setTitle("Phone as a Security Key"); + + // Ensure that the full browser is running since this activity may be + // triggered by a USB message. + ChromeBrowserInitializer.getInstance().handleSynchronousStartup(); + + super.onCreate(savedInstanceState); + + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_AUTH_PHONE_SUPPORT)) { + // Ensure that connected USB devices cannot trigger this logic prior + // to launch review completion. + return; + } + + final Intent intent = getIntent(); + Bundle arguments; + if (intent.getAction() != null && intent.getAction().equals(USB_ACCESSORY_ATTACHED)) { + // This can be triggered by an implicit intent if a desktop + // Chrome is connected via USB. This is used to expose the + // phone's security key to the desktop. + UsbAccessory accessory = + (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); + + // The specific extra of interest is filtered out rather than + // passing intent's whole Bundle because the external Intent + // is untrusted. + arguments = new Bundle(); + arguments.putParcelable(UsbManager.EXTRA_ACCESSORY, accessory); + } else { + // Since this Activity is not exported, this only happens when a + // notification is tapped and |EXTRA_SHOW_FRAGMENT_ARGUMENTS| thus + // comes from our own PendingIntent. + arguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS); + } + + Fragment fragment = new CableAuthenticatorModuleProvider(); + fragment.setArguments(arguments); + + getSupportFragmentManager() + .beginTransaction() + .replace(android.R.id.content, fragment) + .commit(); + + Resources res = getResources(); + setTaskDescription(new ActivityManager.TaskDescription(res.getString(R.string.app_name), + BitmapFactory.decodeResource(res, R.mipmap.app_icon), + ApiCompatibilityUtils.getColor(res, R.color.default_primary_color))); + } +}
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 2dcef8bd..ed8dc9b 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni
@@ -42,9 +42,8 @@ if (enable_arcore) { chrome_java_sources += [ - "java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java", + "java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java", "java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java", - "java/src/org/chromium/chrome/browser/vr/ArCoreShim.java", "java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java", "java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java", ]
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java index 3b7b2086..83e2c08a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java
@@ -15,6 +15,7 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; @@ -38,6 +39,7 @@ /** Tests Copyless Paste AppIndexing using instrumented tests. */ @RunWith(ChromeJUnit4ClassRunner.class) +@Batch(Batch.PER_CLASS) @CommandLineFlags. Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=CopylessPaste"}) @Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java index fbcebdc..7d5afaf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuTest.java
@@ -51,6 +51,9 @@ import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.content_public.browser.test.util.TestTouchUtils; +import org.chromium.ui.modaldialog.ModalDialogProperties; +import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.test.util.UiDisableIf; import org.chromium.ui.test.util.UiRestriction; @@ -439,6 +442,63 @@ @Test @SmallTest @Feature({"Browser", "Main", "RenderTest"}) + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + @EnableFeatures({ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_THREE_BUTTON_ACTIONBAR + "<Study"}) + @CommandLineFlags.Add({"force-fieldtrials=Study/Group", + "force-fieldtrial-params=Study.Group:three_button_action_bar/add_to_option"}) + public void + testAddToMenuItem_not_bookmarked() throws IOException { + LinearLayout actionBar = (LinearLayout) getListView().getChildAt(0); + Assert.assertEquals(3, actionBar.getChildCount()); + mRenderTestRule.render(getListView().getChildAt(0), "icon_row_three_buttons"); + + int addToIndex = findIndexOfMenuItemById(R.id.add_to_menu_id); + Assert.assertNotEquals("No add to row found.", -1, addToIndex); + mRenderTestRule.render(getListView().getChildAt(addToIndex), "add_to_menu_item"); + + View addToItem = getListView().getChildAt(addToIndex); + PropertyModel dialogModel = clickAndGetCurrentDialog(addToItem); + Assert.assertNotNull("No add to dialog found.", dialogModel); + ListView addToCustomView = (ListView) dialogModel.get(ModalDialogProperties.CUSTOM_VIEW); + Assert.assertEquals(3, addToCustomView.getChildCount()); + mRenderTestRule.render(addToCustomView, "add_to_dialog_not_bookmarked"); + } + + @Test + @SmallTest + @Feature({"Browser", "Main", "RenderTest"}) + @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) + @EnableFeatures({ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_THREE_BUTTON_ACTIONBAR + "<Study"}) + @CommandLineFlags.Add({"force-fieldtrials=Study/Group", + "force-fieldtrial-params=Study.Group:three_button_action_bar/add_to_option"}) + public void + testAddToMenuItem_bookmarked() throws IOException { + TestThreadUtils.runOnUiThreadBlocking(() -> mAppMenuHandler.hideAppMenu()); + AppMenuPropertiesDelegateImpl.setPageBookmarkedForTesting(true); + showAppMenuAndAssertMenuShown(); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + LinearLayout actionBar = (LinearLayout) getListView().getChildAt(0); + Assert.assertEquals("Add to Bookmarks/Downloads/Home screen should be shown", 3, + actionBar.getChildCount()); + mRenderTestRule.render(getListView().getChildAt(0), "icon_row_three_buttons"); + + int addToIndex = findIndexOfMenuItemById(R.id.add_to_menu_id); + Assert.assertNotEquals("No add to row found.", -1, addToIndex); + mRenderTestRule.render(getListView().getChildAt(addToIndex), "add_to_menu_item"); + + View addToItem = getListView().getChildAt(addToIndex); + PropertyModel dialogModel = clickAndGetCurrentDialog(addToItem); + Assert.assertNotNull("No add to dialog found.", dialogModel); + ListView addToCustomView = (ListView) dialogModel.get(ModalDialogProperties.CUSTOM_VIEW); + Assert.assertEquals(3, addToCustomView.getChildCount()); + mRenderTestRule.render(addToCustomView, "add_to_dialog_bookmarked"); + + AppMenuPropertiesDelegateImpl.setPageBookmarkedForTesting(null); + } + + @Test + @SmallTest + @Feature({"Browser", "Main", "RenderTest"}) @EnableFeatures({ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_REGROUP}) public void testDividerLineMenuItem() throws IOException { int firstDividerLineIndex = findIndexOfMenuItemById(R.id.divider_line_id); @@ -530,4 +590,19 @@ return foundMenuItem ? firstMenuItemIndex : -1; } + + private PropertyModel clickAndGetCurrentDialog(View view) { + TestTouchUtils.performClickOnMainSync(InstrumentationRegistry.getInstrumentation(), view); + CriteriaHelper.pollUiThread(() -> { + PropertyModel propertyModel = mActivityTestRule.getActivity() + .getModalDialogManager() + .getCurrentDialogForTest(); + Criteria.checkThat(propertyModel, Matchers.notNullValue()); + }); + return TestThreadUtils.runOnUiThreadBlockingNoException( + () + -> mActivityTestRule.getActivity() + .getModalDialogManager() + .getCurrentDialogForTest()); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java index bcfdbc5c..9c1ac1d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java
@@ -37,7 +37,6 @@ import org.chromium.chrome.browser.share.ShareDelegate; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; import org.chromium.components.search_engines.TemplateUrlService; -import org.chromium.content_public.browser.RenderFrameHost; import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.ui.base.MenuSourceType; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; @@ -67,7 +66,7 @@ @Mock private ExternalAuthUtils mExternalAuthUtils; @Mock - private RenderFrameHost mRenderFrameHost; + private ContextMenuNativeDelegate mNativeDelegate; // Despite this being a spy, we add the @Mock annotation so that proguard doesn't strip the // spied class. @@ -100,7 +99,7 @@ () -> mShareDelegate, mode, mExternalAuthUtils, ContextUtils.getApplicationContext(), params, - mRenderFrameHost)); + mNativeDelegate)); doReturn(mTemplateUrlService).when(mPopulator).getTemplateUrlService(); doReturn(false).when(mPopulator).shouldTriggerEphemeralTabHelpUi(); doReturn(true).when(mExternalAuthUtils).isGoogleSigned(IntentHandler.PACKAGE_GSA);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java index c41e1ee..f93a85a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuTest.java
@@ -1098,7 +1098,8 @@ String mockImageData = "randomdata"; byte[] mockImageByteArray = mockImageData.getBytes(); // See function javadoc for more context. - ChromeContextMenuPopulator.setHardcodedImageBytesForTesting(mockImageByteArray, extension); + ContextMenuNativeDelegateImpl.setHardcodedImageBytesForTesting( + mockImageByteArray, extension); } private void assertStringContains(String subString, String superString) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/profiles/ProfileTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/profiles/ProfileTest.java index 3ca00b22..4825765 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/profiles/ProfileTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/profiles/ProfileTest.java
@@ -8,15 +8,18 @@ import org.junit.Assert; import org.junit.Before; +import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; +import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -25,24 +28,29 @@ * distinctly created. */ @RunWith(ChromeJUnit4ClassRunner.class) +@Batch(Batch.PER_CLASS) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class ProfileTest { + @ClassRule + public static final ChromeTabbedActivityTestRule sActivityTestRule = + new ChromeTabbedActivityTestRule(); + @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + public final BlankCTATabInitialStateRule mInitialStateRule = + new BlankCTATabInitialStateRule(sActivityTestRule, false); public Profile mRegularProfile; @Before public void setUp() { - mActivityTestRule.startMainActivityOnBlankPage(); createRegularProfileOnUiThread(); } private void createRegularProfileOnUiThread() { TestThreadUtils.runOnUiThreadBlocking(() -> { - mActivityTestRule.getActivity().getTabCreator(false).createNewTab( + sActivityTestRule.getActivity().getTabCreator(false).createNewTab( new LoadUrlParams("about:blank"), TabLaunchType.FROM_CHROME_UI, null); - mRegularProfile = mActivityTestRule.getActivity() + mRegularProfile = sActivityTestRule.getActivity() .getTabModelSelector() .getModel(false) .getProfile();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java new file mode 100644 index 0000000..95989ce --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java
@@ -0,0 +1,45 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tab.state; + +import android.support.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.chrome.browser.tab.MockTab; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.test.ChromeBrowserTestRule; + +/** + * Test relating to {@link ShoppingPersistedTabData} + */ +@RunWith(BaseJUnit4ClassRunner.class) +public class ShoppingPersistedTabDataTest { + @Rule + public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule(); + + private static final int TAB_ID = 1; + private static final boolean IS_INCOGNITO = false; + private static final String PRICE_STRING = "$2.87"; + + @SmallTest + @Test + public void testShoppingProto() { + ThreadUtils.runOnUiThreadBlocking(() -> { + Tab tab = new MockTab(TAB_ID, IS_INCOGNITO); + ShoppingPersistedTabData shoppingPersistedTabData = new ShoppingPersistedTabData(tab); + shoppingPersistedTabData.setPriceString(PRICE_STRING); + byte[] serialized = shoppingPersistedTabData.serialize(); + ShoppingPersistedTabData deserialized = new ShoppingPersistedTabData(tab); + deserialized.deserialize(serialized); + Assert.assertEquals(PRICE_STRING, deserialized.getPriceString()); + }); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java index 0c971c45..bd3b6198 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -61,6 +61,7 @@ import org.chromium.content_public.browser.ContentFeatureList; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.modaldialog.ModalDialogManager; import java.util.ArrayList; import java.util.List; @@ -108,6 +109,8 @@ private Profile mProfile; @Mock private PrefService mPrefService; + @Mock + private ModalDialogManager mModalDialogManager; private OneshotSupplierImpl<OverviewModeBehavior> mOverviewModeSupplier = new OneshotSupplierImpl<>(); @@ -144,7 +147,7 @@ mAppMenuPropertiesDelegate = Mockito.spy(new AppMenuPropertiesDelegateImpl( ContextUtils.getApplicationContext(), mActivityTabProvider, mMultiWindowModeStateDispatcher, mTabModelSelector, mToolbarManager, mDecorView, - mOverviewModeSupplier, mBookmarkBridgeSupplier)); + mOverviewModeSupplier, mBookmarkBridgeSupplier, mModalDialogManager)); } @After @@ -524,6 +527,81 @@ @Test @Config(qualifiers = "sw320dp") + public void testPageMenuItems_Phone_RegularPage_threebutton_actionbar_add_to_menuitem() { + CachedFeatureFlags.setForTesting(ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_REGROUP, true); + CachedFeatureFlags.setForTesting( + ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_THREE_BUTTON_ACTIONBAR, true); + AppMenuPropertiesDelegateImpl.ACTION_BAR_VARIATION.setForTesting("share_button"); + AppMenuPropertiesDelegateImpl.THREE_BUTTON_ACTION_BAR_VARIATION.setForTesting( + "add_to_option"); + setUpMocksForPageMenu(); + setMenuOptions(false /*isNativePage*/, true /*showTranslate*/, true /*showUpdate*/, + true /*showMoveToOtherWindow*/, false /*showReaderModePrefs*/, + true /*showAddToHomeScreen*/, true /*showPaintPreview*/); + + Assert.assertEquals(MenuGroup.PAGE_MENU, mAppMenuPropertiesDelegate.getMenuGroup()); + Menu menu = createTestMenu(); + mAppMenuPropertiesDelegate.prepareMenu(menu, null); + + Integer[] expectedItems = {R.id.icon_row_menu_id, R.id.update_menu_id, R.id.new_tab_menu_id, + R.id.new_incognito_tab_menu_id, R.id.move_to_other_window_menu_id, + R.id.divider_line_id, R.id.open_history_menu_id, R.id.downloads_row_menu_id, + R.id.all_bookmarks_row_menu_id, R.id.recent_tabs_menu_id, + R.id.add_to_divider_line_id, R.id.add_to_menu_id, R.id.divider_line_id, + R.id.paint_preview_show_id, R.id.find_in_page_id, R.id.translate_id, + R.id.request_desktop_site_row_menu_id, R.id.divider_line_id, R.id.preferences_id, + R.id.info_id, R.id.help_id}; + Integer[] expectedActionBarItems = { + R.id.forward_menu_id, R.id.share_menu_button_id, R.id.reload_menu_id}; + Integer[] expectedAddToItems = {R.id.add_to_bookmarks_menu_id, + R.id.add_to_downloads_menu_id, R.id.add_to_homescreen_menu_id}; + assertMenuItemsAreEqual(menu, expectedItems); + assertActionBarItemsAreEqual(menu, expectedActionBarItems); + assertAddToItemsAreEqual(menu, expectedAddToItems); + } + + @Test + @Config(qualifiers = "sw320dp") + public void + testPageMenuItems_Phone_RegularPage_threebutton_actionbar_add_to_menuitem_intall_app() { + CachedFeatureFlags.setForTesting(ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_REGROUP, true); + CachedFeatureFlags.setForTesting( + ChromeFeatureList.TABBED_APP_OVERFLOW_MENU_THREE_BUTTON_ACTIONBAR, true); + AppMenuPropertiesDelegateImpl.ACTION_BAR_VARIATION.setForTesting("share_button"); + AppMenuPropertiesDelegateImpl.THREE_BUTTON_ACTION_BAR_VARIATION.setForTesting( + "add_to_option"); + setUpMocksForPageMenu(); + setMenuOptions(false /*isNativePage*/, true /*showTranslate*/, true /*showUpdate*/, + true /*showMoveToOtherWindow*/, false /*showReaderModePrefs*/, + false /*showAddToHomeScreen*/, true /*showPaintPreview*/); + doReturn(new AppBannerManager.InstallStringPair( + R.string.menu_add_to_homescreen_install, R.string.app_banner_install)) + .when(mAppMenuPropertiesDelegate) + .getAddToHomeScreenTitle(mTab); + + Assert.assertEquals(MenuGroup.PAGE_MENU, mAppMenuPropertiesDelegate.getMenuGroup()); + Menu menu = createTestMenu(); + mAppMenuPropertiesDelegate.prepareMenu(menu, null); + + Integer[] expectedItems = {R.id.icon_row_menu_id, R.id.update_menu_id, R.id.new_tab_menu_id, + R.id.new_incognito_tab_menu_id, R.id.move_to_other_window_menu_id, + R.id.divider_line_id, R.id.open_history_menu_id, R.id.downloads_row_menu_id, + R.id.all_bookmarks_row_menu_id, R.id.recent_tabs_menu_id, + R.id.add_to_divider_line_id, R.id.add_to_menu_id, R.id.install_app_id, + R.id.divider_line_id, R.id.paint_preview_show_id, R.id.find_in_page_id, + R.id.translate_id, R.id.request_desktop_site_row_menu_id, R.id.divider_line_id, + R.id.preferences_id, R.id.info_id, R.id.help_id}; + Integer[] expectedActionBarItems = { + R.id.forward_menu_id, R.id.share_menu_button_id, R.id.reload_menu_id}; + Integer[] expectedAddToItems = { + R.id.add_to_bookmarks_menu_id, R.id.add_to_downloads_menu_id}; + assertMenuItemsAreEqual(menu, expectedItems); + assertActionBarItemsAreEqual(menu, expectedActionBarItems); + assertAddToItemsAreEqual(menu, expectedAddToItems); + } + + @Test + @Config(qualifiers = "sw320dp") public void testOverviewMenuItems_Phone() { setUpMocksForOverviewMenu(); when(mIncognitoTabModel.getCount()).thenReturn(0); @@ -691,6 +769,19 @@ Matchers.containsInAnyOrder(expectedItems)); } + private void assertAddToItemsAreEqual(Menu menu, Integer... expectedItems) { + SubMenu addToSubMenu = menu.findItem(R.id.add_to_menu_id).getSubMenu(); + List<Integer> actualItems = new ArrayList<>(); + for (int i = 0; i < addToSubMenu.size(); i++) { + if (addToSubMenu.getItem(i).isVisible()) { + actualItems.add(addToSubMenu.getItem(i).getItemId()); + } + } + + Assert.assertThat("Populated add to items were:" + getMenuTitles(addToSubMenu), actualItems, + Matchers.containsInAnyOrder(expectedItems)); + } + private String getMenuTitles(Menu menu) { StringBuilder items = new StringBuilder(); for (int i = 0; i < menu.size(); i++) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinatorTest.java index c458e2c..64ac722 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuCoordinatorTest.java
@@ -54,6 +54,8 @@ @Mock PerformanceHintsObserver.Natives mNativeMock; + @Mock + ContextMenuNativeDelegate mNativeDelegate; private RevampedContextMenuCoordinator mCoordinator; private Activity mActivity; @@ -62,7 +64,7 @@ @Before public void setUpTest() { mActivity = Robolectric.setupActivity(Activity.class); - mCoordinator = new RevampedContextMenuCoordinator(0); + mCoordinator = new RevampedContextMenuCoordinator(0, mNativeDelegate); MockitoAnnotations.initMocks(this); mocker.mock(PerformanceHintsObserverJni.TEST_HOOKS, mNativeMock); when(mNativeMock.isContextMenuPerformanceInfoEnabled()).thenReturn(false); @@ -87,7 +89,8 @@ groupTwo.add(createShareListItem(Item.SHARE_IMAGE)); rawItems.add(new Pair<>(ContextMenuGroup.IMAGE, groupTwo)); - mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params, mProfile); + mCoordinator.initializeHeaderCoordinatorForTesting( + mActivity, params, mProfile, mNativeDelegate); ModelList itemList = mCoordinator.getItemList(mActivity, rawItems, (i) -> {}); assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER)); @@ -119,7 +122,8 @@ groupOne.add(createShareListItem(Item.SHARE_LINK)); rawItems.add(new Pair<>(ContextMenuGroup.LINK, groupOne)); - mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params, mProfile); + mCoordinator.initializeHeaderCoordinatorForTesting( + mActivity, params, mProfile, mNativeDelegate); ModelList itemList = mCoordinator.getItemList(mActivity, rawItems, (i) -> {}); assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER)); @@ -140,7 +144,8 @@ groupOne.add(createListItem(Item.SAVE_VIDEO)); rawItems.add(new Pair<>(ContextMenuGroup.LINK, groupOne)); - mCoordinator.initializeHeaderCoordinatorForTesting(mActivity, params, mProfile); + mCoordinator.initializeHeaderCoordinatorForTesting( + mActivity, params, mProfile, mNativeDelegate); ModelList itemList = mCoordinator.getItemList(mActivity, rawItems, (i) -> {}); assertThat(itemList.get(0).type, equalTo(ListItemType.HEADER));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediatorTest.java index ae28a46..8936b19 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediatorTest.java
@@ -43,6 +43,8 @@ @Mock PerformanceHintsObserver.Natives mNativeMock; + @Mock + ContextMenuNativeDelegate mNativeDelegate; private Activity mActivity; private final Profile mProfile = Mockito.mock(Profile.class); @@ -65,8 +67,9 @@ final ContextMenuParams params = new ContextMenuParams(0, ContextMenuDataMediaType.IMAGE, "https://example.org", "https://example.org/sitemap", "", "", "", "", null, false, 0, 0, 0); - final RevampedContextMenuHeaderMediator mediator = new RevampedContextMenuHeaderMediator( - mActivity, model, PerformanceClass.PERFORMANCE_FAST, params, mProfile); + final RevampedContextMenuHeaderMediator mediator = + new RevampedContextMenuHeaderMediator(mActivity, model, + PerformanceClass.PERFORMANCE_FAST, params, mProfile, mNativeDelegate); assertThat(model.get(RevampedContextMenuHeaderProperties.URL_PERFORMANCE_CLASS), equalTo(PerformanceClass.PERFORMANCE_FAST)); } @@ -82,8 +85,9 @@ final ContextMenuParams params = new ContextMenuParams(0, ContextMenuDataMediaType.IMAGE, "https://example.org", "https://example.org/sitemap", "", "", "", "", null, false, 0, 0, 0); - final RevampedContextMenuHeaderMediator mediator = new RevampedContextMenuHeaderMediator( - mActivity, model, PerformanceClass.PERFORMANCE_FAST, params, mProfile); + final RevampedContextMenuHeaderMediator mediator = + new RevampedContextMenuHeaderMediator(mActivity, model, + PerformanceClass.PERFORMANCE_FAST, params, mProfile, mNativeDelegate); assertThat(model.get(RevampedContextMenuHeaderProperties.URL_PERFORMANCE_CLASS), equalTo(PerformanceClass.PERFORMANCE_UNKNOWN)); } @@ -98,8 +102,9 @@ .build(); final ContextMenuParams params = new ContextMenuParams(0, ContextMenuDataMediaType.IMAGE, "https://example.org", "", "", "", "", "", null, false, 0, 0, 0); - final RevampedContextMenuHeaderMediator mediator = new RevampedContextMenuHeaderMediator( - mActivity, model, PerformanceClass.PERFORMANCE_FAST, params, mProfile); + final RevampedContextMenuHeaderMediator mediator = + new RevampedContextMenuHeaderMediator(mActivity, model, + PerformanceClass.PERFORMANCE_FAST, params, mProfile, mNativeDelegate); assertThat(model.get(RevampedContextMenuHeaderProperties.URL_PERFORMANCE_CLASS), equalTo(PerformanceClass.PERFORMANCE_UNKNOWN)); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java index 226d0b7..48b55bf 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
@@ -53,6 +53,7 @@ import org.chromium.content_public.browser.ContentFeatureList; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.modaldialog.ModalDialogManager; import java.util.ArrayList; import java.util.List; @@ -98,6 +99,8 @@ Profile mProfileMock; @Mock private ContentFeatureListImpl.Natives mContentFeatureListJniMock; + @Mock + private ModalDialogManager mModalDialogManager; private OneshotSupplierImpl<OverviewModeBehavior> mOverviewModeSupplier = new OneshotSupplierImpl<>(); @@ -126,10 +129,11 @@ ContentFeatureList.EXPERIMENTAL_ACCESSIBILITY_LABELS)) .thenReturn(false); - mTabbedAppMenuPropertiesDelegate = Mockito.spy(new TabbedAppMenuPropertiesDelegate( - ContextUtils.getApplicationContext(), mActivityTabProvider, - mMultiWindowModeStateDispatcher, mTabModelSelector, mToolbarManager, mDecorView, - mAppMenuDelegate, mOverviewModeSupplier, mBookmarkBridgeSupplier)); + mTabbedAppMenuPropertiesDelegate = Mockito.spy( + new TabbedAppMenuPropertiesDelegate(ContextUtils.getApplicationContext(), + mActivityTabProvider, mMultiWindowModeStateDispatcher, mTabModelSelector, + mToolbarManager, mDecorView, mAppMenuDelegate, mOverviewModeSupplier, + mBookmarkBridgeSupplier, mModalDialogManager)); } @Test
diff --git a/chrome/android/modules/chrome_bundle_tmpl.gni b/chrome/android/modules/chrome_bundle_tmpl.gni index 48fcb8c..3710457b 100644 --- a/chrome/android/modules/chrome_bundle_tmpl.gni +++ b/chrome/android/modules/chrome_bundle_tmpl.gni
@@ -76,7 +76,7 @@ java_deps = [ "//chrome/android:chrome_all_java" ] + _java_deps if (enable_arcore) { java_deps += [ - "//chrome/browser/android/vr:ar_java", + "//components/webxr/android:ar_java", "//third_party/arcore-android-sdk-client:com_google_ar_core_java", ] }
diff --git a/chrome/android/monochrome/scripts/monochrome_python_tests.py b/chrome/android/monochrome/scripts/monochrome_python_tests.py index bce6563..13df49c 100755 --- a/chrome/android/monochrome/scripts/monochrome_python_tests.py +++ b/chrome/android/monochrome/scripts/monochrome_python_tests.py
@@ -40,9 +40,6 @@ parser.add_argument( '--system-webview-pathmap', help='The system webview APK resources pathmap path.') - parser.add_argument( - '--avd-config', - help='Workaround for crbug.com/1137405, do not use.') return parser @@ -52,12 +49,6 @@ runner = typ.Runner() runner.parse_args(argument_parser, argv[1:]) - # Disable all checks when --avd-config is provided because it is not supported - # by the typ.ArgumentParser(). This should happen only with tests running on - # Android emulator. TODO(crbug.com/1137405): Add support for --avd-config to - # typ. - if runner.args.avd_config: - return 0 runner.args.top_level_dirs = [ os.path.dirname(__file__) ] runner.context = runner.args
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index d7af6bf0..bf0fe29 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -2247,6 +2247,10 @@ desc="Customization label for the new tab button in the touch bar."> New Tab </message> + <message name="IDS_TOUCH_BAR_URL_CUSTOMIZATION_LABEL" + desc="Customization label for the URL field in the touch bar."> + Page URL + </message> </if> <!-- Abandon in-progress downloads confirmation dialog --> @@ -4032,9 +4036,6 @@ <message name="IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE" desc="Permission string for network list access."> Access list of network connections </message> - <message name="IDS_EXTENSION_PROMPT_WARNING_NETWORKING_CONFIG" desc="Permission string for Networking Config API."> - Configure network connections - </message> <message name="IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE" desc="Permission string for Networking Private API."> Manage network connections </message> @@ -9494,6 +9495,24 @@ <message name="IDS_LIVE_CAPTION_BUBBLE_ERROR" desc="Error message for the Live Caption bubble when Live Captions are unavailable."> Live Caption is not available right now </message> + <if expr="chromeos"> + <message name="IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT" desc="Announcement to screen readers on ChromeOS when the Live Caption bubble appears to inform users of how to focus the bubble."> + Live Caption visible, press Ctrl + Back or Ctrl + Forward to cycle focus + </message> + </if> + <if expr="is_macosx"> + <message name="IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT" desc="Announcement to screen readers on MacOS when the Live Caption bubble appears to inform users of how to focus the bubble."> + Live Caption visible, press ⌘ + Option + Up arrow or Down arrow to cycle focus + </message> + </if> + <if expr="is_win or desktop_linux"> + <message name="IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT" desc="Announcement to screen readers on Windows or Linux when the Live Caption bubble appears to inform users of how to focus the bubble."> + Live Caption visible, press F6 to cycle focus + </message> + </if> + <message name="IDS_LIVE_CAPTION_BUBBLE_MOVE_SCREENREADER_ANNOUNCEMENT" desc="Announcement to screen readers when the Live Caption bubble moves."> + Moved caption bubble to <ph name="POSITION_ON_SCREEN_FROM_LEFT">$1<ex>20</ex></ph>% across, <ph name="POSITION_ON_SCREEN_FROM_TOP">$2<ex>80</ex></ph>% down + </message> <!-- Caret browsing. --> <if expr="not chromeos">
diff --git a/chrome/app/generated_resources_grd/IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT.png.sha1 b/chrome/app/generated_resources_grd/IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT.png.sha1 new file mode 100644 index 0000000..beda8c7 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT.png.sha1
@@ -0,0 +1 @@ +5230947232906708b0262c0f093cbe3e7617b65e \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_LIVE_CAPTION_BUBBLE_MOVE_SCREENREADER_ANNOUNCEMENT.png.sha1 b/chrome/app/generated_resources_grd/IDS_LIVE_CAPTION_BUBBLE_MOVE_SCREENREADER_ANNOUNCEMENT.png.sha1 new file mode 100644 index 0000000..beda8c7 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_LIVE_CAPTION_BUBBLE_MOVE_SCREENREADER_ANNOUNCEMENT.png.sha1
@@ -0,0 +1 @@ +5230947232906708b0262c0f093cbe3e7617b65e \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TOUCH_BAR_URL_CUSTOMIZATION_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_TOUCH_BAR_URL_CUSTOMIZATION_LABEL.png.sha1 new file mode 100644 index 0000000..7ed505c9 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_TOUCH_BAR_URL_CUSTOMIZATION_LABEL.png.sha1
@@ -0,0 +1 @@ +6c6e424489528fd834c66f8eeb477cb5d49cd7c2 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index a910453..a54bdab 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -46,6 +46,7 @@ <translation id="2711502716910134313">Chromium ടാബ്</translation> <translation id="2718390899429598676">അധിക സുരക്ഷക്കായി, Chromium നിങ്ങളുടെ ഡാറ്റ എന്ക്രിപ്റ്റ് ചെയ്യും.</translation> <translation id="2770231113462710648">ഡിഫോൾട്ട് ബ്രൗസര് ഇനിപ്പറയുന്നതിലേക്ക് മാറ്റുക:</translation> +<translation id="2774556997178638058">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താനുള്ള Chromium-ന്റെ പരിശോധന, <ph name="BEGIN_LINK" />നിങ്ങളുടെ അഡ്മിൻ<ph name="END_LINK" /> പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="2847479871509788944">Chromium-ൽ നിന്ന് നീക്കംചെയ്യുക...</translation> <translation id="2853765747879685679">ഞാൻ Chromium തുറക്കുമ്പോൾ ചോദിക്കുക</translation> @@ -53,6 +54,7 @@ <translation id="2910007522516064972">&Chromium-നെക്കുറിച്ച്</translation> <translation id="2977470724722393594">Chromium അപ്ടുഡേറ്റാണ്</translation> <translation id="2983934633046890458">പാസ്വേഡുകൾ എഡിറ്റ് ചെയ്യാൻ Chromium ശ്രമിക്കുന്നു.</translation> +<translation id="3031887101543416445">{NUM_DAYS,plural, =1{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഒരു ദിവസം മുമ്പ്.}other{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: {NUM_DAYS} ദിവസം മുമ്പ്.}}</translation> <translation id="3032706164202344641">Chromium-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="3032787606318309379">Chromium-ലേക്ക് ചേർക്കുന്നു...</translation> <translation id="3068515742935458733">Google-ലേക്ക് ക്രാഷ് റിപ്പോർട്ടുകളും <ph name="UMA_LINK" /> എന്നതും അയയ്ക്കുന്നതിലൂടെ Chromium മികച്ചതാക്കാൻ സഹായിക്കുക</translation> @@ -72,6 +74,7 @@ <translation id="347328004046849135">അപഹരിക്കപ്പെട്ട പാസ്വേഡ് ഉപയോഗിച്ച് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുമ്പോൾ Chromium നിങ്ങളെ അറിയിക്കും</translation> <translation id="3474745554856756813">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും <ph name="ITEMS_COUNT" /> ഇനങ്ങൾ ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="3509308970982693815">എല്ലാ Chromium വിൻഡോകളും അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="3527440529060401414">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താൻ Chromium-ന് നിങ്ങളുടെ കമ്പ്യൂട്ടർ പരിശോധിക്കാനാകും</translation> <translation id="3575459661164320785">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ദോഷകരമായ സോഫ്റ്റ്വെയറുണ്ട്. നിങ്ങളുടെ ബ്രൗസർ വീണ്ടും സാധാരണ രീതിയിൽ പ്രവർത്തിക്കാൻ, Chromium-ന് ഇത് നീക്കം ചെയ്യാനും ക്രമീകരണം പുനഃസ്ഥാപിക്കാനും വിപുലീകരണം പ്രവർത്തനരഹിതമാക്കാനുമാവും.</translation> <translation id="3639635944603682591">ഈ ഉപകരണത്തിൽ നിന്ന് ഈ വ്യക്തിയുടെ ബ്രൗസിംഗ് ഡാറ്റ ഇല്ലാതാക്കും. ഡാറ്റ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നതായി Chromium-ത്തിലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="364817392622123556">{COUNT,plural, =0{Chromium-നുള്ള പുതിയൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്, നിങ്ങൾ വീണ്ടും ആരംഭിച്ച ഉടൻ തന്നെ അത് ബാധകമാക്കും.}=1{Chromium-നുള്ള പുതിയൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്, നിങ്ങൾ വീണ്ടും ആരംഭിച്ച ഉടൻ തന്നെ അത് ബാധകമാക്കും. നിങ്ങളുടെ അദൃശ്യ വിൻഡോ വീണ്ടും തുറക്കില്ല.}other{Chromium-നുള്ള പുതിയൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്, നിങ്ങൾ വീണ്ടും ആരംഭിച്ച ഉടൻ തന്നെ അത് ബാധകമാക്കും. നിങ്ങളുടെ # അദൃശ്യ വിൻഡോകൾ വീണ്ടും തുറക്കില്ല.}}</translation> @@ -87,18 +90,21 @@ <translation id="3945058413678539331">പാസ്വേഡുകൾ പകർത്താൻ Chromium ശ്രമിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്വേഡ് നൽകുക.</translation> <translation id="4036079820698952681"><ph name="BEGIN_LINK" />നിലവിലെ ക്രമീകരണം<ph name="END_LINK" /> റിപ്പോർട്ട് ചെയ്തുകൊണ്ട് Chromium മികച്ചതാക്കാൻ സഹായിക്കുക</translation> <translation id="4050175100176540509">ഏറ്റവും പുതിയ പതിപ്പിൽ പ്രധാനപ്പെട്ട സുരക്ഷാ മെച്ചപ്പെടുത്തലുകളും പുതിയ ഫീച്ചറുകളും ലഭ്യമാണ്.</translation> +<translation id="4136604564421273381">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium നീക്കം ചെയ്യുന്നു...</translation> <translation id="419998258129752635"><ph name="PAGE_TITLE" /> - നെറ്റ്വർക്ക് സൈൻ ഇൻ - Chromium</translation> <translation id="421369550622382712">Chromium-നായി മികച്ച അപ്ലിക്കേഷനുകളും വിപുലീകരണങ്ങളും തീമുകളും കണ്ടെത്തുക.</translation> <translation id="4216212958613226427">Chromium UI പ്രദര്ശിപ്പിക്കാൻ ഈ ഭാഷ ഉപയോഗിക്കുന്നു</translation> <translation id="4230135487732243613">നിങ്ങളുടെ Chromium ഡാറ്റ ഈ അക്കൗണ്ടുമായി ലിങ്ക് ചെയ്യണോ?</translation> <translation id="4271805377592243930">Chromium ഉപയോഗിക്കുന്നതിനുള്ള സഹായം തേടുക</translation> <translation id="4285930937574705105">അവ്യക്തമായ പിശകിനാൽ ഇൻസ്റ്റാൾ ചെയ്യൽ പരാജയപ്പെട്ടു. Chromium നിലവിൽ പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, അത് അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="4352041330999353637">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഇന്നലെ.</translation> <translation id="4407044323746248786">എന്തായാലും Chromium-ത്തിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="4415566066719264597">Chromium-ത്തെ പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കാൻ അനുവദിക്കുക</translation> <translation id="4423735387467980091">Chromium ഇഷ്ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക</translation> <translation id="4544142686420020088">Chromium അപ്ഡേറ്റ് ചെയ്തില്ല, എന്തോ കുഴപ്പമുണ്ടായി. <ph name="BEGIN_LINK" />Chromium അപ്ഡേറ്റ് സംബന്ധിച്ച പ്രശ്നങ്ങളും പരാജയപ്പെട്ട അപ്ഡേറ്റുകളും പരിഹരിക്കുക.<ph name="END_LINK" /></translation> <translation id="4567424176335768812">നിങ്ങൾ <ph name="USER_EMAIL_ADDRESS" /> ആയി സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു. സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകളും ചരിത്രവും മറ്റ് ക്രമീകരണങ്ങളും ആക്സസ് ചെയ്യാൻ ഇപ്പോൾ നിങ്ങൾക്കാകും.</translation> <translation id="459535195905078186">Chromium അപ്ലിക്കേഷനുകൾ</translation> +<translation id="4595492485953540730">{NUM_MINS,plural, =1{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഒരു മിനിറ്റ് മുമ്പ്.}other{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: {NUM_MINS} മിനിറ്റ് മുമ്പ്.}}</translation> <translation id="4677944499843243528">മറ്റൊരു കമ്പ്യൂട്ടറിൽ (<ph name="HOST_NAME" />) മറ്റൊരു Chromium പ്രോസസ് (<ph name="PROCESS_ID" />) പ്രൊഫൈൽ ഉപയോഗിക്കുന്നതുപോലെ തോന്നുന്നു. Chromium പ്രൊഫൈൽ ലോക്കുചെയ്തതിനാൽ ഇത് കേടാകുകയില്ല. മറ്റ് പ്രോസസുകളൊന്നും ഈ പ്രൊഫൈൽ ഉപയോഗിക്കുന്നില്ലെന്ന് ഉറപ്പാണെങ്കിൽ നിങ്ങൾക്ക് പ്രൊഫൈൽ അൺലോക്ക് ചെയ്ത് Chromium വീണ്ടും സമാരംഭിക്കാം.</translation> <translation id="469338717132742108">Chromium OS ഉപയോഗിക്കുന്നതിനുള്ള സഹായം തേടുക</translation> <translation id="4708774505295300557">ഈ കമ്പ്യൂട്ടറിലെ Chromium-ത്തിൽ മുമ്പ് മറ്റാരോ <ph name="ACCOUNT_EMAIL_LAST" /> എന്നയാളായി സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു. നിങ്ങളുടെ വിവരങ്ങൾ പ്രത്യേകം വേർതിരിച്ച് സൂക്ഷിക്കാൻ പുതിയ Chromium ഉപയോക്താവിനെ സൃഷ്ടിക്കുക.</translation> @@ -107,6 +113,7 @@ <translation id="4750035648288509542">എകദേശം അപ് റ്റു ഡേറ്റാണ്! അപ്ഡേറ്റ് ചെയ്യൽ പൂർത്തിയാക്കുന്നതിന് Chromium വീണ്ടും ആരംഭിക്കുക. അദൃശ്യ വിൻഡോകൾ വീണ്ടും തുറക്കില്ല.</translation> <translation id="4788777615168560705">Chromium-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ <ph name="BEGIN_LINK" />നിങ്ങളുടെ Google അക്കൗണ്ടിലെ പാസ്വേഡുകൾ പരിശോധിക്കുക<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Google തിരയലിൽ ഉപയോഗിക്കുന്ന അതേ സ്പെൽ ചെക്കർ ഇത് ഉപയോഗിക്കുന്നു. ബ്രൗസറിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്സ്റ്റ് Google-ന് അയയ്ക്കുന്നു. ക്രമീകരണത്തിൽ എപ്പോഴും ഈ രീതി മാറ്റാനാകും.</translation> +<translation id="487524289568229802">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താൻ Chromium നിങ്ങളുടെ കമ്പ്യൂട്ടർ പരിശോധിക്കുന്നു...</translation> <translation id="4888717733111232871">mDNS ട്രാഫിക്ക് അനുവദിക്കാൻ Chromium-നുള്ള ഇൻബൗണ്ട് നയം.</translation> <translation id="4893632094755846570">ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റ ശാശ്വതമായി ഇല്ലാതാക്കും. ഡാറ്റ വീണ്ടെടുക്കാൻ, ഇനിപ്പറയുന്ന ഇമെയിൽ ഐഡി ഉപയോഗിച്ച് Chromium-ൽ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="4943838377383847465">Chromium പശ്ചാത്തല മോഡിലാണ്.</translation> @@ -171,6 +178,7 @@ ചില സവിശേഷതകൾ ലഭ്യമായേക്കില്ല. മറ്റൊരു പ്രൊഫൈൽ ഡയറക്ടറി വ്യക്തമാക്കുകയോ Chromium-ന്റെ ഏറ്റവും പുതിയ പതിപ്പ് ഉപയോഗിക്കുകയോ ചെയ്യുക.</translation> <translation id="6734080038664603509">&Chromium അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="6734291798041940871">നിങ്ങളുടെ കമ്പ്യൂട്ടറിലെ എല്ലാ ഉപയോക്താക്കൾക്കുമായി നിലവിൽ Chromium ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ട്.</translation> +<translation id="6737557815519435616">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: അൽപ്പം മുമ്പ്.</translation> <translation id="6762551859069255163">ഔദ്യോഗിക ബ്രൗസിംഗും വ്യക്തിപര ബ്രൗസിംഗും തമ്മിൽ വേർതിരിക്കാനോ ഈ ഉപകരണം ഉപയോഗിക്കുന്ന വ്യത്യസ്ത ആളുകൾക്ക് വേണ്ടിയോ, Chromium-ൽ വ്യത്യസ്ത പ്രൊഫൈലുകൾ ഉപയോഗിക്കുക</translation> <translation id="6774082503108938489">നിങ്ങളുടെ രക്ഷിതാവ് Chromium-നുള്ള "സൈറ്റുകൾക്കും ആപ്പുകൾക്കും വിപുലീകരണങ്ങൾക്കുമുള്ള അനുമതികൾ" ഓഫാക്കി. ഈ <ph name="EXTENSION_TYPE_PARAMETER" /> പ്രവർത്തനക്ഷമമാക്കുന്നത് അനുവദനീയമല്ല.</translation> <translation id="6847869444787758381">നിങ്ങളുടെ പാസ്വേഡുകൾ എപ്പോഴെങ്കിലും അപഹരിക്കപ്പെട്ടിട്ടുണ്ടെങ്കിൽ അക്കാര്യം Chromium നിങ്ങളെ അറിയിക്കും</translation> @@ -180,6 +188,7 @@ <translation id="6964305034639999644">Chromium അദൃശ്യ വിൻഡോയിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="6990124437352146030">ഈ സൈറ്റിനായി, Chromium-ത്തിന് നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation> <translation id="701244094609242530">Chromium-ന് നിങ്ങളുടെ വിപുലീകരണങ്ങൾ പരിശോധിക്കാനാവുന്നില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="7028347026395185822">{NUM_HOURS,plural, =1{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഒരു മണിക്കൂർ മുമ്പ്.}other{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chromium കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: {NUM_HOURS} മണിക്കൂർ മുമ്പ്.}}</translation> <translation id="705851970750939768">Chromium അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="7066436765290594559">Chromium OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. സമന്വയ പാസ്ഫ്രെയ്സ് അപ്ഡേറ്റ് ചെയ്യുക.</translation> <translation id="7067091210845072982">ചിത്രത്തിൽ ഉപകാരപ്രദമായ വിവരണമില്ലെങ്കിൽ നിങ്ങൾക്കായി ഒരു വിവരണം നൽകാൻ Chromium ശ്രമിക്കും. വിവരണങ്ങൾ സൃഷ്ടിക്കാൻ, ചിത്രങ്ങൾ Google-ലേക്ക് അയയ്ക്കുന്നു.</translation> @@ -240,6 +249,7 @@ <translation id="8621669128220841554">അവ്യക്തമായ പിശകിനാൽ ഇൻസ്റ്റാൾ ചെയ്യൽ പരാജയപ്പെട്ടു. Chromium വീണ്ടും ഡൗൺലോഡ് ചെയ്യുക.</translation> <translation id="8697124171261953979">നിങ്ങൾ Chromium ആരംഭിക്കുമ്പോൾ അല്ലെങ്കിൽ ഓമ്നിബോക്സിൽ നിന്ന് തിരയുമ്പോൾ ദൃശ്യമാകുന്ന പേജും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation> <translation id="8704119203788522458">ഇത് നിങ്ങളുടെ Chromium ആണ്</translation> +<translation id="8733034664173984083">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താൻ Chromium നിങ്ങളുടെ കമ്പ്യൂട്ടർ പരിശോധിക്കുമ്പോൾ ഒരു പിശക് സംഭവിച്ചു</translation> <translation id="8796602469536043152">ഈ സൈറ്റിനായി, Chromium-ത്തിന് നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ആക്സസ് ചെയ്യാനുള്ള അനുമതി ആവശ്യമാണ്</translation> <translation id="8803635938069941624">Chromium OS നിബന്ധനകൾ</translation> <translation id="8821041990367117597">നിങ്ങളുടെ അക്കൗണ്ടിന്റെ സൈൻ ഇൻ വിശദാംശങ്ങൾ കാലഹരണപ്പെട്ടതിനാൽ Chromium-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 1f2d79e4..dc1a805 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -46,6 +46,7 @@ <translation id="2711502716910134313">Karta Chromium</translation> <translation id="2718390899429598676">V záujme vyššej miery zabezpečenia budú dáta v prehliadači Chromium šifrované.</translation> <translation id="2770231113462710648">Zmeniť predvolený prehliadač na:</translation> +<translation id="2774556997178638058"><ph name="BEGIN_LINK" />Váš správca<ph name="END_LINK" /> zakázal v prehliadači Chromium kontrolu prítomnosti škodlivého softvéru</translation> <translation id="2799223571221894425">Znova spustiť</translation> <translation id="2847479871509788944">Odstrániť z prehliadača Chromium...</translation> <translation id="2853765747879685679">Opýtať sa pri otvorení prehliadača Chromium</translation> @@ -53,6 +54,7 @@ <translation id="2910007522516064972">Informácie o prehliadači &Chromium</translation> <translation id="2977470724722393594">Prehliadač Chromium bol aktualizovaný</translation> <translation id="2983934633046890458">Chromium sa pokúša upraviť heslá.</translation> +<translation id="3031887101543416445">{NUM_DAYS,plural, =1{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla včera.}few{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_DAYS} dňami.}many{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_DAYS} dňa.}other{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_DAYS} dňami.}}</translation> <translation id="3032706164202344641">Chromium nemôže skontrolovať heslá. Skúste to znova neskôr.</translation> <translation id="3032787606318309379">Pridáva sa do prehliadača Chromium...</translation> <translation id="3068515742935458733">Pomôcť zlepšiť prehliadač Chromium odosielaním správ o zlyhaní a <ph name="UMA_LINK" /> spoločnosti Google</translation> @@ -72,6 +74,7 @@ <translation id="347328004046849135">Chromium vás upozorní, keď sa prihlásite pomocou prelomeného hesla</translation> <translation id="3474745554856756813">Táto akcia odstráni zo zariadenia niekoľko položiek (počet: <ph name="ITEMS_COUNT" />). Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Zatvorte všetky okná prehliadača Chromium a skúste to znova.</translation> +<translation id="3527440529060401414">Chromium môže skontrolovať, či máte v počítači škodlivý softvér</translation> <translation id="3575459661164320785">V počítači máte škodlivý softvér. Chromium ho môže odstrániť, obnoviť nastavenia a deaktivovať rozšírenia, aby prehliadač znova normálne fungoval.</translation> <translation id="3639635944603682591">Dáta prehliadania tejto osoby sa odstránia z tohto zariadenia. Ak ich chcete obnoviť, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> <translation id="364817392622123556">{COUNT,plural, =0{K dispozícii je aktualizácia pre Chromium, ktorá bude použitá po najbližšom novom spustení.}=1{K dispozícii je aktualizácia pre Chromium, ktorá bude použitá po najbližšom novom spustení. Vaše okno inkognito sa neotvorí.}few{K dispozícii je aktualizácia pre Chromium, ktorá bude použitá po najbližšom novom spustení. Vaše # okná inkognito sa neotvoria.}many{K dispozícii je aktualizácia pre Chromium, ktorá bude použitá po najbližšom novom spustení. Your # Incognito windows won't reopen.}other{K dispozícii je aktualizácia pre Chromium, ktorá bude použitá po najbližšom novom spustení. Vašich # okien inkognito sa neotvorí.}}</translation> @@ -87,18 +90,21 @@ <translation id="3945058413678539331">Chromium sa pokúša kopírovať heslá. Ak to chcete povoliť, zadajte heslo systému Windows.</translation> <translation id="4036079820698952681">Nahláste <ph name="BEGIN_LINK" />aktuálne nastavenia<ph name="END_LINK" /> a pomôžte tak zlepšiť prehliadač Chromium</translation> <translation id="4050175100176540509">V najnovšej verzii sú k dispozícii dôležité vylepšenia zabezpečenia a nové funkcie.</translation> +<translation id="4136604564421273381">Chromium odstraňuje škodlivý softvér z vášho počítača…</translation> <translation id="419998258129752635"><ph name="PAGE_TITLE" /> – prihlásenie do siete – Chromium</translation> <translation id="421369550622382712">Objavte skvelé aplikácie, hry, rozšírenia a motívy pre prehliadač Chromium.</translation> <translation id="4216212958613226427">V tomto jazyku sa zobrazuje používateľské rozhranie prehliadača Chromium.</translation> <translation id="4230135487732243613">Chcete prepojiť údaje prehliadača Chromium s týmto účtom?</translation> <translation id="4271805377592243930">Pomoc s prehliadačom Chromium</translation> <translation id="4285930937574705105">Inštalácia zlyhala kvôli neurčenej chybe. Ak je prehliadač Chromium momentálne spustený, zatvorte ho a skúste znova.</translation> +<translation id="4352041330999353637">Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla včera.</translation> <translation id="4407044323746248786">Chcete Chromium napriek tomu ukončiť?</translation> <translation id="4415566066719264597">Povoliť prehliadaču Chromium spustenie na pozadí</translation> <translation id="4423735387467980091">Prispôsobiť a spravovať Chromium</translation> <translation id="4544142686420020088">Chromium sa neaktualizoval. Vyskytol sa problém. <ph name="BEGIN_LINK" />Vyriešiť problémy so sťahovaním aktualizácií prehliadača Chromium a neúspešnými aktualizáciami<ph name="END_LINK" /></translation> <translation id="4567424176335768812">Ste prihlásený/-á ako <ph name="USER_EMAIL_ADDRESS" />. Teraz môžete na všetkých zariadeniach, kde ste prihlásený/-á, pristupovať k svojim záložkám, histórii a ďalším nastaveniam.</translation> <translation id="459535195905078186">Aplikácie Chromium</translation> +<translation id="4595492485953540730">{NUM_MINS,plural, =1{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred minútou.}few{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_MINS} minútami.}many{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_MINS} minúty.}other{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_MINS} minútami.}}</translation> <translation id="4677944499843243528">Zdá sa, že profil používa ďalší proces prehliadača Chromium (<ph name="PROCESS_ID" />) na inom počítači (<ph name="HOST_NAME" />). Prehliadač Chromium daný profil uzamkol, aby sa nepoškodil. Ak s istotou viete, že tento profil nepoužívajú žiadne iné procesy, môžete ho odomknúť a prehliadač Chromium znova spustiť.</translation> <translation id="469338717132742108">Pomoc so systémom Chromium OS</translation> <translation id="4708774505295300557">Do prehliadača Chromium sa už na tomto počítači niekto prihlásil pomocou účtu <ph name="ACCOUNT_EMAIL_LAST" />. Ak chcete ponechať svoje informácie oddelené, vytvorte v prehliadači Chromium nového používateľa.</translation> @@ -107,6 +113,7 @@ <translation id="4750035648288509542">Takmer aktualizované. Aktualizáciu dokončíte reštartovaním prehliadača Chromium. Okná inkognito sa neotvoria.</translation> <translation id="4788777615168560705">Chromium nemôže skontrolovať heslá. Skúste to znova o 24 hodín alebo <ph name="BEGIN_LINK" />skontrolujte heslá vo svojom účte Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Využíva rovnaký nástroj na kontrolu pravopisu, aký sa používa vo Vyhľadávaní Google. Text zadaný do prehliadača sa odošle Googlu. Toto správanie môžete zmeniť v nastaveniach.</translation> +<translation id="487524289568229802">Chromium kontroluje prítomnosť škodlivého softvéru v počítači…</translation> <translation id="4888717733111232871">Pravidlo pre prichádzajúce prenosy pre prehliadač Chromium, ktoré povoľuje prenos dát mDNS.</translation> <translation id="4893632094755846570">Táto akcia natrvalo odstráni dáta prehliadania z tohto zariadenia. Ak ich chcete obnoviť, prihláste sa do prehliadača Chromium ako</translation> <translation id="4943838377383847465">Chromium je v režime na pozadí.</translation> @@ -171,6 +178,7 @@ Niektoré funkcie nemusia byť k dispozícii. Zadajte iný adresár profilu alebo použite novšiu verziu prehliadača Chromium.</translation> <translation id="6734080038664603509">Aktualizovať prehliadač &Chromium</translation> <translation id="6734291798041940871">Chromium už majú nainštalovaný všetci používatelia na vašom počítači.</translation> +<translation id="6737557815519435616">Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred chvíľou.</translation> <translation id="6762551859069255163">Oddeľte v prehliadači Chromium pracovné a osobné prehliadanie pomocou rôznych profilov, prípadne ich použite pre rôznych ľudí, ktorí toto zariadenie používajú</translation> <translation id="6774082503108938489">Tvoj rodič vypol „Povolenia pre weby, aplikácie a rozšírenia“ v prehliadači Chromium. Povolenie tohto rozšírenia (<ph name="EXTENSION_TYPE_PARAMETER" />) je zakázané.</translation> <translation id="6847869444787758381">Ak budú vaše heslá napadnuté, Chromium vám to oznámi</translation> @@ -180,6 +188,7 @@ <translation id="6964305034639999644">Otvoriť odkaz v okne inko&gnito prehliadača Chromium</translation> <translation id="6990124437352146030">Chromium potrebuje povolenie pre tento web na prístup k mikrofónu</translation> <translation id="701244094609242530">Chromium nemôže skontrolovať rozšírenia. Skúste to znova neskôr.</translation> +<translation id="7028347026395185822">{NUM_HOURS,plural, =1{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred hodinou.}few{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodinami.}many{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodiny.}other{Chromium nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodinami.}}</translation> <translation id="705851970750939768">Aktualizovať Chromium</translation> <translation id="7066436765290594559">Systému OS Chromium sa nepodarilo synchronizovať vaše údaje. Aktualizujte prístupovú frázu synchronizácie.</translation> <translation id="7067091210845072982">Ak obrázok nemá užitočný popis, Chromium sa vám ho pokúsi poskytnúť. Obrázky sa odosielajú Googlu, aby bolo možné vytvoriť popisy.</translation> @@ -239,6 +248,7 @@ <translation id="8621669128220841554">Inštalácia zlyhala kvôli neznámej chybe. Skúste prehliadač Chromium stiahnuť znova.</translation> <translation id="8697124171261953979">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chromium alebo pri vyhľadávaní pomocou všeobecného poľa.</translation> <translation id="8704119203788522458">Toto je váš prehliadač Chromium</translation> +<translation id="8733034664173984083">Počas kontroly vášho počítača prehliadačom Chromium s cieľom vyhľadať prípadný škodlivý softvér sa vyskytla chyba</translation> <translation id="8796602469536043152">Chromium potrebuje povolenie pre tento web na prístup k fotoaparátu a mikrofónu</translation> <translation id="8803635938069941624">Zmluvné podmienky systému OS Chromium</translation> <translation id="8821041990367117597">Prehliadaču Chromium sa nepodarilo synchronizovať vaše údaje, pretože vaše prihlasovacie údaje účtu sú zastarané.</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index fc00db8..dfd751b 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -906,7 +906,7 @@ Ellers skal du logge ud nu, så ændringerne på denne konto afspejles på enheden. Du kan administrere indstillingerne for denne konto ved at installere Family Link-appen på din enhed. Vi har sendt en mail med vejledning.</translation> -<translation id="2040460856718599782">Ups! Der opstod en fejl under forsøget på at godkende dig. Kontrollér dine loginoplysninger, og prøv igen.</translation> +<translation id="2040460856718599782">Ups! Noget gik galt under forsøget på at godkende dig. Kontrollér dine loginoplysninger, og prøv igen.</translation> <translation id="2040859730880153754">{COUNT,plural, =1{Du har 1 kompromitteret adgangskode}one{Du har # kompromitteret adgangskode}other{Du har # kompromitterede adgangskoder}}</translation> <translation id="2040863272941698761">Konfigurer Linux</translation> <translation id="204497730941176055">Navn på skabelon til Microsoft-certifikat</translation> @@ -1692,7 +1692,7 @@ <translation id="2956070239128776395">Sektionen er indlejret i en gruppe: <ph name="ERROR_LINE" /></translation> <translation id="2957117904572187936">Tillad ikke, at websites redigerer filer eller mapper på din enhed</translation> <translation id="2958721676848865875">Advarsel om pakkeudvidelse</translation> -<translation id="2959127025785722291">Der opstod en fejl. Scanningen kunne ikke gennemføres Prøv igen.</translation> +<translation id="2959127025785722291">Noget gik galt. Scanningen kunne ikke gennemføres Prøv igen.</translation> <translation id="2959842337402130152">Gendannelsen mislykkedes på grund af manglende lagerplads. Frigør <ph name="SPACE_REQUIRED" /> på enheden, og prøv igen.</translation> <translation id="2960208947600937804">Der opstod en fejl under konfigurationen af Linux. Kontakt din administrator.</translation> <translation id="296026337010986570">Den skadelige software er nu fjernet. Du kan aktivere udvidelser igen ved at gå til <a href="chrome://extensions">Udvidelser</a>.</translation> @@ -3738,7 +3738,7 @@ <translation id="5442550868130618860">Aktivér automatisk opdatering</translation> <translation id="5445400788035474247">10x</translation> <translation id="5446983216438178612">Vis certifikater for organisationen</translation> -<translation id="5448293924669608770">Ups! Der opstod en fejl under login</translation> +<translation id="5448293924669608770">Ups! Noget gik galt under login</translation> <translation id="5449551289610225147">Ugyldig adgangskode</translation> <translation id="5449588825071916739">Tilføj alle faner som bogmærker</translation> <translation id="5449716055534515760">Luk vin&due</translation> @@ -4863,7 +4863,7 @@ <translation id="6792072150955115067"><ph name="APP_NAME" /> vil gerne dele indholdet på din skærm med <ph name="TARGET_NAME" />. Vælg det, du gerne vil dele.</translation> <translation id="6793604637258913070">Fremhæv tekstmarkøren, når den vises eller flyttes</translation> <translation id="6795884519221689054">Panda</translation> -<translation id="6797493596609571643">Ups! Der opstod en fejl.</translation> +<translation id="6797493596609571643">Ups! Noget gik galt.</translation> <translation id="6798578729981748444">Luk alle Firefox-vinduer for at fuldføre importen.</translation> <translation id="6798780071646309401">capslock er slået til</translation> <translation id="6798954102094737107">Plugin: <ph name="PLUGIN_NAME" /></translation> @@ -5283,7 +5283,7 @@ <translation id="7297726121602187087">Mørkegrøn</translation> <translation id="7299337219131431707">Aktivér gæstesession</translation> <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Denne app kan forhindre Chrome i at fungere korrekt.}one{Denne app kan forhindre Chrome i at fungere korrekt.}other{Disse apps kan forhindre Chrome i at fungere korrekt.}}</translation> -<translation id="7303281435234579599">Ups! Der opstod en fejl under konfigurationen af demotilstand.</translation> +<translation id="7303281435234579599">Ups! Noget gik galt under konfigurationen af demotilstand.</translation> <translation id="7303900363563182677">Dette website er blokeret fra at se tekst og billeder, der er kopieret til udklipsholderen</translation> <translation id="7304030187361489308">Højt</translation> <translation id="7305123176580523628">USB-printeren er tilsluttet</translation> @@ -5320,7 +5320,7 @@ <translation id="7347751611463936647">Hvis du vil bruge denne udvidelse, skal du indtaste "<ph name="EXTENSION_KEYWORD" />" og derefter TAB. Herefter skal du indtaste din kommando eller søgning.</translation> <translation id="7347943691222276892">Klik for at navigere væk fra <ph name="SUBPAGE_TITLE" />.</translation> <translation id="7348093485538360975">Skærmtastatur</translation> -<translation id="7352651011704765696">Der opstod en fejl</translation> +<translation id="7352651011704765696">Noget gik galt</translation> <translation id="735361434055555355">Installerer Linux...</translation> <translation id="7354341762311560488">Fingeraftrykslæseren er tasten nederst til venstre på dit tastatur. Tryk let på den med en finger.</translation> <translation id="7356908624372060336">Netværkslogs</translation> @@ -5420,7 +5420,7 @@ <translation id="746216226901520237">Næste gang låser din telefon din <ph name="DEVICE_TYPE" /> op. Du kan deaktivere Smart Lock i Indstillinger.</translation> <translation id="7463006580194749499">Tilføj person</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# åben fane. Tryk for at vise eller skjule fanelinje.}one{# åben fane. Tryk for at vise eller skjule fanelinje.}other{# åbne faner. Tryk for at vise eller skjule fanelinje.}}</translation> -<translation id="7465635034594602553">Der opstod en fejl. Vent et øjeblik, og prøv derefter at køre <ph name="APP_NAME" /> igen.</translation> +<translation id="7465635034594602553">Noget gik galt. Vent et øjeblik, og prøv derefter at køre <ph name="APP_NAME" /> igen.</translation> <translation id="7465778193084373987">Webadresse for tilbagekaldelse af Netscape-certifikat</translation> <translation id="7469894403370665791">Opret automatisk forbindelse til dette netværk</translation> <translation id="747114903913869239">Fejl: Udvidelsen kunne ikke afkodes</translation> @@ -5552,7 +5552,7 @@ <translation id="7631887513477658702">&Åbn altid filer af denne type</translation> <translation id="7632948528260659758">Følgende kioskapps kan ikke opdateres:</translation> <translation id="7633724038415831385">Dette er den eneste gang, du skal vente på en opdatering. På Chromebooks foregår softwareopdateringer i baggrunden.</translation> -<translation id="7634566076839829401">Der opstod en fejl. Prøv igen.</translation> +<translation id="7634566076839829401">Noget gik galt. Prøv igen.</translation> <translation id="763632859238619983">Tillad ikke, at websites installerer betalingshandlere</translation> <translation id="7636919061354591437">Installer på denne enhed</translation> <translation id="7638605456503525968">Serieporte</translation> @@ -6334,7 +6334,7 @@ <translation id="8528074251912154910">Tilføj sprog</translation> <translation id="8528962588711550376">Logger ind...</translation> <translation id="8529925957403338845">Øjeblikkelig netdeling mislykkedes</translation> -<translation id="8534656636775144800">Ups! Der opstod en fejl ved forsøget på at tilmelde dig domænet. Prøv igen.</translation> +<translation id="8534656636775144800">Ups! Noget gik galt ved forsøget på at tilmelde dig domænet. Prøv igen.</translation> <translation id="8535005006684281994">Webadresse for fornyelse af Netscape-certifikat</translation> <translation id="8536956381488731905">Lyd ved tastetryk</translation> <translation id="8538358978858059843">Vil du aktivere skytjenester til Cast?</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 2a890755..e57d1c9 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -184,7 +184,7 @@ <translation id="1204296502688602597">זמן אחזור של DNS</translation> <translation id="1206407435587370571">סיור ב-Chromebook</translation> <translation id="1209796539517632982">שרתי שמות אוטומטיים</translation> -<translation id="1211364473545090084">חלון גלישה בסתר מאפשר לגלוש בלי לשמור את היסטוריית הגלישה</translation> +<translation id="1211364473545090084">חלון אנונימי מאפשר לגלוש בלי לשמור את היסטוריית הגלישה</translation> <translation id="1211769675100312947">קיצורי הדרך מנוהלים על-ידך</translation> <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> טביעות אצבעות הוגדרו</translation> <translation id="1213254615020057352">שליחת מידע לגבי אופן השימוש בנתונים וניתוח הביצועים. כדי לתרום לשיפור חוויית המשתמש של הילד/ה ב-Android, אפשר לשלוח אל Google באופן אוטומטי נתוני אבחון, נתוני מכשיר ונתוני שימוש באפליקציות. הנתונים האלה לא ישמשו כדי לזהות את הילד/ה שלך, והם יעזרו לנו לשמור על היציבות של המערכת ושל האפליקציות ולבצע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לשפר את האפליקציות של Google וכן יעזרו לשותפים של Google, כמו מפתחים של Android. ההגדרה הזו נאכפת על-ידי הבעלים. ייתכן שהבעלים יבחרו לשלוח אל Google נתוני אבחון ונתוני שימוש של המכשיר. אם ההגדרה 'פעילות באתרי אינטרנט ובאפליקציות נוספים' הופעלה עבור הילד/ה שלך, ייתכן שהנתונים יישמרו בחשבון Google שלהם.</translation> @@ -387,7 +387,7 @@ <translation id="1433811987160647649">שאלה לפני גישה</translation> <translation id="1434696352799406980">פעולה זו תאפס את דף הפתיחה, את דף הכרטיסייה החדשה, את מנוע החיפוש ואת הכרטיסיות המוצמדות שלך. היא גם תשבית את כל התוספים ותמחק נתונים זמניים כגון קובצי Cookie. הסימניות, ההיסטוריה והסיסמאות השמורות לא יימחקו.</translation> <translation id="1434886155212424586">דף הבית הוא הדף 'כרטיסייה חדשה'</translation> -<translation id="1436390408194692385">תקף במשך <ph name="TICKET_TIME_LEFT" /></translation> +<translation id="1436390408194692385">תקף למשך <ph name="TICKET_TIME_LEFT" /></translation> <translation id="1436671784520050284">להמשך ההגדרה</translation> <translation id="1436784010935106834">הוסר</translation> <translation id="144283815522798837"><ph name="NUMBER_OF_ITEMS_SELECTED" /> פריטים נבחרו</translation> @@ -1659,7 +1659,7 @@ <translation id="2915102088417824677">הצגת יומן הפעילות</translation> <translation id="2915873080513663243">סריקה אוטומטית</translation> <translation id="2916073183900451334">לחיצה על המקש Tab תדגיש קישורים בדף וכן שדות של טפסים</translation> -<translation id="2916745397441987255">חפש תוספים</translation> +<translation id="2916745397441987255">חיפוש תוספים</translation> <translation id="2921081876747860777">יצירת סיסמה להגנה על הנתונים המקומיים שלך.</translation> <translation id="2923234477033317484">הסרת החשבון הזה</translation> <translation id="2926085873880284723">שחזור קיצורי דרך בברירת מחדל</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 0d87833..851706fc 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -278,6 +278,7 @@ <translation id="1313705515580255288">നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, മറ്റ് ക്രമീകരണങ്ങൾ എന്നിവ Google അക്കൗണ്ടുമായി സമന്വയിപ്പിക്കും.</translation> <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">ഹോം നെറ്റ്വര്ക്ക്, റോമിംഗ് അല്ല</translation> +<translation id="1315056510003830387">Flash ഉപയോഗിക്കാൻ അനുവാദമില്ല</translation> <translation id="1315144594965013365">രണ്ട് ഉപകരണങ്ങളും അൺലോക്ക് ചെയ്തിട്ടുണ്ടെന്നും അടുത്തടുത്താണ് ഉള്ളതെന്നും Bluetooth ഓണാക്കിയിട്ടുണ്ടെന്നും ഉറപ്പാക്കുക. Chromebook-മായാണ് പങ്കിടുന്നതെങ്കിൽ അതിലെ സമീപമുള്ള പങ്കിടൽ ഓണാക്കിയിട്ടുണ്ടെന്ന് ഉറപ്പാക്കുക (സമയം തിരഞ്ഞെടുത്ത് സ്റ്റാറ്റസ് ഏരിയ തുറക്കുക, ശേഷം സമീപമുള്ള പങ്കിടൽ തിരഞ്ഞെടുക്കുക).</translation> <translation id="1316136264406804862">തിരയുന്നു...</translation> <translation id="1316495628809031177">സമന്വയം താൽക്കാലികമായി നിർത്തി</translation> @@ -337,6 +338,7 @@ <translation id="1386791642444521222">ഫിസിക്കൽ സിം സജീവമാക്കുക</translation> <translation id="1387519831959169718">നിങ്ങളുടെ ബ്രൗസിംഗ് വേർതിരിച്ച് നിലനിർത്താൻ, <ph name="NEW_USER" /> എന്നയാൾക്ക് പുതിയൊരു പ്രൊഫൈൽ സൃഷ്ടിക്കാനാകും</translation> <translation id="138784436342154190">ഡിഫോൾട്ട് ആരംഭ പേജ് പുനഃസ്ഥാപിക്കണോ?</translation> +<translation id="1388253969141979417">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="1388728792929436380">അപ്ഡേറ്റുകൾ പൂർത്തിയാകുമ്പോൾ <ph name="DEVICE_TYPE" /> റീസ്റ്റാർട്ട് ചെയ്യും.</translation> <translation id="1389342855416376185">പരിരക്ഷിത ഉള്ളടക്കം ബ്ലോക്ക് ചെയ്യുക</translation> <translation id="1390548061267426325">സാധാരണ ടാബായി തുറക്കുക</translation> @@ -387,6 +389,7 @@ <translation id="1433811987160647649">ആക്സസ് ചെയ്യുന്നതിന് മുമ്പ് ചോദിക്കുക</translation> <translation id="1434696352799406980">ഇത് നിങ്ങളുടെ ആരംഭ പേജ്, പുതിയ ടാബ് പേജ്, തിരയൽ എഞ്ചിൻ, പിൻ ചെയ്ത ടാബുകൾ എന്നിവ റീസെറ്റ് ചെയ്യും. ഒപ്പം ഇത് എല്ലാ വിപുലീകരണങ്ങളെയും പ്രവർത്തനരഹിതമാക്കുകയും കുക്കികൾ പോലുള്ള താൽക്കാലിക ഡാറ്റ മായ്ക്കുകയും ചെയ്യും. നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, സംരക്ഷിച്ച പാസ്വേഡുകൾ എന്നിവ മായ്ക്കില്ല.</translation> <translation id="1434886155212424586">ഹോംപേജ് പുതിയ ടാബ് പേജാണ്</translation> +<translation id="1435515966666225466">നിങ്ങളുടെ കമ്പ്യൂട്ടർ ആക്സസ് ചെയ്യാൻ പ്ലഗിൻ ഉപയോഗിക്കുന്നത് അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="1436390408194692385"><ph name="TICKET_TIME_LEFT" /> നേരത്തേക്ക് കൂടി സാധുവാണ്</translation> <translation id="1436671784520050284">സജ്ജീകരിക്കുന്നത് തുടരുക</translation> <translation id="1436784010935106834">നീക്കംചെയ്തു</translation> @@ -469,6 +472,7 @@ <translation id="1530838837447122178">മൗസ്, ടച്ച്പാഡ് ഉപകരണ ക്രമീകരണം തുറക്കുക</translation> <translation id="1531004739673299060">ആപ്പ് വിൻഡോ</translation> <translation id="1531275250079031713">'പുതിയ വൈഫൈ ചേർക്കുക' ഡയലോഗ് കാണിക്കുക</translation> +<translation id="1535228823998016251">വളരെ ഉച്ചത്തിൽ</translation> <translation id="1536754031901697553">വിച്ഛേദിക്കുന്നു...</translation> <translation id="1537254971476575106">പൂർണ്ണസ്ക്രീൻ മാഗ്നിഫയർ</translation> <translation id="15373452373711364">വലിയ മൗസ് കഴ്സർ</translation> @@ -552,6 +556,7 @@ <translation id="1627408615528139100">നേരത്തേതന്നെ ഡൗൺലോഡുചെയ്തിട്ടുണ്ട്</translation> <translation id="1628948239858170093">തുറക്കുന്നതിന് മുമ്പ് ഫയൽ സ്കാൻ ചെയ്യണോ?</translation> <translation id="1629314197035607094">പാസ്വേഡ് കാലഹരണപ്പെട്ടു</translation> +<translation id="163072119192489970">ഡാറ്റ അയയ്ക്കുന്നതും സ്വീകരിക്കുന്നതും പൂർത്തിയാക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="1630768113285622200">റീസ്റ്റാർട്ട് ചെയ്ത ശേഷം തുടരുക</translation> <translation id="1632082166874334883">പാസ്വേഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംഭരിച്ചിരിക്കുന്നു</translation> <translation id="1632803087685957583">കീബോർഡ് ആവർത്തന നിരക്കും പദത്തിന്റെ പ്രവചനവും മറ്റും ക്രമീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു</translation> @@ -749,6 +754,7 @@ <translation id="1841705068325380214"><ph name="EXTENSION_NAME" /> പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="184273675144259287">നിങ്ങളുടെ Linux ആപ്പുകളും ഫയലുകളും മുമ്പത്തെ ബാക്കപ്പുമായി മാറ്റിസ്ഥാപിക്കുക</translation> <translation id="1842766183094193446">ഡൊമോ മോഡ് പ്രവർത്തനക്ഷമമാക്കണമെന്ന് ഉറപ്പാണോ?</translation> +<translation id="1845727111305721124">ശബ്ദം പ്ലേ ചെയ്യാൻ അനുവദിക്കുന്നു</translation> <translation id="1846308012215045257"><ph name="PLUGIN_NAME" /> റൺ ചെയ്യാൻ കൺട്രോൾ-ക്ലിക്ക്</translation> <translation id="1849186935225320012">ഈ പേജിന് MIDI ഉപകരണങ്ങളുടെ പൂർണ്ണ നിയന്ത്രണമുണ്ട്.</translation> <translation id="1850508293116537636">&ഘടികാരദിശയില് തിരിക്കുക</translation> @@ -773,6 +779,7 @@ <translation id="187145082678092583">കുറച്ച് ആപ്പുകൾ</translation> <translation id="1871534214638631766">ഉള്ളടക്കത്തിൽ വലത്-ക്ലിക്ക് ചെയ്യുമ്പോഴോ ദീർഘനേരം അമർത്തുമ്പോഴോ അതിന്റെ അനുബന്ധ വിവരങ്ങൾ കാണിക്കുക</translation> <translation id="1871615898038944731">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> അപ്ടുഡേറ്റാണ്</translation> +<translation id="1874248162548993294">എല്ലാ പരസ്യങ്ങളും കാണിക്കുന്നത് അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{ടാബ് മറ്റൊരു വിൻഡോയിലേക്ക് നീക്കുക}other{ടാബുകൾ മറ്റൊരു വിൻഡോയിലേക്ക് നീക്കുക}}</translation> <translation id="1875386316419689002">ഈ ടാബ് HID ഉപകരണവുമായി കണക്റ്റ് ചെയ്തിരിക്കുന്നു.</translation> <translation id="1875387611427697908"><ph name="CHROME_WEB_STORE" />-ല് നിന്ന് മാത്രമേ ഇത് ചേർക്കാനാവൂ</translation> @@ -828,6 +835,7 @@ <translation id="1931152874660185993">ഘടകങ്ങളൊന്നും ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല.</translation> <translation id="1932098463447129402">മുമ്പല്ല</translation> <translation id="1933809209549026293">ഒരു മൗസോ കീബോർഡോ കണക്റ്റ് ചെയ്യുക. നിങ്ങൾ ഒരു Bluetooth ഉപകരണം ഉപയോഗിക്കുന്നുവെങ്കിൽ, അത് ജോടിയാക്കാൻ തയ്യാറാണെന്ന് ഉറപ്പുവരുത്തുക.</translation> +<translation id="1935303383381416800">നിങ്ങളുടെ ലൊക്കേഷൻ കാണാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="1936931585862840749">എത്ര പകർപ്പുകൾ പ്രിന്റ് ചെയ്യണമെന്ന് സൂചിപ്പിക്കാൻ ഒരു നമ്പര് ഉപയോഗിക്കുക (1 മുതൽ <ph name="MAX_COPIES" /> വരെ).</translation> <translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> ആയ ഈ ഉപകരണം ഉപയോഗിച്ച് കണ്ടെയ്നർ ആർക്കിടെക്ചർ തരമായ <ph name="ARCHITECTURE_CONTAINER" /> ഇമ്പോർട്ട് ചെയ്യാനാവില്ല. നിങ്ങൾക്ക് ഈ കണ്ടെയ്നർ മറ്റൊരു ഉപകരണത്തിലേക്ക് പുനഃസ്ഥാപിക്കാൻ ശ്രമിക്കാം അല്ലെങ്കിൽ 'ഫയലുകൾ ആപ്പിൽ' തുറന്ന് ഈ കണ്ടെയ്നർ ചിത്രത്തിനുള്ളിലെ ഫയലുകൾ ആക്സസ് ചെയ്യാം.</translation> <translation id="1938351510777341717">എക്സ്റ്റേണൽ കമാൻഡ്</translation> @@ -945,6 +953,7 @@ <translation id="2090165459409185032">അക്കൗണ്ട് വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, ഇതിലേക്ക് പോകുക: google.com/accounts/recovery</translation> <translation id="2090876986345970080">സിസ്റ്റം സുരക്ഷ ക്രമീകരണങ്ങള്</translation> <translation id="2091887806945687916">ശബ്ദം</translation> +<translation id="209539936453343974">രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ സജ്ജീകരിക്കാൻ, രക്ഷിതാവ് മാനേജ് ചെയ്യുന്ന ഒരു Google അക്കൗണ്ട് കുട്ടിക്ക് ഉണ്ടായിരിക്കണം. Family Link ആപ്പ് ഉപയോഗിച്ച്, സ്ക്രീൻ സമയ പരിധി സജ്ജീകരിക്കുക, വെബ്സൈറ്റുകൾ അംഗീകരിക്കുകയോ തടയുകയോ ചെയ്യുക എന്നിവയും മറ്റും ചെയ്യാൻ <ph name="DEVICE_TYPE_PLURAL" /> രക്ഷിതാക്കളെ അനുവദിക്കുന്നു. Google Classroom പോലുള്ള സൈറ്റുകളിൽ കുട്ടിക്ക് സ്കൂൾ വർക്ക് ചെയ്യണമെങ്കിൽ, ഒരു സ്കൂൾ അക്കൗണ്ട് പിന്നീട് ചേർക്കാവുന്നതാണ്.</translation> <translation id="2096715839409389970">മൂന്നാം കക്ഷി കുക്കികൾ മായ്ക്കുക</translation> <translation id="2097372108957554726">പുതിയ ഉപകരണങ്ങൾ രജിസ്റ്റർ ചെയ്യാൻ നിങ്ങൾ Chrome-ൽ സൈൻ ഇൻ ചെയ്യണം</translation> <translation id="2098805196501063469">ശേഷിക്കുന്ന പാസ്വേഡുകൾ പരിശോധിക്കുക</translation> @@ -1095,6 +1104,7 @@ <translation id="2261323523305321874">ചില പഴയ പ്രൊഫൈലുകളെ പ്രവർത്തനരഹിതമാക്കുന്ന തരത്തിൽ അഡ്മിനിസ്ട്രേറ്റർ നിങ്ങളുടെ സിസ്റ്റത്തിലാകമാനം മാറ്റം വരുത്തിയിരിക്കുന്നു.</translation> <translation id="2262332168014443534">HTTPS അടക്കമുള്ള എല്ലാ പേജുകളിലും വേഗത്തിൽ ബ്രൗസ് ചെയ്യാൻ ലൈറ്റ് മോഡ് സഹായിക്കുന്നു.</translation> <translation id="2262477216570151239">ആവർത്തിക്കുന്നതിന് മുമ്പുള്ള സമയം</translation> +<translation id="2262888617381992508">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യാൻ അനുവാദമില്ല</translation> <translation id="2263189956353037928">സൈൻ ഔട്ട് ചെയ്ത് വീണ്ടും സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="2263371730707937087">സ്ക്രീൻ പുതുക്കൽ നിരക്ക്</translation> <translation id="22665427234727190">Bluetooth ഉപകരണങ്ങൾ ആക്സസ് ചെയ്യാൻ ഒരു സൈറ്റ് താൽപ്പര്യപ്പെടുമ്പോൾ ചോദിക്കുക (ശുപാർശ ചെയ്യുന്നു)</translation> @@ -1363,6 +1373,7 @@ <translation id="2571655996835834626">കുക്കികൾ, JavaScript, പ്ലഗിന്നുകൾ, ജിയോലൊക്കേഷൻ, മൈക്രോഫോൺ, ക്യാമറ മുതലായ ഫീച്ചറുകളിലേക്കുള്ള വെബ്സൈറ്റിൻ്റെ ആക്സസ് നിയന്ത്രിക്കുന്ന നിങ്ങളുടെ ക്രമീകരണം മാറ്റുക.</translation> <translation id="2572032849266859634"><ph name="VOLUME_NAME" /> എന്നതിലേക്ക് റീഡ് ഒൺലി ആക്സസ്സ് അനുവദിച്ചു.</translation> <translation id="2575247648642144396">വിപുലീകരണത്തിന് നിലവിലെ പേജിൽ പ്രവർത്തിക്കാൻ കഴിയുമ്പോൾ ഈ ഐക്കൺ ദൃശ്യമാകും. ഐക്കണിൽ ക്ലിക്ക് ചെയ്തുകൊണ്ടോ <ph name="EXTENSION_SHORTCUT" /> അമർത്തിക്കൊണ്ടോ ഈ വിപുലീകരണം ഉപയോഗിക്കുക</translation> +<translation id="2575441894380764255">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ അനുവദനീയമല്ല</translation> <translation id="257779572837908839">മീറ്റിംഗിനുള്ള Chromebox സജ്ജമാക്കുക</translation> <translation id="2579232805407578790">സെർവറുമായി കണക്റ്റ് ചെയ്യാനായില്ല. നിങ്ങളുടെ നെറ്റ്വർക്ക് കണക്ഷൻ പരിശോധിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക. പ്രശ്നം തുടരുന്നുവെങ്കിൽ Chromebook റീസ്റ്റാർട്ട് ചെയ്യുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation> <translation id="2580889980133367162">എല്ലായ്പ്പോഴും ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ <ph name="HOST" />-നെ അനുവദിക്കുക</translation> @@ -1629,6 +1640,7 @@ <translation id="2880660355386638022">വിൻഡോ പ്ലെയ്സ്മെന്റ്</translation> <translation id="2881076733170862447">നിങ്ങൾ വിപുലീകരണം ക്ലിക്ക് ചെയ്യുമ്പോൾ</translation> <translation id="2882943222317434580"><ph name="IDS_SHORT_PRODUCT_NAME" />, തൽക്ഷണം റീസ്റ്റാർട്ട് ചെയ്ത് റീസെറ്റ് ചെയ്യും</translation> +<translation id="288387288628762616">Flash ഉപയോഗിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="2885378588091291677">ടാസ്ക് മാനേജര്</translation> <translation id="2885729872133513017">സെർവറിന്റെ പ്രതികരണം ഡീകോഡ് ചെയ്യുമ്പോൾ ഒരു പ്രശ്നമുണ്ടായി.</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> @@ -1663,6 +1675,7 @@ <translation id="2923234477033317484">ഈ അക്കൗണ്ട് നീക്കം ചെയ്യുക</translation> <translation id="2926085873880284723">ഡിഫോൾട്ട് കുറുക്കുവഴികൾ പുനഃസ്ഥാപിക്കുക</translation> <translation id="2927017729816812676">കാഷെ സ്റ്റോറേജ്</translation> +<translation id="2928795416630981206">നിങ്ങളുടെ ക്യാമറയുടെ സ്ഥാനം ട്രാക്ക് ചെയ്യാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="2931157624143513983">പ്രിന്റ് ചെയ്യാനുള്ള സ്ഥലത്തിന് അനുയോജ്യമാക്കുക</translation> <translation id="2932085390869194046">പാസ്വേഡ് നിർദ്ദേശിക്കുക...</translation> <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (കുട്ടികൾക്കായുള്ള അക്കൗണ്ട്)</translation> @@ -1670,6 +1683,7 @@ <translation id="2932883381142163287">ദുരുപയോഗം റിപ്പോര്ട്ട് ചെയ്യുക</translation> <translation id="2933632078076743449">അവസാനം അപ്ഡേറ്റ് ചെയ്തത്</translation> <translation id="2934999512438267372">MIDI ഉപകരണങ്ങളുടെ പൂർണ്ണ നിയന്ത്രണം അനുവദിച്ചിരിക്കുന്നു</translation> +<translation id="2935654492420446828">സ്കൂൾ അക്കൗണ്ട് പിന്നീട് ചേർക്കുക</translation> <translation id="2936851848721175671">ബാക്കപ്പെടുക്കലും പുനഃസ്ഥാപിക്കലും</translation> <translation id="2938225289965773019"><ph name="PROTOCOL" /> ലിങ്കുകൾ തുറക്കുക</translation> <translation id="2938845886082362843">നിങ്ങളുടെ സുരക്ഷാ കീയിൽ സംഭരിച്ചിരിക്കുന്ന സൈൻ ഇൻ ഡാറ്റ കാണുക, ഇല്ലാതാക്കുക</translation> @@ -1773,6 +1787,7 @@ <translation id="3060379269883947824">'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക' പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3060952009917586498">ഉപകരണത്തിന്റെ ഭാഷ മാറ്റുക. നിലവിലെ ഭാഷ <ph name="LANGUAGE" /> ആണ്.</translation> <translation id="3065041951436100775">ടാബ് ഇല്ലാതാക്കിയതിനെക്കുറിച്ചുള്ള ഫീഡ്ബാക്ക്.</translation> +<translation id="306535478112428611">നിങ്ങളുടെ ഉപകരണത്തിൽ ഫയലുകളും ഫോൾഡറുകളും എഡിറ്റ് ചെയ്യാൻ അനുവദിക്കുന്നില്ല</translation> <translation id="3065522099314259755">ആവർത്തിക്കുന്നതിനുള്ള കീബോർഡ് പ്രതികരണ സമയം</translation> <translation id="3067198179881736288">ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്യണോ?</translation> <translation id="3067198360141518313">ഈ പ്ലഗിന് പ്രവര്ത്തിപ്പിക്കുക</translation> @@ -1908,6 +1923,7 @@ <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - നെറ്റ്വർക്ക് പിശക്</translation> <translation id="3248902735035392926">സുരക്ഷ പ്രധാനമാണ്. അൽപ്പസമയം ചെലവഴിച്ച് <ph name="BEGIN_LINK" />നിങ്ങളുടെ വിപുലീകരണങ്ങൾ ഇപ്പോൾ തന്നെ പരിശോധിക്കുക<ph name="END_LINK" /></translation> <translation id="3251759466064201842"><സര്ട്ടിഫിക്കറ്റിന്റെ ഭാഗമല്ല></translation> +<translation id="325238099842880997">നിങ്ങളുടെ കുട്ടികളെ കളിക്കാനും അടുത്തറിയാനും സ്കൂൾ വർക്ക് വീട്ടിൽ ചെയ്യാനും സഹായിക്കുന്നതിന് ഡിജിറ്റൽ അടിസ്ഥാന നിയമങ്ങൾ സജ്ജീകരിക്കുക</translation> <translation id="3253225298092156258">ലഭ്യമല്ല</translation> <translation id="3253448572569133955">അജ്ഞാത അക്കൗണ്ട്</translation> <translation id="3254084468305910013">{COUNT,plural, =0{സുരക്ഷാ പ്രശ്നങ്ങളൊന്നും കണ്ടെത്തിയില്ല}=1{{COUNT} സുരക്ഷാ പ്രശ്നം കണ്ടെത്തി}other{{COUNT} സുരക്ഷാ പ്രശ്നങ്ങൾ കണ്ടെത്തി}}</translation> @@ -2035,6 +2051,7 @@ <translation id="3404249063913988450">സ്ക്രീൻ സേവർ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3405664148539009465">ഫോണ്ടുകള് ഇച്ഛാനുസൃതമാക്കുക</translation> <translation id="3405763860805964263">...</translation> +<translation id="3406290648907941085">വെർച്വൽ റിയാലിറ്റി ഉപകരണങ്ങളും ഡാറ്റയും ഉപയോഗിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="3406396172897554194">ഭാഷയോ ഇന്പുട്ട് പേരോ പ്രകാരം തിരയുക</translation> <translation id="3406605057700382950">ബുക്ക്മാർക്കുകൾ ബാർ &കാണിക്കുക</translation> <translation id="340671561090997290">{NUM_EXTENSIONS,plural, =1{ഈ വിപുലീകരണം അപകടകരമാവാം}other{ഈ വിപുലീകരണങ്ങൾ അപകടകരമാവാം}}</translation> @@ -2199,6 +2216,7 @@ <translation id="3586806079541226322">ഈ ഫയൽ തുറക്കാനാവില്ല</translation> <translation id="3586931643579894722">വിശദാംശങ്ങൾ മറയ്ക്കുക</translation> <translation id="3587482841069643663">എല്ലാം</translation> +<translation id="3588790464166520201">പേയ്മെന്റ് കൈകാര്യം ചെയ്യുന്ന സംവിധാനങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="3589766037099229847">സുരക്ഷിതമല്ലാത്ത ഉള്ളടക്കം ബ്ലോക്ക് ചെയ്തു</translation> <translation id="3590194807845837023">പ്രൊഫൈൽ അൺലോക്ക് ചെയ്ത് വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="3590295622232282437">മാനേജ് ചെയ്യപ്പെടുന്ന സെഷനില് പ്രവേശിക്കുന്നു.</translation> @@ -2424,6 +2442,7 @@ <translation id="3822559385185038546">ഈ പ്രോക്സി നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ നടപ്പിലാക്കിയതാണ്</translation> <translation id="3823310065043511710">കുറഞ്ഞത് <ph name="INSTALL_SIZE" /> ഇടമാണ് Linux-ന് വേണ്ടി ശുപാർശ ചെയ്യുന്നത്.</translation> <translation id="3824621460022590830">ഉപകരണ എൻറോൾമെന്റ് ടോക്കൺ സാധുവല്ല. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ഉടമയെയോ അഡ്മിനെയോ ബന്ധപ്പെടുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation> +<translation id="3826071569074535339">മോഷൻ സെൻസറുകൾ ഉപയോഗിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="3826440694796503677">കൂടുതൽ Google അക്കൗണ്ടുകൾ ചേർക്കുന്നത് നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="3827306204503227641">അൺസാൻഡ്ബോക്സ് ചെയ്ത പ്ലഗ്-ഇന്നുകൾ അനുവദിക്കുന്നത് തുടരുക</translation> <translation id="3827774300009121996">&പൂര്ണ്ണ സ്ക്രീന്</translation> @@ -2476,6 +2495,8 @@ <translation id="3873423927483480833">പിന്നുകൾ കാണിക്കുക</translation> <translation id="3873915545594852654">ARC++ എന്നതിൽ ഒരു പ്രശ്നമുണ്ടായി.</translation> <translation id="3874164307099183178">Google Assistant ഓണാക്കുക</translation> +<translation id="3877075909000773256"><ph name="USER_NAME" /> എന്നയാളുടെ ഉപകരണത്തിന്റെ 'സമീപമുള്ള പങ്കിടൽ' ക്രമീകരണം, <ph name="USER_EMAIL" /> എന്ന അക്കൗണ്ടിന് കീഴിൽ പങ്കിടുന്നു.</translation> +<translation id="387771067039689031">നിങ്ങളുടെ കമ്പ്യൂട്ടർ ആക്സസ് ചെയ്യാൻ പ്ലഗിൻ ഉപയോഗിക്കുന്നത് അനുവദനീയമല്ല</translation> <translation id="3879748587602334249">ഡൗൺലോഡ് മാനേജർ</translation> <translation id="3881478300875776315">കുറച്ച് വരികൾ മാത്രം കാണിക്കുക</translation> <translation id="3882165008614329320">ക്യാമറയിൽ നിന്നോ ഫയലിൽ നിന്നോ ഉള്ള നിലവിലെ വീഡിയോ</translation> @@ -2512,6 +2533,7 @@ <translation id="3919145445993746351">എല്ലാ കമ്പ്യൂട്ടറുകളിലും നിങ്ങളുടെ വിപുലീകരണങ്ങൾ ലഭിക്കാൻ, സമന്വയം ഓണാക്കുക</translation> <translation id="3920504717067627103">സര്ട്ടിഫിക്കറ്റ് നയങ്ങള്</translation> <translation id="392089482157167418">ChromeVox (സ്പോക്കൺ ഫീഡ്ബാക്ക്) പ്രവർത്തനക്ഷമമാക്കുക</translation> +<translation id="3920909973552939961">പേയ്മെന്റ് കൈകാര്യം ചെയ്യുന്ന സംവിധാനങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ അനുവാദമില്ല</translation> <translation id="3923184630988645767">ഡാറ്റ ഉപയോഗം</translation> <translation id="3923676227229836009">ഫയലുകൾ കാണാൻ ഈ പേജിനെ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="3924145049010392604">Meta</translation> @@ -2635,6 +2657,7 @@ <translation id="4058793769387728514">ഡോക്യുമെന്റ് ഇപ്പോള് പരിശോധിക്കുക</translation> <translation id="406070391919917862">പശ്ചാത്തല അപ്ലിക്കേഷനുകള്</translation> <translation id="4061374428807229313">പങ്കിടാൻ, Files ആപ്പിലെ ഒരു ഫോൾഡറിൽ വലത് ക്ലിക്ക് ചെയ്ത ശേഷം "Parallels Desktop ഉപയോഗിച്ച് പങ്കിടുക" തിരഞ്ഞെടുക്കുക.</translation> +<translation id="406213378265872299">ഇഷ്ടാനുസൃതമാക്കിയ പ്രവർത്തനരീതികൾ</translation> <translation id="4065876735068446555">നിങ്ങൾ ഉപയോഗിക്കുന്ന നെറ്റ്വർക്ക് (<ph name="NETWORK_ID" />) അതിന്റെ ലോഗിൻ പേജ് സന്ദർശിക്കാൻ നിങ്ങളോട് ആവശ്യപ്പെടാം.</translation> <translation id="4066207411788646768">നിങ്ങളുടെ നെറ്റ്വർക്കിൽ ലഭ്യമായ പ്രിന്ററുകൾ കാണാൻ നിങ്ങളുടെ കണക്ഷൻ പരിശോധിക്കുക</translation> <translation id="4068776064906523561">സംരക്ഷിച്ച വിരലടയാളങ്ങൾ</translation> @@ -2782,6 +2805,7 @@ <translation id="425573743389990240">ബാറ്ററി ഡിസ്ചാർജ്ജ് നിരക്ക് വാട്സിൽ (നെഗറ്റീവ് മൂല്യം അർത്ഥമാക്കുന്നത് ബാറ്ററി ചാർജ്ജുചെയ്യുന്നു എന്നാണ്)</translation> <translation id="4256316378292851214">വീഡിയോ ഇതായി സംരക്ഷി&ക്കുക...</translation> <translation id="4258348331913189841">ഫയല് സിസ്റ്റങ്ങൾ</translation> +<translation id="4259388776256904261">ഇതിന് കുറച്ച് സമയമെടുത്തേക്കാം</translation> <translation id="4260182282978351200"><ph name="FILE_NAME" /> അപകടകരമായേക്കാം. സ്കാൻ ചെയ്യാൻ Google-ന്റെ വിപുലമായ പരിരക്ഷയിലേക്ക് അയയ്ക്കണോ? ഡൗൺലോഡ് വിവരങ്ങളുടെ ബാർ ഏരിയയിലേക്ക് പോകാൻ Shift+F6 അമർത്തുക.</translation> <translation id="4263223596040212967">നിങ്ങളുടെ കീബോർഡ് ലേഔട്ട് പരിശോധിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="4263757076580287579">പ്രിന്റർ രജിസ്ട്രേഷൻ റദ്ദാക്കി.</translation> @@ -2888,6 +2912,7 @@ <translation id="4400632832271803360">മുകൾ-വരിയിലെ കീകളുടെ പ്രവർത്തനരീതി മാറ്റാൻ 'ലോഞ്ചർ' കീ അമർത്തിപ്പിടിക്കുക</translation> <translation id="4400963414856942668">ഒരു ടാബ് ബുക്ക്മാർക്ക് ചെയ്യാൻ നക്ഷത്ര ചിഹ്നത്തിൽ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="4403775189117163360">മറ്റൊരു ഫോൾഡർ തിരഞ്ഞെടുക്കുക</translation> +<translation id="440391631796167175">ദുർബലമായ പാസ്വേഡുകളൊന്നും കണ്ടെത്തിയില്ല</translation> <translation id="4404136731284211429">വീണ്ടും സ്കാൻ ചെയ്യുക</translation> <translation id="4404843640767531781">നിങ്ങളുടെ രക്ഷിതാവ് <ph name="APP_NAME" /> ബ്ലോക്ക് ചെയ്തു. ഈ ആപ്പ് ഉപയോഗിക്കാൻ രക്ഷിതാവിനോട് അനുവാദം ചോദിക്കുക.</translation> <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation> @@ -2932,6 +2957,7 @@ <translation id="4450974146388585462">പ്രശ്നം നിർണ്ണയിക്കുക</translation> <translation id="4451479197788154834">ഈ ഉപകരണത്തിലും നിങ്ങളുടെ Google അക്കൗണ്ടിലും പാസ്വേഡ് സംരക്ഷിക്കുന്നു</translation> <translation id="4451757071857432900">അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങൾ കാണിക്കുന്ന സൈറ്റുകളിൽ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു (ശുപാർശ ചെയ്യുന്നു)</translation> +<translation id="4453205916657964690">സബ്നെറ്റ് മാസ്ക്</translation> <translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" /> തിരയുക അല്ലെങ്കിൽ ഒരു URL ടൈപ്പ് ചെയ്യുക</translation> <translation id="4459169140545916303"><ph name="DEVICE_LAST_ACTIVATED_TIME" /> ദിവസം മുമ്പ് സജീവമായിരുന്നു</translation> <translation id="4460014764210899310">ഗ്രൂപ്പ് അല്ലാതാക്കി മാറ്റുക</translation> @@ -2959,6 +2985,7 @@ <translation id="4481530544597605423">ജോടി മാറ്റിയ ഉപകരണങ്ങൾ</translation> <translation id="4483049906298469269">നോൺ-ഡിഫോൾട്ട് നെറ്റ്വർക്ക് ഗേറ്റ്വേ പിംഗ് ചെയ്യാനായില്ല</translation> <translation id="4487489714832036847">Chromebooks പരമ്പരാഗത സോഫ്റ്റ്വെയറിന് പകരം ആപ്പുകൾ ഉപയോഗിക്കുന്നു. ഉൽപ്പാദനക്ഷമത, വിനോദം എന്നിവയ്ക്കും മറ്റും ആപ്പുകൾ നേടുക.</translation> +<translation id="4488257340342212116">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="4488502501195719518">എല്ലാ ഡാറ്റയും മായ്ക്കണോ?</translation> <translation id="449232563137139956">ഓൺലൈൻ സ്റ്റോറുകൾക്കോ വാർത്താ ലേഖനകൾക്കോ ചിത്രങ്ങൾ നൽകുന്നത് പോലുള്ള ചിത്രീകരണത്തിനായി സൈറ്റുകൾ സാധാരണയായി ചിത്രങ്ങൾ കാണിക്കുന്നു</translation> <translation id="4493468155686877504">(<ph name="INSTALL_SIZE" />) ശുപാർശ ചെയ്യുന്നു</translation> @@ -2991,6 +3018,7 @@ <translation id="4524832533047962394">വിതരണം ചെയ്ത എൻറോൾമെന്റ് മോഡിനെ ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തിന്റെ ഈ പതിപ്പ് പിന്തുണയ്ക്കുന്നില്ല. ഏറ്റവും പുതിയ പതിപ്പിലാണ് നിങ്ങൾ പ്രവർത്തിക്കുന്നതെന്ന് ഉറപ്പാക്കുക.</translation> <translation id="4527186207340858212">ഔദ്യോഗികാവശ്യത്തിന് പുതിയൊരു പ്രൊഫൈൽ സൃഷ്ടിക്കണോ?</translation> <translation id="452750746583162491">നിങ്ങളുടെ സമന്വയിപ്പിച്ച ഡാറ്റ അവലോകനം ചെയ്യുക</translation> +<translation id="4527929807707405172">റിവേഴ്സ് സ്ക്രോള് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="4528494169189661126">വിവർത്തന നിർദ്ദേശം</translation> <translation id="4530494379350999373">ഉറവിടം</translation> <translation id="4531924570968473143">ആരെയാണ് ഈ <ph name="DEVICE_TYPE" /> എന്നതിലേക്ക് നിങ്ങൾക്ക് ചേർക്കേണ്ടത്?</translation> @@ -3011,6 +3039,7 @@ <translation id="4545028762441890696">അത് വീണ്ടും പ്രവർത്തനക്ഷമമാക്കാൻ, പുതിയ അനുമതികൾ അംഗീകരിക്കുക:</translation> <translation id="4545759655004063573">അപര്യാപ്തമായ അനുമതികളാൽ സംരക്ഷിക്കാനായില്ല. മറ്റൊരു ലൊക്കേഷനിലേക്ക് സംരക്ഷിക്കുക.</translation> <translation id="4546308221697447294">Google Chrome ഉപയോഗിച്ച് വേഗത്തിൽ ബ്രൗസ് ചെയ്യുക</translation> +<translation id="4546345569117159016">വലതുവശത്തെ ബട്ടൺ</translation> <translation id="4546692474302123343">Google Assistant വോയ്സ് ഇൻപുട്ട്</translation> <translation id="4547659257713117923">മറ്റുപകരണങ്ങളിൽ നിന്നുള്ള ടാബുകളൊന്നും ഇല്ല</translation> <translation id="4547672827276975204">സ്വമേധയാ സജ്ജമാക്കുക</translation> @@ -3070,6 +3099,7 @@ <translation id="4608500690299898628">&കണ്ടെത്തുക...</translation> <translation id="4608520674724523647">എൻറോൾമെൻറ് ചിത്രീകരണം വിജയകരം</translation> <translation id="4608703838363792434"><ph name="FILE_NAME" /> എന്നതിൽ സൂക്ഷ്മമായി കൈകാര്യം ചെയ്യേണ്ട ഉള്ളടക്കം അടങ്ങിയിരിക്കുന്നു</translation> +<translation id="4609987916561367134">JavaScript ഉപയോഗിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="4610162781778310380"><ph name="PLUGIN_NAME" />-ന് ഒരു പിശക് നേരിട്ടു</translation> <translation id="4610637590575890427"><ph name="SITE" /> -ലേക്ക് പോകണമെന്നാണോ ഉദ്ദേശിച്ചത്?</translation> <translation id="4611114513649582138">ഡാറ്റാ കണക്ഷൻ ലഭ്യമാണ്</translation> @@ -3181,6 +3211,7 @@ <translation id="473775607612524610">അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="473936925429402449"><ph name="TOTAL_ELEMENTS" />-ൽ <ph name="CURRENT_ELEMENT" />-ാമത്തെ അധിക ഉള്ളടക്കം തിരഞ്ഞെടുത്തു</translation> <translation id="4739639199548674512">ടിക്കറ്റുകൾ</translation> +<translation id="4742334355511750246">ചിത്രങ്ങൾ കാണിക്കാൻ അനുവാദമില്ല</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />ആപ്പുകൾ അപ്ഡേറ്റ് ചെയ്യുന്നത് എങ്ങനെയെന്ന് അറിയുക<ph name="END_LINK" /></translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{സൈറ്റ് അൺമ്യൂട്ട് ചെയ്യുക}other{സൈറ്റുകൾ അൺമ്യൂട്ട് ചെയ്യുക}}</translation> <translation id="4746351372139058112">Messages</translation> @@ -3316,6 +3347,7 @@ <translation id="4908811072292128752">ഒരേസമയം രണ്ട് സൈറ്റുകൾ ബ്രൗസ് ചെയ്യാൻ ഒരു പുതിയ ടാബ് തുറക്കുക</translation> <translation id="4909038193460299775"><ph name="DOMAIN" /> ഈ അക്കൗണ്ട് മാനേജ് ചെയ്യുന്നതിനാൽ നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവ ഈ ഉപകരണത്തിൽ നിന്ന് മായ്ക്കുന്നതാണ്. എന്നിരുന്നാലും, നിങ്ങളുടെ വിവരങ്ങൾ Google അക്കൗണ്ടിൽ സൂക്ഷിക്കുന്നതും <ph name="BEGIN_LINK" />Google ഡാഷ്ബോർഡിൽ<ph name="END_LINK" /> മാനേജ് ചെയ്യാവുന്നതുമാണ്.</translation> <translation id="4912643508233590958">നിഷ്ക്രിയാവസ്ഥയിൽ നിന്ന് സജീവമാകൽ</translation> +<translation id="4915961947098019832">ചിത്രങ്ങൾ കാണിക്കാൻ അനുവദിക്കുന്നു</translation> <translation id="4916542008280060967"><ph name="FILE_NAME" /> എഡിറ്റ് ചെയ്യാൻ സൈറ്റിനെ അനുവദിക്കണോ?</translation> <translation id="491691592645955587">സുരക്ഷിതമായ ഒരു ബ്രൗസറിലേക്ക് മാറുക</translation> <translation id="4917385247580444890">ശക്തം</translation> @@ -3403,6 +3435,7 @@ <translation id="5027550639139316293">ഇമെയില് സര്ട്ടിഫിക്കറ്റ്</translation> <translation id="5027562294707732951">വിപുലീകരണം ചേർക്കുക</translation> <translation id="5029568752722684782">പകർപ്പ് മായ്ക്കുക</translation> +<translation id="5033137252639132982">മോഷൻ സെൻസറുകൾ ഉപയോഗിക്കാൻ അനുവാദമില്ല</translation> <translation id="5033266061063942743">ജ്യാമിതീയ രൂപങ്ങള്</translation> <translation id="5036662165765606524">ഒന്നിലധികം ഫയലുകൾ സ്വയമേവ ഡൗൺലോഡ് ചെയ്യുന്നതിന് ഒരു സൈറ്റിനെയും അനുവദിക്കരുത്</translation> <translation id="5037676449506322593">എല്ലാം തിരഞ്ഞെടുക്കുക</translation> @@ -3452,6 +3485,7 @@ <translation id="5088172560898466307">സെർവർ ഹോസ്റ്റ്നാമം</translation> <translation id="5088534251099454936">RSA എന്ക്രിപ്ഷനോടുകൂടിയ PKCS #1 SHA-512</translation> <translation id="5089810972385038852">സ്റ്റേറ്റ്</translation> +<translation id="5090637338841444533">നിങ്ങളുടെ ക്യാമറയുടെ സ്ഥാനം ട്രാക്ക് ചെയ്യാൻ അനുവാദമില്ല</translation> <translation id="5094721898978802975">സഹകരിക്കുന്ന നേറ്റീവ് അപ്ലിക്കേഷനുകളുമായി ആശയവിനിമയം നടത്തുക</translation> <translation id="5097002363526479830">'<ph name="NAME" />' നെറ്റ്വര്ക്കിലേക്ക് ബന്ധിപ്പിക്കുന്നതിൽ പരാജയപ്പെട്ടു: <ph name="DETAILS" /></translation> <translation id="5097649414558628673">ടൂൾ: <ph name="PRINT_NAME" /></translation> @@ -3760,6 +3794,7 @@ <translation id="5471768120198416576">അവിടെയുണ്ടോ! ഞാനാണ് നിങ്ങളുടെ ടെക്സ്റ്റ് ടു സ്പീച്ച് വോയ്സ്.</translation> <translation id="5472627187093107397">ഈ സൈറ്റിനുള്ള പാസ്വേഡുകൾ സംരക്ഷിക്കുക</translation> <translation id="5473333559083690127">പുതിയ പിൻ വീണ്ടും നൽകുക</translation> +<translation id="5481273127572794904">ഒന്നിലധികം ഫയലുകൾ സ്വയമേവ ഡൗൺലോഡ് ചെയ്യാൻ അനുവാദമില്ല</translation> <translation id="5481941284378890518">സമീപത്തുള്ള പ്രിന്ററുകൾ ചേർക്കുക</translation> <translation id="5483785310822538350">ഫയലിലേക്കും ഉപകരണത്തിലേക്കുമുള്ള ആക്സസ് റദ്ദാക്കുക</translation> <translation id="5485080380723335835">സുരക്ഷയ്ക്കായി <ph name="DEVICE_TYPE" /> ലോക്ക് ചെയ്തു. തുടരുന്നതിന് പാസ്വേഡ് നൽകുക.</translation> @@ -3781,6 +3816,7 @@ <translation id="5495466433285976480">നിങ്ങളുടെ അടുത്ത പുനരാരംഭത്തിനുശേഷം, നിങ്ങളുടെ പ്രാദേശിക ഉപയോക്താക്കൾ, ഫയലുകൾ, ഡാറ്റ, മറ്റ് ക്രമീകരണങ്ങൾ എന്നിവയെല്ലാം ഇത് നീക്കംചെയ്യും. എല്ലാ ഉപയോക്താക്കളും വീണ്ടും സൈൻ ഇൻ ചെയ്യേണ്ടിവരും.</translation> <translation id="5495597166260341369">ഡിസ്പ്ലേ ഓണാക്കി നിലനിർത്തുക</translation> <translation id="5496587651328244253">ഓര്ഗനൈസുചെയ്യുക</translation> +<translation id="5496730470963166430">പോപ്പ് അപ്പ് അയയ്ക്കാനോ റീഡയറക്റ്റുകൾ ഉപയോഗിക്കാനോ അനുവാദമില്ല</translation> <translation id="5497251278400702716">ഈ ഫയൽ</translation> <translation id="5498967291577176373">നിങ്ങളുടെ പേരോ വിലാസമോ ഫോൺ നമ്പറോ വേഗത്തിൽ എഴുതാൻ ഇൻലൈൻ നിർദ്ദേശങ്ങൾ സഹായിക്കുന്നു</translation> <translation id="5499313591153584299">ഈ ഫയൽ നിങ്ങളുടെ കമ്പ്യൂട്ടറിന് ഹാനികരമായേക്കാം.</translation> @@ -3788,6 +3824,7 @@ <translation id="5500709606820808700">സുരക്ഷാ പരിശോധന ഇന്ന് നടത്തി</translation> <translation id="5501809658163361512">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് <ph name="ATTACHMENTS" /> സ്വീകരിക്കാനായില്ല}other{<ph name="DEVICE_NAME" /> ഉപകരണത്തിൽ നിന്ന് <ph name="ATTACHMENTS" /> സ്വീകരിക്കാനായില്ല}}</translation> <translation id="5502500733115278303">Firefoxല് നിന്ന് ഇറക്കുമതി ചെയ്തവ</translation> +<translation id="5502915260472117187">കുട്ടി</translation> <translation id="5503982651688210506">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനും ചലിപ്പിക്കാനും, മൈക്രോഫോൺ ഉപയോഗിക്കാനും <ph name="HOST" /> -നെ, തുടർന്നും അനുവദിക്കുക</translation> <translation id="5505264765875738116">അറിയിപ്പുകൾ അയയ്ക്കാൻ സൈറ്റുകൾക്ക് അനുവാദം ചോദിക്കാനാവില്ല</translation> <translation id="5505307013568720083">മഷിയില്ല</translation> @@ -3875,6 +3912,7 @@ <translation id="5596627076506792578">കൂടുതൽ ഓപ്ഷനുകൾ</translation> <translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> MB മൊബൈല് ഡാറ്റ ഉപയോഗിച്ച് അപ്ഡേറ്റ് ഡൗൺലോഡ് ചെയ്യും. തുടരാൻ താൽപ്പര്യമുണ്ടോ?</translation> <translation id="5601503069213153581">PIN</translation> +<translation id="5601823921345337195">MIDI ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യാൻ അനുവാദമില്ല</translation> <translation id="5602765853043467355">ഈ ഉപകരണത്തിൽ നിന്ന് ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ എന്നിവയും മറ്റും മായ്ക്കുക</translation> <translation id="5605623530403479164">മറ്റ് തിരയൽ യന്ത്രങ്ങൾ</translation> <translation id="5605758115928394442">ഇത് നിങ്ങൾ തന്നെയാണെന്ന് സ്ഥിരീകരിക്കാൻ ഫോണിലേക്ക് ഒരു അറിയിപ്പ് അയച്ചിട്ടുണ്ട്.</translation> @@ -3996,6 +4034,7 @@ <translation id="5747552184818312860">കാലഹരണപ്പെടുന്നു</translation> <translation id="5747785204778348146">ഡെവലപ്പർ - അസ്ഥിരം</translation> <translation id="5747809636523347288">ഒട്ടിച്ച്, <ph name="URL" /> എന്നതിലേക്ക് പോവുക</translation> +<translation id="5754152670305761216">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യുന്നത് അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="5756163054456765343">സഹാ&യ കേന്ദ്രം</translation> <translation id="5759728514498647443"><ph name="APP_NAME" /> വഴി പ്രിന്റ് ചെയ്യാൻ നിങ്ങൾ അയയ്ക്കുന്ന പ്രമാണങ്ങളെ <ph name="APP_NAME" /> എന്നതിന് വായിക്കാനാകുന്നു.</translation> <translation id="5763751966069581670">USB ഉപകരണങ്ങളൊന്നും കണ്ടില്ല</translation> @@ -4466,6 +4505,7 @@ <translation id="6295158916970320988">എല്ലാ സൈറ്റുകളും</translation> <translation id="6295855836753816081">സംരക്ഷിക്കുന്നു...</translation> <translation id="6298962879096096191">Android ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ Google Play ഉപയോഗിക്കുക</translation> +<translation id="6300177430812514606">ഡാറ്റ അയയ്ക്കുന്നതോ സ്വീകരിക്കുന്നതോ പൂർത്തിയാക്കുന്നത് അനുവദിക്കുന്നില്ല</translation> <translation id="630065524203833229">&പുറത്തുപോകുക</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> സ്വയമേവ കോൺഫിഗർ ചെയ്യാനായില്ല. വിപുലമായ പ്രിൻ്റർ വിശദാംശങ്ങൾ വ്യക്തമാക്കുക. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="6301076166764763868">വ്യക്തിപര അക്കൗണ്ടിലെയും <ph name="EXISTING_USER" /> എന്ന അക്കൗണ്ടിലെയും ബ്രൗസിംഗ് വേർതിരിക്കാൻ, <ph name="NEW_USER" /> എന്നയാൾക്ക് പുതിയൊരു പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> @@ -4543,6 +4583,7 @@ <translation id="6390020764191254941">ടാബ് പുതിയ വിൻഡോയിലേക്ക് നീക്കുക</translation> <translation id="6390799748543157332">തുറന്നിരിക്കുന്ന എല്ലാ അതിഥി വിൻഡോകളും അടച്ചുകഴിഞ്ഞാൽ, ഈ വിൻഡോയിൽ നിങ്ങൾ കാണുന്ന പേജുകൾ നിങ്ങളുടെ ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് തെളിവുകൾ നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും, നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന എല്ലാ ഫയലുകളും സൂക്ഷിക്കും.</translation> <translation id="6393156038355142111">ശക്തമായ പാസ്വേഡ് നിർദ്ദേശിക്കുക</translation> +<translation id="6393550101331051049">സുരക്ഷിതമല്ലാത്ത ഉള്ളടക്കം കാണിക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="6395423953133416962"><ph name="BEGIN_LINK1" />സിസ്റ്റം വിവരങ്ങളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />മെട്രിക്സും<ph name="END_LINK2" /> അയയ്ക്കുക</translation> <translation id="6396988158856674517">ചലന സെൻസറുകൾ ഉപയോഗിക്കുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation> <translation id="6398715114293939307">Google Play സ്റ്റോർ നീക്കംചെയ്യുക</translation> @@ -4575,6 +4616,7 @@ <translation id="6425556984042222041">ടെക്സ്റ്റ് ടു സ്പീച്ച് റേറ്റ്</translation> <translation id="6426200009596957090">ChromeVox ക്രമീകരണം തുറക്കുക</translation> <translation id="642654727595919401">നിങ്ങളുടെ ഡാറ്റ ബാക്കപ്പ് ചെയ്ത് ഒരാഴ്ചയ്ക്കുള്ളിൽ ഈ <ph name="DEVICE_TYPE" /> തിരികെ നൽകാൻ <ph name="DOMAIN" /> നിങ്ങളോട് ആവശ്യപ്പെടുന്നു.<ph name="LINK_BEGIN" />വിശദാംശങ്ങൾ കാണുക<ph name="LINK_END" /></translation> +<translation id="642729974267661262">ശബ്ദം പ്ലേ ചെയ്യാൻ അനുവാദമില്ല</translation> <translation id="6428982734197629783">ചിത്രം പ്രോസസ് ചെയ്യുന്നു</translation> <translation id="6429384232893414837">അപ്ഡേറ്റ് ചെയ്യുന്നതിൽ പിശക്</translation> <translation id="6430814529589430811">Base64-എന്കോഡ് ചെയ്ത ASCII, ഒറ്റ സര്ട്ടിഫിക്കറ്റ്</translation> @@ -4603,6 +4645,7 @@ <translation id="6458701200018867744">അപ്ലോഡ് ചെയ്യാനായില്ല (<ph name="WEBRTC_LOG_UPLOAD_TIME" />).</translation> <translation id="6459488832681039634">കണ്ടെത്തുന്നതിനായി തിരഞ്ഞെടുപ്പ് ഉപയോഗിക്കുക</translation> <translation id="6459799433792303855">സജീവ വിൻഡോ മറ്റൊരു ഡിസ്പ്ലേയിലേക്ക് നീക്കി.</translation> +<translation id="6460566145397380451">MIDI ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്യാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="6460601847208524483">അടുത്തത് കണ്ടെത്തുക</translation> <translation id="6461170143930046705">നെറ്റ്വർക്കുകൾക്കായി തിരയുന്നു...</translation> <translation id="6463795194797719782">&എഡിറ്റ്ചെയ്യൂ</translation> @@ -4634,6 +4677,7 @@ <translation id="6499681088828539489">പങ്കിട്ട നെറ്റ്വർക്കുകൾക്ക് പ്രോക്സികൾ അനുവദിക്കാതിരിക്കുക</translation> <translation id="650266656685499220">ആൽബങ്ങൾ സൃഷ്ടിക്കാൻ Google Photos-ലേക്ക് പോകുക</translation> <translation id="6503077044568424649">കൂടുതൽ സന്ദര്ശിച്ചത്</translation> +<translation id="650457560773015827">ഇടതുവശത്തെ ബട്ടൺ</translation> <translation id="6504611359718185067">ഒരു പ്രിന്റർ ചേർക്കാൻ ഇന്റർനെറ്റുമായി കണക്റ്റുചെയ്യുക</translation> <translation id="6506374932220792071">SHA-256 ഉള്ള X9.62 ECDSA സിഗ്നേച്ചർ</translation> <translation id="6508248480704296122"><ph name="NAME_PH" /> എന്നതുമായി ബന്ധപ്പെട്ടത്</translation> @@ -4835,6 +4879,7 @@ <translation id="676560328519657314">Google Pay-യിലെ നിങ്ങളുടെ പേയ്മെന്റ് രീതികൾ</translation> <translation id="6767566652486411142">മറ്റൊരു ഭാഷ തിരഞ്ഞെടുക്കുക...</translation> <translation id="6767639283522617719">ഡൊമെയ്ൻ ബന്ധിപ്പിക്കാനാവില്ല. ഓർഗനൈസേഷണൽ യൂണിറ്റിനുള്ള ക്രമീകരണം ശരിയാണെന്ന് ഉറപ്പാക്കുക.</translation> +<translation id="6768034047581882264">സുരക്ഷിതമല്ലാത്ത ഉള്ളടക്കം കാണിക്കുന്നത് അനുവദനീയമല്ല</translation> <translation id="6769557323306147204">ഈ ഉപകരണം അപ്ഡേറ്റ് ചെയ്യാൻ <ph name="ORGANIZATION_NAME" /> നിർദ്ദേശിക്കുന്നു.</translation> <translation id="6769712124046837540">പ്രിന്റർ ചേർക്കുന്നു...</translation> <translation id="6770602306803890733">നിങ്ങൾക്കും വെബിലെ എല്ലാവർക്കും സുരക്ഷ മെച്ചപ്പെടുത്തുന്നു</translation> @@ -4926,6 +4971,7 @@ <translation id="6865313869410766144">ഓട്ടോഫിൽ ഫോം ഡാറ്റ</translation> <translation id="6865598234501509159"><ph name="LANGUAGE" /> ഭാഷയിൽ പേജ് ലഭ്യമല്ല</translation> <translation id="6865708901122695652">WebRTC ഇവന്റ് ലോഗുകൾ (<ph name="WEBRTC_EVENT_LOG_COUNT" />)</translation> +<translation id="686609795364435700">നിശബ്ദം</translation> <translation id="686664946474413495">വർണ്ണ ടെമ്പറേച്ചർ</translation> <translation id="6868934826811377550">വിശദാംശങ്ങൾ കാണുക</translation> <translation id="6871644448911473373">OCSP റെസ്പ്പോണ്ടര്: <ph name="LOCATION" /></translation> @@ -4975,6 +5021,7 @@ <translation id="6922745772873733498">പ്രിൻ്റ് ചെയ്യാൻ ഒരു പിൻ നൽകുക</translation> <translation id="6923132443355966645">സ്ക്രോൾ ചെയ്യുക / ക്ലിക്ക് ചെയ്യുക</translation> <translation id="6923633482430812883">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. നിങ്ങൾ കണക്റ്റ് ചെയ്യുന്ന ഫയൽ സെർവർ SMBv2 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ളത് പിന്തുണയ്ക്കുന്നു എന്ന് പരിശോധിക്കുക.</translation> +<translation id="6929126689972602640">സ്കൂൾ അക്കൗണ്ടുകൾക്കായി രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ പിന്തുണയ്ക്കുന്നില്ല. Google Classroom-ഉം വീട്ടിലിരുന്ന് സ്കൂൾ വർക്ക് ചെയ്യാനുള്ള മറ്റ് വെബ്സൈറ്റുകളും ആക്സസ് ചെയ്യുന്നതിന് ഒരു സ്കൂൾ അക്കൗണ്ട് ചേർക്കാൻ, ആദ്യം കുട്ടിയുടെ വ്യക്തിപര അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക. സജ്ജീകരണത്തിൽ നിങ്ങൾക്ക് പിന്നീട് സ്കൂൾ അക്കൗണ്ട് ചേർക്കാനാകും.</translation> <translation id="6929760895658557216">OK Google</translation> <translation id="6930036377490597025">ബാഹ്യ സുരക്ഷാ കീ അല്ലെങ്കിൽ അന്തർനിർമ്മിത സെൻസർ</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{ഒരു വിപുലീകരണം നിരസിച്ചു}other{# വിപുലീകരണങ്ങൾ നിരസിച്ചു}}</translation> @@ -5015,6 +5062,7 @@ <translation id="6972629891077993081">HID ഉപകരണങ്ങൾ</translation> <translation id="6972754398087986839">ആരംഭിക്കാം</translation> <translation id="6972887130317925583">അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. ഏത് സമയത്തും <ph name="SETTINGS" /> എന്നതിൽ നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കുക.</translation> +<translation id="697312151395002334">പോപ്പ് അപ്പ് അയയ്ക്കുന്നതോ റീഡയറക്റ്റുകൾ ഉപയോഗിക്കുന്നതോ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="6973611239564315524">Debian 10 (Buster) -ലേക്കുള്ള അപ്ഗ്രേഡ് ലഭ്യമാണ്</translation> <translation id="6974609594866392343">ഓഫ്ലൈൻ ഡെമോ മോഡ്</translation> <translation id="6977381486153291903">ഫേംവെയർ പുനഃപരിശോധന</translation> @@ -5037,6 +5085,7 @@ <translation id="6995899638241819463">പാസ്വേഡുകൾ, ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായി വെളിപ്പെട്ടാൽ നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുന്നു</translation> <translation id="6997642619627518301"><ph name="NAME_PH" /> - ആക്റ്റിവിറ്റി ലോഗ്</translation> <translation id="6997707937646349884">നിങ്ങളുടെ ഉപകരണങ്ങളിൽ:</translation> +<translation id="6998093258894828179">കാർഡുകൾ മറയ്ക്കുക</translation> <translation id="6998793565256476099">വീഡിയോ കോണ്ഫറന്സിംഗിനായി ഉപകരണം എൻറോൾ ചെയ്യുക</translation> <translation id="6999956497249459195">പുതിയ ഗ്രൂപ്പ്</translation> <translation id="7000206553895739324"><ph name="PRINTER_NAME" /> കണക്റ്റ് ചെയ്തെങ്കിലും കോൺഫിഗറേഷൻ ആവശ്യമുണ്ട്</translation> @@ -5053,6 +5102,7 @@ <translation id="7005848115657603926">അസാധുവായ പേജ് റേഞ്ച്, <ph name="EXAMPLE_PAGE_RANGE" /> എന്നത് ഉപയോഗിക്കുക</translation> <translation id="7006634003215061422">ചുവടെയുള്ള മാർജിൻ</translation> <translation id="7007648447224463482">എല്ലാം പുതിയ വിൻഡോയിൽ തുറക്കുക</translation> +<translation id="7009709314043432820"><ph name="APP_NAME" /> നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation> <translation id="701080569351381435">ഉറവിടം കാണുക</translation> <translation id="7014174261166285193">ഇന്സ്റ്റാളേഷന് പരാജയപ്പെട്ടു.</translation> <translation id="7017004637493394352">വീണ്ടും "Ok Google" പറയുക</translation> @@ -5072,6 +5122,7 @@ <translation id="7038632520572155338">ആക്സസ് മാറുക</translation> <translation id="7039326228527141150"><ph name="VENDOR_NAME" /> എന്നതിൽ നിന്നും USB ഉപകരണങ്ങൾ ആക്സസ് ചെയ്യുക</translation> <translation id="7039912931802252762">Microsoft Smart Card Logon</translation> +<translation id="7039951224110875196">കുട്ടിക്കായി Google അക്കൗണ്ട് സൃഷ്ടിക്കുക</translation> <translation id="7040230719604914234">ഓപ്പറേറ്റർ</translation> <translation id="7043108582968290193">പൂർത്തിയായി! അനുയോജ്യതയില്ലാത്ത അപ്ലിക്കേഷനുകളൊന്നും കണ്ടെത്തിയില്ല.</translation> <translation id="7044124535091449260">സൈറ്റ് ആക്സസിനെക്കുറിച്ച് കൂടുതലറിയുക</translation> @@ -5143,6 +5194,7 @@ <translation id="7121362699166175603">ചരിത്രവും വിലാസ ബാറിലെ സ്വയം പൂർത്തീകരണങ്ങളും മായ്ക്കുന്നു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് <ph name="BEGIN_LINK" />history.google.com<ph name="END_LINK" /> എന്നതിൽ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation> <translation id="7121438501124788993">ഡെവലപ്പർ മോഡ്</translation> <translation id="7121728544325372695">സ്മാർട്ട് ഡാഷുകൾ</translation> +<translation id="7123030151043029868">ഒന്നിലധികം ഫയലുകൾ സ്വയമേവ ഡൗൺലോഡ് ചെയ്യാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="7123360114020465152">ഇനിയങ്ങോട്ട് പിന്തുണയില്ല</translation> <translation id="7125148293026877011">Crostini ഇല്ലാതാക്കുക</translation> <translation id="7127980134843952133">ഡൗൺലോഡ് ചരിത്രം</translation> @@ -5157,6 +5209,7 @@ <translation id="7136984461011502314"><ph name="PRODUCT_NAME" /> ലേക്ക് സ്വാഗതം</translation> <translation id="7136993520339022828">ഒരു പിശകുണ്ട്. മറ്റ് ചിത്രങ്ങൾ തിരഞ്ഞെടുത്ത് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="713888829801648570">ക്ഷമിക്കണം, നിങ്ങൾ ഓഫ്ലൈൻ ആയതിനാൽ പാസ്വേഡ് പരിശോധിച്ചുറപ്പിക്കാനായില്ല.</translation> +<translation id="7139627972753429585"><ph name="APP_NAME" /> നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുന്നു</translation> <translation id="7140928199327930795">ലഭ്യമായ മറ്റ് ഉപകരണങ്ങളൊന്നുമില്ല.</translation> <translation id="7141105143012495934">നിങ്ങളുടെ അക്കൗണ്ട് വിശദാംശങ്ങൾ വീണ്ടെടുക്കാനാവാത്തതിനാൽ സൈൻ ഇൻ ചെയ്യുന്നത് പരാജയപ്പെട്ടു. നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക അല്ലെങ്കിൽ വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="7143207342074048698">കണക്റ്റിംഗ്</translation> @@ -5296,6 +5349,7 @@ <translation id="7324297612904500502">ബീറ്റ ഫോറം</translation> <translation id="7325209047678309347">പേപ്പർ ജാമായി</translation> <translation id="7325437708553334317">ഉയർന്ന ദൃശ്യ തീവ്രതാ വിപുലീകരണം</translation> +<translation id="7326004502692201767">കുട്ടിക്കായി ഈ <ph name="DEVICE_TYPE" /> സജ്ജീകരിക്കുക</translation> <translation id="7328699668338161242">അസിസ്റ്റന്റിന് നിങ്ങളുടെ ശബ്ദം മുമ്പേ തിരിച്ചറിയാൻ കഴിയും</translation> <translation id="7328867076235380839">അസാധുവായ കോമ്പിനേഷൻ</translation> <translation id="7329154610228416156">സുരക്ഷിതമല്ലാത്ത URL (<ph name="BLOCKED_URL" />) ഉപയോഗിക്കാൻ കോൺഫിഗർ ചെയ്തിരിക്കുന്നതിനാൽ സൈൻ ഇൻ ചെയ്യുന്നതിന് പരാജയപ്പെട്ടു. നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക.</translation> @@ -5420,6 +5474,7 @@ <translation id="7465635034594602553">എന്തോ കുഴപ്പമുണ്ടായി. അൽപ്പസമയം കാത്തിരുന്ന ശേഷം, <ph name="APP_NAME" /> വീണ്ടും റൺ ചെയ്യുക.</translation> <translation id="7465778193084373987">നെറ്റ്സ്കേപ്പ് സര്ട്ടിഫിക്കറ്റ് അസാധുവാക്കല് URL</translation> <translation id="7469894403370665791">ഈ നെറ്റ്വര്ക്കിലേക്ക് സ്വപ്രേരിതമായി ബന്ധിപ്പിക്കുന്നു</translation> +<translation id="7470424110735398630">നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡ് കാണാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="747114903913869239">പിശക്: വിപുലീകരണം ഡീകോഡ് ചെയ്യാനാവില്ല</translation> <translation id="7473891865547856676">വേണ്ട, നന്ദി</translation> <translation id="747459581954555080">എല്ലാം പുനഃസ്ഥാപിക്കുക</translation> @@ -5529,6 +5584,7 @@ <translation id="7607002721634913082">അല്പംനിര്ത്തി</translation> <translation id="7608810328871051088">Android മുൻഗണനകൾ</translation> <translation id="7609148976235050828">ഇന്റർനെറ്റ് കണക്റ്റ് ചെയ്ത ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="7612655942094160088">കണക്റ്റ് ചെയ്തിരിക്കുന്ന ഫോണിന്റെ ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കി.</translation> <translation id="7614260613810441905">ഏതെങ്കിലും സൈറ്റിന് നിങ്ങളുടെ ഉപകരണത്തിലെ ഫയലുകളോ ഫോൾഡറുകളോ എഡിറ്റ് ചെയ്യണമെങ്കിൽ നിങ്ങളോട് അനുമതി ചോദിക്കുക (ശുപാർശ ചെയ്യുന്നത്)</translation> <translation id="761530003705945209">Google ഡ്രൈവിലേക്ക് ബാക്കപ്പെടുക്കുക. ഏത് സമയത്തും ഡാറ്റ എളുപ്പത്തിൽ പുനഃസ്ഥാപിക്കുകയോ ഉപകരണം മാറുകയോ ചെയ്യുക. നിങ്ങളുടെ ബാക്കപ്പിൽ ആപ്പ് ഡാറ്റയും ഉൾപ്പെടുന്നു. നിങ്ങളുടെ ബാക്കപ്പുകൾ Google-ലേക്ക് അപ്ലോഡ് ചെയ്ത് Google അക്കൗണ്ട് പാസ്വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യും.</translation> <translation id="7615365294369022248">അക്കൗണ്ട് ചേർക്കുന്നതിൽ പിശകുണ്ടായി</translation> @@ -5647,6 +5703,7 @@ <translation id="7732111077498238432">നെറ്റ്വർക്ക് നയത്തിനാൽ നിയന്ത്രിതമാണ്</translation> <translation id="7737115349420013392">"<ph name="DEVICE_NAME" />"-മായി ജോടിയാക്കുന്നു ...</translation> <translation id="7737238973539693982">Linux (ബീറ്റ) ഇല്ലാതാക്കുക</translation> +<translation id="7737948071472253612">നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ അനുവദിക്കുന്നില്ല</translation> <translation id="7740996059027112821">സാധാരണം</translation> <translation id="7742706086992565332">ചില വെബ്സൈറ്റുകൾ എത്ര മാത്രം സൂം ഇൻ അല്ലെങ്കിൽ സൂം ഔട്ട് ചെയ്യാമെന്ന് നിങ്ങൾക്ക് സജ്ജീകരിക്കാം</translation> <translation id="774377079771918250">എവിടെ സംരക്ഷിക്കണമെന്ന് തിരഞ്ഞെടുക്കുക</translation> @@ -5655,6 +5712,7 @@ <translation id="7750228210027921155">ചിത്രത്തിനുള്ളിലെ ചിത്രം</translation> <translation id="7751260505918304024">എല്ലാം കാണിക്കുക</translation> <translation id="7753735457098489144">സ്റ്റോറേജ് സ്പെയ്സ് ഇല്ലാത്തതിനാൽ ഇൻസ്റ്റാൾ ചെയ്യാനായില്ല. ഇടം സൃഷ്ടിക്കാൻ, ഉപകരണ സ്റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation> +<translation id="7754347746598978109">JavaScript ഉപയോഗിക്കാൻ അനുവദിക്കുന്നില്ല</translation> <translation id="7754704193130578113">ഡൗൺലോഡ് ചെയ്യുന്നതിനു മുമ്പ് ഓരോ ഫയലും എവിടെ സംരക്ഷിക്കണമെന്ന് ചോദിക്കുക</translation> <translation id="7755287808199759310">നിങ്ങൾക്ക് വേണ്ടി ഇത് അൺബ്ലോക്കുചെയ്യാൻ രക്ഷിതാവിന് കഴിയും</translation> <translation id="7757592200364144203">ഉപകരണത്തിന്റെ പേര് മാറ്റുക</translation> @@ -5707,6 +5765,7 @@ <translation id="7798844538707273832"><ph name="PERMISSION" /> സ്വയമേവ ബ്ലോക്ക് ചെയ്തു</translation> <translation id="7799299114731150374">വാൾപേപ്പർ സജ്ജീകരിച്ചു</translation> <translation id="7800518121066352902">എ&തിർ ഘടികാരദിശയിൽ തിരിക്കുക</translation> +<translation id="7802539296536804623">ഈ പേജിൽ കാർഡുകൾ കാണിക്കരുത്</translation> <translation id="780301667611848630">വേണ്ട നന്ദി</translation> <translation id="7804072833593604762">ടാബ് അടച്ചു</translation> <translation id="7805768142964895445">നില</translation> @@ -6137,6 +6196,7 @@ <translation id="826905130698769948">ക്ലയന്റ് സർട്ടിഫിക്കറ്റ് അസാധുവാണ്</translation> <translation id="8270242299912238708">PDF ഡോക്യുമെന്റുകൾ</translation> <translation id="827097179112817503">ഹോം ബട്ടൺ കാണിക്കുക</translation> +<translation id="8271379370373330993">രക്ഷിതാക്കളെ, അടുത്ത ഏതാനും ഘട്ടങ്ങൾ നിങ്ങൾക്കുള്ളതാണ്. അക്കൗണ്ട് സജ്ജീകരണത്തിന് ശേഷം, <ph name="DEVICE_TYPE" /> കുട്ടിക്ക് കൈമാറാവുന്നതാണ്.</translation> <translation id="8272443605911821513">"കൂടുതൽ ഉപകരണങ്ങൾ" മെനുവിലെ വിപുലീകരണങ്ങളിൽ ക്ലിക്ക് ചെയ്യുന്നതിലൂടെ നിങ്ങളുടെ വിപുലീകരണങ്ങൾ നിയന്ത്രിക്കുക.</translation> <translation id="8274332263553132018">ഫയൽ കാസ്റ്റ് ചെയ്യുക</translation> <translation id="8274924778568117936">അപ്ഡേറ്റ് പൂർത്തിയാകുന്നതുവരെ നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഓഫാക്കുകയോ അടയ്ക്കുകയോ ചെയ്യരുത്. ഇൻസ്റ്റലേഷൻ പൂർത്തിയായിക്കഴിഞ്ഞാൽ <ph name="DEVICE_TYPE" /> റീസ്റ്റാർട്ട് ആകുന്നതാണ്.</translation> @@ -6160,6 +6220,7 @@ <translation id="8300011035382349091">ഈ ടാബിന്റെ ബുക്ക്മാർക്ക് എഡിറ്റ് ചെയ്യുക</translation> <translation id="8300374739238450534">ഇരുളിൻ നീല</translation> <translation id="8300849813060516376">OTASP പരാജയപ്പെട്ടു</translation> +<translation id="8304383784961451596">ഈ ഉപകരണം ഉപയോഗിക്കാൻ നിങ്ങൾക്ക് അനുമതിയില്ല. സൈൻ-ഇൻ അനുമതിക്കായി അഡ്മിനുമായി ബന്ധപ്പെടുക അല്ലെങ്കിൽ Family Link മേൽനോട്ടം വഹിക്കുന്ന ഒരു Google അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="8308179586020895837"><ph name="HOST" />-ന് നിങ്ങളുടെ ക്യാമറ ആക്സസ് ചെയ്യാൻ താൽപ്പര്യമുണ്ടോ എന്ന് ചോദിക്കുക</translation> <translation id="830868413617744215">ബീറ്റ</translation> <translation id="8309458809024885768">സർട്ടിഫിക്കറ്റ് നിലവിലുണ്ട്</translation> @@ -6173,6 +6234,7 @@ <translation id="8322814362483282060">നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ്സുചെയ്യുന്നതിൽ നിന്ന് ഈ പേജിനെ തടഞ്ഞിരിക്കുന്നു.</translation> <translation id="8323167517179506834">URL ടൈപ്പുചെയ്യുക</translation> <translation id="8324784016256120271">വ്യത്യസ്ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി കാണാൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാനാവും, ഉദാഹരണത്തിന്, പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ</translation> +<translation id="8325413836429495820">നിങ്ങളുടെ ക്ലിപ്പ്ബോർഡ് കാണാൻ അനുവാദമില്ല</translation> <translation id="8326478304147373412">PKCS #7, സര്ട്ടിഫിക്കറ്റ് ചെയിന്</translation> <translation id="8327039559959785305">Linux ഫയലുകൾ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8327676037044516220">അനുമതി, ഉള്ളടക്ക ക്രമീകരണം</translation> @@ -6222,6 +6284,7 @@ <translation id="8382913212082956454">&ഇമെയിൽ വിലാസം പകർത്തുക</translation> <translation id="8386091599636877289">നയം കണ്ടെത്തിയില്ല.</translation> <translation id="8386903983509584791">സ്കാൻ ചെയ്യുന്നത് പൂർത്തിയായി</translation> +<translation id="8387361103813440603">നിങ്ങളുടെ ലൊക്കേഷൻ കാണാൻ അനുവാദമില്ല</translation> <translation id="8389416080014625855">ഈ പേജിന് QR കോഡ് സൃഷ്ടിക്കുക</translation> <translation id="8389492867173948260">സന്ദർശിക്കുന്ന വെബ്സൈറ്റുകളിലെ, നിങ്ങളുടെ എല്ലാ ഡാറ്റയും വായിക്കാനും തിരുത്താനും ഈ വിപുലീകരണത്തെ അനുവദിക്കുക:</translation> <translation id="8390449457866780408">സെര്വര് ലഭ്യമല്ല.</translation> @@ -6408,6 +6471,7 @@ <translation id="8621866727807194849">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ദോഷകരമായ സോഫ്റ്റ്വെയറുണ്ട്. Chrome, അത് നീക്കം ചെയ്യുകയും ക്രമീകരണം പുനഃസ്ഥാപിക്കുകയും വിപുലീകരണങ്ങൾ പ്രവർത്തനരഹിതമാക്കുകയും ചെയ്യുന്നു. നിങ്ങളുടെ ബ്രൗസറിനെ ഇത് വീണ്ടും സാധാരണ പ്രവർത്തന രീതിയിലാക്കും.</translation> <translation id="8621979332865976405">നിങ്ങളുടെ സ്ക്രീൻ പൂർണ്ണമായും പങ്കിടുക</translation> <translation id="862542460444371744">&വിപുലീകരണങ്ങള്</translation> +<translation id="8625663000550647058">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ അനുവാദമില്ല</translation> <translation id="862727964348362408">താൽക്കാലികമായി നിർത്തി</translation> <translation id="862750493060684461">CSS കാഷേ</translation> <translation id="8627706565932943526">സമന്വയ പിശക്</translation> @@ -6488,6 +6552,7 @@ <translation id="8714838604780058252">പശ്ചാത്തല ഗ്രാഫിക്സ്</translation> <translation id="8715480913140015283">പശ്ചാത്തല ടാബ് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation> <translation id="8716931980467311658">ഈ <ph name="DEVICE_TYPE" /> നിന്നുള്ള നിങ്ങളുടെ Linux ഫയലുകളുടെ ഫോൾഡറിലുള്ള എല്ലാ Linux ആപ്പുകളും ഡാറ്റയും ഇല്ലാതാക്കണോ?</translation> +<translation id="8717145295869185525">വെർച്വൽ റിയാലിറ്റി ഉപകരണങ്ങളും ഡാറ്റയും ഉപയോഗിക്കാൻ അനുവാദമില്ല</translation> <translation id="8717864919010420084">ലിങ്ക് പകർത്തുക</translation> <translation id="8719472795285728850">വിപുലീകരണ ആക്റ്റിവിറ്റികൾ കേൾക്കുന്നു...</translation> <translation id="8719653885894320876"><ph name="PLUGIN_NAME" /> ഡൗൺലോഡ് ചെയ്യാനായില്ല</translation> @@ -6908,6 +6973,7 @@ <translation id="9179734824669616955">നിങ്ങളുടെ <ph name="DEVICE_TYPE" />-ൽ Linux (ബീറ്റ) സജ്ജീകരിക്കുക</translation> <translation id="9180281769944411366">ഈ പ്രക്രിയയ്ക്ക് കുറച്ച് സമയമെടുത്തേക്കാം. Linux കണ്ടെയ്നർ പ്രവർത്തനം ആരംഭിക്കുന്നു.</translation> <translation id="9180380851667544951">സൈറ്റിന് നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടാനാകും</translation> +<translation id="9186963452600581158">കുട്ടിയുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ച് സെെൻ ഇൻ ചെയ്യുക</translation> <translation id="9188732951356337132">ഉപയോഗവും പ്രശ്നനിർണ്ണയവുമായി ബന്ധപ്പെട്ട ഡാറ്റ അയയ്ക്കുക. പ്രശ്നനിർണ്ണയം, ഉപകരണം, ആപ്പ് ഉപയോഗം എന്നിവയുമായി ബന്ധപ്പെട്ട ഡാറ്റ, ഈ ഉപകരണം നിലവിൽ സ്വയമേവ Google-ന് അയയ്ക്കുന്നുണ്ട്. കുട്ടിയെ തിരിച്ചറിയാൻ ഇത് ഉപയോഗിക്കില്ല, സിസ്റ്റം, ആപ്പ് സ്ഥിരത, മറ്റ് മെച്ചപ്പെടുത്തൽ എന്നിവയ്ക്ക് സഹായിക്കുകയും ചെയ്യും. ചില സംഗ്രഹ ഡാറ്റ, Google ആപ്പുകളെയും Android ഡെവലപ്പർമാരെപ്പോലുള്ള പങ്കാളികളെയും സഹായിക്കുകയും ചെയ്യും. കുട്ടിയുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ അവരുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. <ph name="BEGIN_LINK2" />കൂടുതലറിയുക<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPsec + മുമ്പ് പങ്കിട്ട കീ</translation> <translation id="9198090666959937775">നിങ്ങളുടെ Android ഫോൺ ഒരു സുരക്ഷാ കീ ആയി ഉപയോഗിക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index b51ba4cc..f000a94 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -278,6 +278,7 @@ <translation id="1313705515580255288">Vaše záložky, história a ďalšie nastavenia budú synchronizované s účtom Google.</translation> <translation id="1314565355471455267">Android VPN</translation> <translation id="131461803491198646">Domáca sieť, bez roamingu</translation> +<translation id="1315056510003830387">Nemôže používať obsah Flash</translation> <translation id="1315144594965013365">Obe zariadenia musia byť odomknuté, blízko seba a mať zapnuté rozhranie Bluetooth. Ak zdieľate s Chromebookom, uistite sa, či má zapnuté zdieľanie nablízku (otvorte stavovú oblasť výberom času a potom vyberte Zdieľanie nablízku).</translation> <translation id="1316136264406804862">Prebieha vyhľadávanie...</translation> <translation id="1316495628809031177">Synchronizácia je pozastavená</translation> @@ -337,6 +338,7 @@ <translation id="1386791642444521222">Aktivovať fyzickú SIM kartu</translation> <translation id="1387519831959169718">Ak chcete oddeliť svoje prehliadanie, môžete používateľovi <ph name="NEW_USER" /> vytvoriť nový profil</translation> <translation id="138784436342154190">Obnoviť predvolenú stránku pri spustení?</translation> +<translation id="1388253969141979417">Môže používať váš mikrofón</translation> <translation id="1388728792929436380">Zariadenie <ph name="DEVICE_TYPE" /> bude po dokončení aktualizácií reštartované.</translation> <translation id="1389342855416376185">Blokovať chránený obsah</translation> <translation id="1390548061267426325">Otvoriť ako bežnú kartu</translation> @@ -387,6 +389,7 @@ <translation id="1433811987160647649">Pred prístupom sa spýtať</translation> <translation id="1434696352799406980">Týmto sa obnoví vaša stránka pri spustení, stránka na novej karte, vyhľadávač a pripnuté karty. Zakážu sa aj všetky rozšírenia a vymažú dočasné dáta, ako napríklad súbory cookie. Záložky, história a uložené heslá sa nevymažú.</translation> <translation id="1434886155212424586">Domovská stránka je stránka na novej karte</translation> +<translation id="1435515966666225466">Môže získavať prístup do vášho počítača pomocou doplnkov</translation> <translation id="1436390408194692385">Do konca platnosti zostáva: <ph name="TICKET_TIME_LEFT" /></translation> <translation id="1436671784520050284">Pokračovať v nastavení</translation> <translation id="1436784010935106834">Odstránené</translation> @@ -472,6 +475,7 @@ <translation id="1530838837447122178">Otvoriť nastavenia myši a touchpadu</translation> <translation id="1531004739673299060">Okno aplikácie</translation> <translation id="1531275250079031713">Zobraziť dialógové okno Pridať novú sieť Wi‑Fi</translation> +<translation id="1535228823998016251">Hlasné</translation> <translation id="1536754031901697553">Odpája sa...</translation> <translation id="1537254971476575106">Lupa celej obrazovky</translation> <translation id="15373452373711364">Veľký kurzor myši</translation> @@ -555,6 +559,7 @@ <translation id="1627408615528139100">Už je stiahnutý</translation> <translation id="1628948239858170093">Chcete súbor pred otvorením skontrolovať?</translation> <translation id="1629314197035607094">Platnosť hesla vypršala</translation> +<translation id="163072119192489970">Môže dokončiť odosielanie a prijímanie údajov</translation> <translation id="1630768113285622200">Reštartovať a pokračovať</translation> <translation id="1632082166874334883">Heslo uložené vo vašom účte Google</translation> <translation id="1632803087685957583">Umožňuje nastaviť rýchlosť opakovania klávesnice, predpoveď ďalšieho slova a ďalšie</translation> @@ -752,6 +757,7 @@ <translation id="1841705068325380214">Rozšírenie <ph name="EXTENSION_NAME" /> je zakázané</translation> <translation id="184273675144259287">Nahraďte svoje aplikácie a súbory pre Linux predchádzajúcou zálohou</translation> <translation id="1842766183094193446">Naozaj chcete povoliť režim ukážky?</translation> +<translation id="1845727111305721124">Môže prehrávať zvuk</translation> <translation id="1846308012215045257">Doplnok <ph name="PLUGIN_NAME" /> spustíte súčasným stlačením tlačidla Ctrl a kliknutím</translation> <translation id="1849186935225320012">Táto stránka má úplnú kontrolu nad zariadeniami MIDI.</translation> <translation id="1850508293116537636">Otočiť &v smere hodinových ručičiek</translation> @@ -776,6 +782,7 @@ <translation id="187145082678092583">Menej aplikácií</translation> <translation id="1871534214638631766">Zobrazovať súvisiace informácie, keď na obsah kliknete pravým tlačidlom alebo ho dlho stlačíte</translation> <translation id="1871615898038944731">Vaše zariadenie <ph name="DEVICE_TYPE" /> je aktuálne</translation> +<translation id="1874248162548993294">Môže zobrazovať ľubovoľné reklamy</translation> <translation id="1874972853365565008">{NUM_TABS,plural, =1{Presunúť kartu do iného okna}few{Presunúť karty do iného okna}many{Presunúť karty do iného okna}other{Presunúť karty do iného okna}}</translation> <translation id="1875386316419689002">Táto karta je pripojená k zariadeniu HID.</translation> <translation id="1875387611427697908">Dá sa pridať iba zo služby <ph name="CHROME_WEB_STORE" /></translation> @@ -831,6 +838,7 @@ <translation id="1931152874660185993">Nie sú nainštalované žiadne komponenty.</translation> <translation id="1932098463447129402">Nie pred</translation> <translation id="1933809209549026293">Pripojte myš alebo klávesnicu. Ak používate zariadenie Bluetooth, uistite sa, že je pripravené na párovanie.</translation> +<translation id="1935303383381416800">Môže zobrazovať vašu polohu</translation> <translation id="1936931585862840749">Zadajte číslo označujúce počet kópií, ktoré chcete vytlačiť (od 1 do <ph name="MAX_COPIES" />).</translation> <translation id="1937774647013465102">S týmto zariadením, ktoré je <ph name="ARCHITECTURE_DEVICE" />, sa nedá importovať typ architektúry kontajnera <ph name="ARCHITECTURE_CONTAINER" />. Tento kontajner môžete skúsiť obnoviť do iného zariadenia, prípadne môžete získať prístup k súborom v tomto obraze kontajnera pomocou aplikácie Súbory.</translation> <translation id="1938351510777341717">Externý príkaz</translation> @@ -948,6 +956,7 @@ <translation id="2090165459409185032">Ak chcete obnoviť informácie o svojom účte, prejdite na stránku google.com/accounts/recovery</translation> <translation id="2090876986345970080">Nastavenie zabezpečenia systému</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="209539936453343974">Ak chcete nastaviť rodičovskú kontrolu, vaše dieťa musí mať účet Google spravovaný rodičom. <ph name="DEVICE_TYPE_PLURAL" /> umožňujú rodičom nastaviť limity času používania, schvaľovať alebo blokovať weby a vykonávať viac úloh pomocou aplikácie Family Link. Ak dieťa potrebuje robiť domáce úlohy na weboch, ako je Učebňa Google, neskôr môžete pridať školský účet.</translation> <translation id="2096715839409389970">Vymazať súbory cookie tretej strany</translation> <translation id="2097372108957554726">Ak chcete registrovať nové zariadenia, musíte sa prihlásiť do prehliadača Chrome</translation> <translation id="2098805196501063469">Skontrolovať zostávajúce heslá</translation> @@ -1098,6 +1107,7 @@ <translation id="2261323523305321874">Správca vykonal celosystémovú zmenu, ktorá zakazuje niektoré staré profily.</translation> <translation id="2262332168014443534">Zjednodušený režim zrýchľuje prehliadanie všetkých stránok vrátane tých, ktoré používajú protokol HTTPS.</translation> <translation id="2262477216570151239">Oneskorenie pred opakovaním</translation> +<translation id="2262888617381992508">Nemôže prehrávať chránený obsah</translation> <translation id="2263189956353037928">Odhlásiť sa a znova prihlásiť</translation> <translation id="2263371730707937087">Frekvencia obnovenia obrazovky</translation> <translation id="22665427234727190">Opýtať sa, keď chce web získať prístup k zariadeniam Bluetooth (odporúčané)</translation> @@ -1365,6 +1375,7 @@ <translation id="2571655996835834626">Meniť nastavenia, ktoré ovládajú prístup webových stránok k funkciám, ako sú súbory cookie, JavaScript, doplnky, geolokácia, mikrofón, fotoaparát atď.</translation> <translation id="2572032849266859634">Bol udelený prístup k médiu <ph name="VOLUME_NAME" /> s povolením iba na čítanie.</translation> <translation id="2575247648642144396">Ikona sa zobrazí, keď sa na aktuálnej stránke bude dať použiť rozšírenie. Rozšírenie použijete kliknutím na ikonu alebo stlačením klávesov <ph name="EXTENSION_SHORTCUT" />.</translation> +<translation id="2575441894380764255">Nemôže zobrazovať obťažujúce alebo zavádzajúce reklamy</translation> <translation id="257779572837908839">Nastaviť ako Chromebox pre videokonferencie</translation> <translation id="2579232805407578790">Nepodarilo sa pripojiť k serveru. Skontrolujte pripojenie k sieti a skúste to znova. Ak problém pretrváva, reštartujte svoj Chromebook. Kód chyby: <ph name="ERROR_CODE" />.</translation> <translation id="2580889980133367162">Vždy povoliť hostiteľovi <ph name="HOST" /> sťahovať viacero súborov</translation> @@ -1631,6 +1642,7 @@ <translation id="2880660355386638022">Umiestnenie okna</translation> <translation id="2881076733170862447">Keď kliknete na rozšírenie</translation> <translation id="2882943222317434580"><ph name="IDS_SHORT_PRODUCT_NAME" /> sa o chvíľu reštartuje a obnoví</translation> +<translation id="288387288628762616">Môže používať obsah Flash</translation> <translation id="2885378588091291677">Správca úloh</translation> <translation id="2885729872133513017">Pri dešifrovaní odpovede servera sa vyskytol problém.</translation> <translation id="2886771036282400576">• <ph name="PERMISSION" /></translation> @@ -1665,6 +1677,7 @@ <translation id="2923234477033317484">Odstrániť tento účet</translation> <translation id="2926085873880284723">Obnoviť predvolené skratky</translation> <translation id="2927017729816812676">Úložisko vyrovnávacej pamäte</translation> +<translation id="2928795416630981206">Môže sledovať pozíciu vašej kamery</translation> <translation id="2931157624143513983">Prispôsobiť tlačovej ploche</translation> <translation id="2932085390869194046">Navrhnúť heslo…</translation> <translation id="2932330436172705843"><ph name="PROFILE_DISPLAY_NAME" /> (detský účet)</translation> @@ -1672,6 +1685,7 @@ <translation id="2932883381142163287">Nahlásiť zneužitie</translation> <translation id="2933632078076743449">Posledná aktualizácia</translation> <translation id="2934999512438267372">Úplné ovládanie zariadení MIDI bolo povolené</translation> +<translation id="2935654492420446828">Pridajte školský účet neskôr</translation> <translation id="2936851848721175671">Zálohovanie a obnovenie</translation> <translation id="2938225289965773019">Otvárať odkazy protokolu <ph name="PROTOCOL" /></translation> <translation id="2938845886082362843">Zobraziť a odstrániť prihlasovacie údaje uložené v bezpečnostnom kľúči</translation> @@ -1775,6 +1789,7 @@ <translation id="3060379269883947824">Povoliť počúvanie vybraného textu</translation> <translation id="3060952009917586498">Zmeňte jazyk zariadenia. Aktuálne používate jazyk <ph name="LANGUAGE" />.</translation> <translation id="3065041951436100775">Spätná väzba týkajúca sa vynútene ukončenej karty</translation> +<translation id="306535478112428611">Nemôže upravovať súbory ani priečinky vo vašom zariadení</translation> <translation id="3065522099314259755">Latencia opakovania na klávesnici</translation> <translation id="3067198179881736288">Inštalovať aplikáciu?</translation> <translation id="3067198360141518313">Spustiť tento doplnok</translation> @@ -1910,6 +1925,7 @@ <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Chyba siete</translation> <translation id="3248902735035392926">Na bezpečnosti záleží. Strávte chvíľu <ph name="BEGIN_LINK" />kontrolou rozšírení<ph name="END_LINK" />.</translation> <translation id="3251759466064201842"><Nie je súčasťou certifikátu></translation> +<translation id="325238099842880997">Nastavte základné digitálne pravidlá, ktoré pomôžu deťom doma hrať, skúmať a robiť domáce úlohy</translation> <translation id="3253225298092156258">Nie je k dispozícii</translation> <translation id="3253448572569133955">Neznámy účet</translation> <translation id="3254084468305910013">{COUNT,plural, =0{Neboli nájdené žiadne problémy so zabezpečením}=1{Bol nájdený {COUNT} problém so zabezpečením}few{Boli nájdené {COUNT} problémy so zabezpečením}many{Found {COUNT} security issues}other{Bolo nájdených {COUNT} problémov so zabezpečením}}</translation> @@ -2037,6 +2053,7 @@ <translation id="3404249063913988450">Aktivovať šetrič obrazovky</translation> <translation id="3405664148539009465">Prispôsobiť písma</translation> <translation id="3405763860805964263">...</translation> +<translation id="3406290648907941085">Môže používať zariadenia virtuálnej reality a údaje</translation> <translation id="3406396172897554194">Vyhľadávanie podľa jazyka alebo názvu vstupu</translation> <translation id="3406605057700382950">&Zobraziť panel so záložkami</translation> <translation id="340671561090997290">{NUM_EXTENSIONS,plural, =1{Toto rozšírenie môže byť nebezpečné}few{Tieto rozšírenia môžu byť nebezpečné}many{Tieto rozšírenia môžu byť nebezpečné}other{Tieto rozšírenia môžu byť nebezpečné}}</translation> @@ -2201,6 +2218,7 @@ <translation id="3586806079541226322">Súbor nie je možné otvoriť</translation> <translation id="3586931643579894722">Skryť podrobnosti</translation> <translation id="3587482841069643663">Všetko</translation> +<translation id="3588790464166520201">Môže inštalovať obslužné nástroje platieb</translation> <translation id="3589766037099229847">Bol zablokovaný nezabezpečený obsah</translation> <translation id="3590194807845837023">Odomknúť profil a spustiť znova</translation> <translation id="3590295622232282437">Vstupujete do spravovanej relácie.</translation> @@ -2426,6 +2444,7 @@ <translation id="3822559385185038546">Tento proxy server je vynútený správcom</translation> <translation id="3823310065043511710">Na používanie systému Linux sa vyžaduje minimálne <ph name="INSTALL_SIZE" /> voľného priestoru.</translation> <translation id="3824621460022590830">Token registrácie zariadenia je neplatný. Kontaktujte vlastníka či správcu zariadenia. Kód chyby: <ph name="ERROR_CODE" />.</translation> +<translation id="3826071569074535339">Môže používať senzory pohybu</translation> <translation id="3826440694796503677">Váš správca zakázal pridávanie ďalších účtov Google</translation> <translation id="3827306204503227641">Pokračovať v povoľovaní doplnkov, ktoré nie sú v karanténe</translation> <translation id="3827774300009121996">&Celá obrazovka</translation> @@ -2478,6 +2497,8 @@ <translation id="3873423927483480833">Zobraziť kódy PIN</translation> <translation id="3873915545594852654">Vyskytol sa problém s ARC++.</translation> <translation id="3874164307099183178">Zapnúť Asistenta Google</translation> +<translation id="3877075909000773256">Nastavenia zdieľania nablízku v zariadení používateľa <ph name="USER_EMAIL" />, obsah sa zdieľa ako <ph name="USER_NAME" />.</translation> +<translation id="387771067039689031">Nemôže získavať prístup do vášho počítača pomocou doplnkov</translation> <translation id="3879748587602334249">Správca sťahovania</translation> <translation id="3881478300875776315">Zobraziť menej riadkov</translation> <translation id="3882165008614329320">Existujúce video z fotoaparátu alebo súboru</translation> @@ -2514,6 +2535,7 @@ <translation id="3919145445993746351">Ak chcete získať svoje rozšírenia vo všetkých počítačoch, zapnite synchronizáciu</translation> <translation id="3920504717067627103">Certifikačné politiky</translation> <translation id="392089482157167418">Povoliť funkciu ChromeVox (hlasovú spätnú väzbu)</translation> +<translation id="3920909973552939961">Môže inštalovať obslužné nástroje platieb</translation> <translation id="3923184630988645767">Spotreba dát</translation> <translation id="3923676227229836009">Táto stránka má povolené zobrazovať súbory</translation> <translation id="3924145049010392604">Meta</translation> @@ -2638,6 +2660,7 @@ <translation id="4058793769387728514">Skontrolovať dokument</translation> <translation id="406070391919917862">Aplikácie na pozadí</translation> <translation id="4061374428807229313">Ak chcete priečinok zdieľať, v aplikácii Súbory naň kliknite pravým tlačidlom a potom vyberte Zdieľať aplikáciou Parallels Desktop.</translation> +<translation id="406213378265872299">Prispôsobené správanie</translation> <translation id="4065876735068446555">Sieť, ktorú používate (<ph name="NETWORK_ID" />), môže vyžadovať, aby ste navštívili jej prihlasovaciu stránku.</translation> <translation id="4066207411788646768">Ak si chcete zobraziť dostupné tlačiarne v sieti, skontrolujte pripojenie</translation> <translation id="4068776064906523561">Uložené odtlačky prstov</translation> @@ -2785,6 +2808,7 @@ <translation id="425573743389990240">Vybíjanie batérie vo Wattoch (záporná hodnota znamená, že batéria sa nabíja)</translation> <translation id="4256316378292851214">Uložiť &video ako...</translation> <translation id="4258348331913189841">Systémy súborov</translation> +<translation id="4259388776256904261">Môže to chvíľu trvať</translation> <translation id="4260182282978351200">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný. Chcete ho odoslať na kontrolu do rozšírenej ochrany Googlu? Stláčaním klávesov Shift + F6 prejdite do oblasti panela so stiahnutými súbormi.</translation> <translation id="4263223596040212967">Skontrolujte svoje rozloženie klávesnice a skúste to znova.</translation> <translation id="4263757076580287579">Registrácia tlačiarne bola zrušená.</translation> @@ -2891,6 +2915,7 @@ <translation id="4400632832271803360">Pridržaním klávesa spúšťača prepnete správanie klávesov v hornom riadku</translation> <translation id="4400963414856942668">Kartu uložíte ako záložku kliknutím na hviezdičku</translation> <translation id="4403775189117163360">Vybrať iný priečinok</translation> +<translation id="440391631796167175">Neboli nájdené žiadne slabé heslá</translation> <translation id="4404136731284211429">Znova skontrolovať</translation> <translation id="4404843640767531781">Aplikáciu <ph name="APP_NAME" /> zablokoval tvoj rodič. Ak chceš používať túto aplikáciu, požiadaj rodiča o povolenie.</translation> <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation> @@ -2935,6 +2960,7 @@ <translation id="4450974146388585462">Diagnostikovať</translation> <translation id="4451479197788154834">Heslo máte uložené v tomto zariadení aj účte Google</translation> <translation id="4451757071857432900">Blokované na weboch, ktoré zobrazujú obťažujúce alebo zavádzajúce reklamy (odporúčané)</translation> +<translation id="4453205916657964690">Maska podsiete</translation> <translation id="4453946976636652378">Vyhľadajte v službe <ph name="SEARCH_ENGINE_NAME" /> alebo zadajte webovú adresu</translation> <translation id="4459169140545916303">Aktívne pred <ph name="DEVICE_LAST_ACTIVATED_TIME" /> dňami</translation> <translation id="4460014764210899310">Zrušiť zoskupenie</translation> @@ -2962,6 +2988,7 @@ <translation id="4481530544597605423">Nespárované zariadenia</translation> <translation id="4483049906298469269">Nepredvolenú bránu siete sa nepodarilo otestovať</translation> <translation id="4487489714832036847">Chromebooky používajú namiesto tradičného softvéru aplikácie. Získajte aplikácie na zvýšenie produktivity, zábavu a ďalšie činnosti.</translation> +<translation id="4488257340342212116">Môže používať vašu kameru</translation> <translation id="4488502501195719518">Chcete vymazať všetky údaje?</translation> <translation id="449232563137139956">Weby zvyčajne zobrazujú obrázky, aby poskytli názornú ukážku, napríklad fotku internetových obchodov alebo spravodajských článkov</translation> <translation id="4493468155686877504">Odporúčané (<ph name="INSTALL_SIZE" />)</translation> @@ -2994,6 +3021,7 @@ <translation id="4524832533047962394">Poskytnutý režim registrácie táto verzia operačného systému nepodporuje. Uistite sa, že používate najnovšiu verziu.</translation> <translation id="4527186207340858212">Chcete pre prácu vytvoriť nový profil?</translation> <translation id="452750746583162491">Skontrolovať synchronizované údaje</translation> +<translation id="4527929807707405172">Povoliť obrátené posúvanie <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="4528494169189661126">Návrh prekladu</translation> <translation id="4530494379350999373">Pôvod</translation> <translation id="4531924570968473143">Koho chcete pridať do tohto zariadenia <ph name="DEVICE_TYPE" />?</translation> @@ -3014,6 +3042,7 @@ <translation id="4545028762441890696">Ak ju chcete znova povoliť, prijmite nové povolenia:</translation> <translation id="4545759655004063573">Uloženie nie je možné z dôvodu nedostatočných oprávnení. Uložte položku inde.</translation> <translation id="4546308221697447294">Prehliadajte rýchlejšie pomocou prehliadača Google Chrome</translation> +<translation id="4546345569117159016">Pravé tlačidlo</translation> <translation id="4546692474302123343">Hlasový vstup Asistenta Google</translation> <translation id="4547659257713117923">Žiadne karty z iných zariadení</translation> <translation id="4547672827276975204">Nastaviť automaticky</translation> @@ -3073,6 +3102,7 @@ <translation id="4608500690299898628">&Nájsť...</translation> <translation id="4608520674724523647">Obrázok úspešnej registrácie</translation> <translation id="4608703838363792434"><ph name="FILE_NAME" /> má citlivý obsah</translation> +<translation id="4609987916561367134">Môže používať JavaScript</translation> <translation id="4610162781778310380">V súvislosti s doplnkom <ph name="PLUGIN_NAME" /> sa vyskytla chyba</translation> <translation id="4610637590575890427">Chceli ste prejsť na adresu <ph name="SITE" />?</translation> <translation id="4611114513649582138">Je k dispozícii dátové pripojenie</translation> @@ -3184,6 +3214,7 @@ <translation id="473775607612524610">Aktualizovať</translation> <translation id="473936925429402449">Vybrané, ďalší obsah, <ph name="CURRENT_ELEMENT" />. prvok z <ph name="TOTAL_ELEMENTS" /></translation> <translation id="4739639199548674512">Tikety</translation> +<translation id="4742334355511750246">Nemôže zobrazovať obrázky</translation> <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Ako aktualizovať aplikácie<ph name="END_LINK" /></translation> <translation id="4744981231093950366">{NUM_TABS,plural, =1{Zapnúť zvuk webu}few{Zapnúť zvuk webov}many{Zapnúť zvuk webov}other{Zapnúť zvuk webov}}</translation> <translation id="4746351372139058112">Správy</translation> @@ -3319,6 +3350,7 @@ <translation id="4908811072292128752">Otvorte novú kartu a prehliadajte dva weby súčasne</translation> <translation id="4909038193460299775">Keďže tento účet spravuje doména <ph name="DOMAIN" />, budú z tohto zariadenia vymazané vaše záložky, história, heslá a ďalšie nastavenia. Vaše údaje však zostanú uložené v účte Google a môžete ich spravovať pomocou panela <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation> <translation id="4912643508233590958">Prebudenia z nečinnosti</translation> +<translation id="4915961947098019832">Môže zobrazovať obrázky</translation> <translation id="4916542008280060967">Chcete povoliť webu upravovať súbor <ph name="FILE_NAME" />?</translation> <translation id="491691592645955587">Prepnite na bezpečný prehliadač</translation> <translation id="4917385247580444890">Silné</translation> @@ -3406,6 +3438,7 @@ <translation id="5027550639139316293">E-mailový certifikát</translation> <translation id="5027562294707732951">Pridať rozšírenie</translation> <translation id="5029568752722684782">Vymazať kópiu</translation> +<translation id="5033137252639132982">Nemôže používať senzory pohybu</translation> <translation id="5033266061063942743">Geometrické tvary</translation> <translation id="5036662165765606524">Nepovoliť žiadnym stránkam automaticky sťahovať viacero súborov súčasne</translation> <translation id="5037676449506322593">Vybrať všetko</translation> @@ -3455,6 +3488,7 @@ <translation id="5088172560898466307">Názov hostiteľského servera</translation> <translation id="5088534251099454936">Štandard PKCS #1 SHA-512 so šifrovaním RSA</translation> <translation id="5089810972385038852">Štát</translation> +<translation id="5090637338841444533">Nemôže sledovať pozíciu vašej kamery</translation> <translation id="5094721898978802975">Komunikovať so spolupracujúcimi natívnymi aplikáciami</translation> <translation id="5097002363526479830">K sieti „<ph name="NAME" />“ sa nepodarilo pripojiť: <ph name="DETAILS" /></translation> <translation id="5097649414558628673">Nástroj: <ph name="PRINT_NAME" /></translation> @@ -3763,6 +3797,7 @@ <translation id="5471768120198416576">Dobrý deň, som hlas prevodu textu na reč.</translation> <translation id="5472627187093107397">Ukladať heslá pre tento web</translation> <translation id="5473333559083690127">Opätovné zadanie nového kódu PIN</translation> +<translation id="5481273127572794904">Nemôže automaticky sťahovať viacero súborov</translation> <translation id="5481941284378890518">Pridať tlačiarne v okolí</translation> <translation id="5483785310822538350">Odvolať prístup k súborom a zariadeniam</translation> <translation id="5485080380723335835">Zariadenie <ph name="DEVICE_TYPE" /> je z bezpečnostných dôvodov uzamknuté. Ak chcete pokračovať, ručne zadajte heslo.</translation> @@ -3784,6 +3819,7 @@ <translation id="5495466433285976480">Týmto sa po nasledujúcom spustení odstránia všetci miestni používatelia, súbory, údaje a ďalšie nastavenia. Všetci používatelia sa budú musieť znova prihlásiť.</translation> <translation id="5495597166260341369">Ponechať zapnutú obrazovku</translation> <translation id="5496587651328244253">Usporiadať</translation> +<translation id="5496730470963166430">Nemôže odosielať vyskakovacie okná ani používať presmerovania</translation> <translation id="5497251278400702716">Tento súbor</translation> <translation id="5498967291577176373">Zrýchlite si písanie návrhmi mena, adresy alebo telefóneho čísla v texte</translation> <translation id="5499313591153584299">Tento súbor môže poškodiť váš počítať.</translation> @@ -3791,6 +3827,7 @@ <translation id="5500709606820808700">Kontrola bezpečnosti prebehla dnes</translation> <translation id="5501809658163361512">{COUNT,plural, =1{Nepodarilo sa prijať prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}few{Nepodarilo sa prijať prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}many{Nepodarilo sa prijať prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}other{Nepodarilo sa prijať prílohy (<ph name="ATTACHMENTS" />) zo zariadenia <ph name="DEVICE_NAME" />}}</translation> <translation id="5502500733115278303">Importované z Firefoxu</translation> +<translation id="5502915260472117187">Dieťa</translation> <translation id="5503982651688210506">Pokračovať v povolení hostiteľovi <ph name="HOST" /> používať vašu kameru aj hýbať ňou a používať mikrofón</translation> <translation id="5505264765875738116">Weby nemôžu žiadať o odosielanie upozornení</translation> <translation id="5505307013568720083">Minul sa atrament</translation> @@ -3878,6 +3915,7 @@ <translation id="5596627076506792578">Ďalšie možnosti</translation> <translation id="5600706100022181951">Aktualizácia bude stiahnutá použitím <ph name="UPDATE_SIZE_MB" /> MB mobilných dát. Chcete pokračovať?</translation> <translation id="5601503069213153581">Kód PIN</translation> +<translation id="5601823921345337195">Nemôže sa pripájať sa k zariadeniam MIDI</translation> <translation id="5602765853043467355">Vymazať záložky, históriu, heslá a ďalší obsah z tohto zariadenia</translation> <translation id="5605623530403479164">Iné vyhľadávače</translation> <translation id="5605758115928394442">Do vášho telefónu bolo odoslané upozornenie, ktorým overíte, že ste to vy.</translation> @@ -3998,6 +4036,7 @@ <translation id="5747552184818312860">Koniec platnosti</translation> <translation id="5747785204778348146">Vývojár – nestabilné</translation> <translation id="5747809636523347288">Prilepiť a prejsť na <ph name="URL" /></translation> +<translation id="5754152670305761216">Môže prehrávať chránený obsah</translation> <translation id="5756163054456765343">Centrum pomoci</translation> <translation id="5759728514498647443">Dokumenty odoslané na tlač prostredníctvom aplikácie <ph name="APP_NAME" /> môžete čítať pomocou aplikácie <ph name="APP_NAME" />.</translation> <translation id="5763751966069581670">Nenašli sa žiadne zariadenia USB</translation> @@ -4467,6 +4506,7 @@ <translation id="6295158916970320988">Všetky stránky</translation> <translation id="6295855836753816081">Ukladá sa...</translation> <translation id="6298962879096096191">Inštalácia aplikácií pre Android pomocou služby Google Play</translation> +<translation id="6300177430812514606">Nemôže dokončiť odosielanie ani prijímanie dát</translation> <translation id="630065524203833229">U&končiť</translation> <translation id="6300718114348072351">Tlačiareň <ph name="PRINTER_NAME" /> sa nepodarilo automaticky nakonfigurovať. Špecifikujte rozšírené podrobnosti o tlačiarni. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="6301076166764763868">Ak chcete oddeliť osobné prehliadanie od prehliadania používateľa <ph name="EXISTING_USER" />, vytvorte používateľovi <ph name="NEW_USER" /> nový profil</translation> @@ -4544,6 +4584,7 @@ <translation id="6390020764191254941">Presun karty do nového okna</translation> <translation id="6390799748543157332">Stránky otvorené v tomto okne sa nezobrazia v histórii prehliadača. Po zavretí všetkých otvorených okien režimu hosťa nezanechajú na počítači žiadne ďalšie stopy, ako napríklad súbory cookie. Všetky stiahnuté súbory však zostanú zachované.</translation> <translation id="6393156038355142111">Navrhnúť silné heslo</translation> +<translation id="6393550101331051049">Môže zobrazovať nezabezpečený obsah</translation> <translation id="6395423953133416962">Odosielať <ph name="BEGIN_LINK1" />informácie o systéme<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />metriky<ph name="END_LINK2" /></translation> <translation id="6396988158856674517">Zakázať webom používať senzory pohybu</translation> <translation id="6398715114293939307">Odstrániť Obchod Google Play</translation> @@ -4576,6 +4617,7 @@ <translation id="6425556984042222041">Rýchlosť prevodu textu na reč</translation> <translation id="6426200009596957090">Otvoriť nastavenia ChromeVox</translation> <translation id="642654727595919401"><ph name="DOMAIN" /> vyžaduje, aby ste zálohovali svoje údaje a toto zariadenie <ph name="DEVICE_TYPE" /> do týždňa vrátili. <ph name="LINK_BEGIN" />Zobraziť podrobnosti<ph name="LINK_END" /></translation> +<translation id="642729974267661262">Nemôže prehrávať zvuk</translation> <translation id="6428982734197629783">Obrázok sa spracúva</translation> <translation id="6429384232893414837">Chyba aktualizácie</translation> <translation id="6430814529589430811">ASCII s kódovaním Base64, jeden certifikát</translation> @@ -4604,6 +4646,7 @@ <translation id="6458701200018867744">Nepodarilo sa nahrať (<ph name="WEBRTC_LOG_UPLOAD_TIME" />).</translation> <translation id="6459488832681039634">Použiť výber na hľadanie</translation> <translation id="6459799433792303855">Aktívne okno bolo presunuté na inú obrazovku.</translation> +<translation id="6460566145397380451">Môže sa pripájať sa k zariadeniam MIDI</translation> <translation id="6460601847208524483">Nájsť ďalšie</translation> <translation id="6461170143930046705">Vyhľadávajú sa siete...</translation> <translation id="6463795194797719782">&Upraviť</translation> @@ -4635,6 +4678,7 @@ <translation id="6499681088828539489">Zákaz proxy serverov pre zdieľané siete</translation> <translation id="650266656685499220">Ak chcete vytvoriť albumy, prejdite do Fotiek Google</translation> <translation id="6503077044568424649">Najnavštevovanejšie</translation> +<translation id="650457560773015827">Ľavé tlačidlo</translation> <translation id="6504611359718185067">Ak chcete pridať tlačiareň, pripojte sa k internetu</translation> <translation id="6506374932220792071">Podpis X9.62 ECDSA s SHA-256</translation> <translation id="6508248480704296122">Podobné ako <ph name="NAME_PH" /></translation> @@ -4836,6 +4880,7 @@ <translation id="676560328519657314">Vaše spôsoby platby v službe Google Pay</translation> <translation id="6767566652486411142">Vybrať iný jazyk…</translation> <translation id="6767639283522617719">Nepodarilo sa pripojiť k doméne. Skontrolujte, či sú nastavenia organizačnej jednotky správne.</translation> +<translation id="6768034047581882264">Nemôže zobrazovať nezabezpečený obsah</translation> <translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> odporúča, aby ste toto zariadenie aktualizovali.</translation> <translation id="6769712124046837540">Pridáva sa tlačiareň...</translation> <translation id="6770602306803890733">Zvyšuje zabezpečenie pre vás aj ostatných na internete</translation> @@ -4927,6 +4972,7 @@ <translation id="6865313869410766144">Dáta automatického dopĺňania formulárov</translation> <translation id="6865598234501509159">Stránka nie je v jazyku <ph name="LANGUAGE" /></translation> <translation id="6865708901122695652">Denníky udalostí WebRTC (<ph name="WEBRTC_EVENT_LOG_COUNT" />)</translation> +<translation id="686609795364435700">Tiché</translation> <translation id="686664946474413495">Teplota farieb</translation> <translation id="6868934826811377550">Zobraziť podrobnosti</translation> <translation id="6871644448911473373">Odpovedajúce zariadenie OCSP: <ph name="LOCATION" /></translation> @@ -4976,6 +5022,7 @@ <translation id="6922745772873733498">Ak chcete tlačiť, zadajte PIN</translation> <translation id="6923132443355966645">Posunúť/kliknúť</translation> <translation id="6923633482430812883">Pri pripájaní zdieľaného súboru sa vyskytla chyba. Skontrolujte, či server, ku ktorému sa pripájate, podporuje protokol SMBv2 alebo novší.</translation> +<translation id="6929126689972602640">Rodičovská kontrola nie je podporovaná v prípade školských účtov. Ak chcete pridať školský účet, aby ste mali doma prístup k Učebni Google a ďalším webom s domácimi úlohami, prihláste sa najprv osobným účtom dieťaťa. Školský účet môžete pridať neskôr v nastaveniach.</translation> <translation id="6929760895658557216">Ok Google</translation> <translation id="6930036377490597025">Externý bezpečnostný kľúč alebo vstavaný senzor</translation> <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Rozšírenie bolo odmietnuté}few{# rozšírenia boli odmietnuté}many{# extensions have been rejected}other{# rozšírení bolo odmietnutých}}</translation> @@ -5016,6 +5063,7 @@ <translation id="6972629891077993081">Zariadenia HID</translation> <translation id="6972754398087986839">Začať</translation> <translation id="6972887130317925583">Prelomené heslo ste úspešne zmenili. Heslá si môžete kedykoľvek skontrolovať v sekcii <ph name="SETTINGS" />.</translation> +<translation id="697312151395002334">Môže odosielať vyskakovacie okná a používať presmerovania</translation> <translation id="6973611239564315524">K dispozícii je inovácia na verziu Debian 10 (Buster)</translation> <translation id="6974609594866392343">Offline režim ukážky</translation> <translation id="6977381486153291903">Revízia firmvéru</translation> @@ -5038,6 +5086,7 @@ <translation id="6995899638241819463">Upozorňovať pri prezradení hesiel v rámci porušenia ochrany údajov</translation> <translation id="6997642619627518301"><ph name="NAME_PH" /> – denník aktivít</translation> <translation id="6997707937646349884">V zariadeniach:</translation> +<translation id="6998093258894828179">Skryť karty</translation> <translation id="6998793565256476099">Zaregistrovať zariadenie na videokonferencie</translation> <translation id="6999956497249459195">Nová skupina</translation> <translation id="7000206553895739324">Tlačiareň <ph name="PRINTER_NAME" /> je pripojená, ale je potrebné ju nakonfigurovať</translation> @@ -5054,6 +5103,7 @@ <translation id="7005848115657603926">Neplatný rozsah stránok, použite formát <ph name="EXAMPLE_PAGE_RANGE" /></translation> <translation id="7006634003215061422">Dolný okraj</translation> <translation id="7007648447224463482">Otvoriť všetky v novom okne</translation> +<translation id="7009709314043432820"><ph name="APP_NAME" /> používa vašu kameru</translation> <translation id="701080569351381435">Zobraziť zdrojový kód</translation> <translation id="7014174261166285193">Inštalácia zlyhala.</translation> <translation id="7017004637493394352">Povedzte „Ok Google“ ešte raz</translation> @@ -5073,6 +5123,7 @@ <translation id="7038632520572155338">Ovládanie prepínačmi</translation> <translation id="7039326228527141150">Pristupovať k zariadením USB od dodávateľa <ph name="VENDOR_NAME" /></translation> <translation id="7039912931802252762">Karta Smart Card – prihlásenie</translation> +<translation id="7039951224110875196">Vytvoriť účet Google pre dieťa</translation> <translation id="7040230719604914234">Operátor</translation> <translation id="7043108582968290193">Hotovo. Nenašli sa žiadne nekompatibilné aplikácie.</translation> <translation id="7044124535091449260">Ďalšie informácie o prístupe k webom</translation> @@ -5144,6 +5195,7 @@ <translation id="7121362699166175603">Vymaže históriu a záznamy automatického dopĺňania v paneli s adresou. Váš účet Google môže mať ďalšie formy histórie prehliadania na adrese <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="7121438501124788993">Režim vývojára</translation> <translation id="7121728544325372695">Inteligentné pomlčky</translation> +<translation id="7123030151043029868">Môže automaticky sťahovať viacero súborov</translation> <translation id="7123360114020465152">Nepodporovaná</translation> <translation id="7125148293026877011">Odstrániť systém Crostini</translation> <translation id="7127980134843952133">História sťahovania</translation> @@ -5158,6 +5210,7 @@ <translation id="7136984461011502314">Vitajte v aplikácii <ph name="PRODUCT_NAME" /></translation> <translation id="7136993520339022828">Vyskytla sa chyba. Vyberte iné obrázky a skúste to znova.</translation> <translation id="713888829801648570">Je nám to ľúto, ale vaše heslo nemohlo byť overené, pretože ste offline</translation> +<translation id="7139627972753429585"><ph name="APP_NAME" /> používa váš mikrofón</translation> <translation id="7140928199327930795">Žiadne ďalšie dostupné zariadenia.</translation> <translation id="7141105143012495934">Prihlásenie zlyhalo, pretože podrobnosti účtu sa nepodarilo načítať. Kontaktujte svojho správcu alebo to skúste znova.</translation> <translation id="7143207342074048698">Pripája sa</translation> @@ -5297,6 +5350,7 @@ <translation id="7324297612904500502">Beta fórum</translation> <translation id="7325209047678309347">Papier je zaseknutý</translation> <translation id="7325437708553334317">Rozšírenie Vysoký kontrast</translation> +<translation id="7326004502692201767">Nastavenie tohto zariadenia <ph name="DEVICE_TYPE" /> pre dieťa</translation> <translation id="7328699668338161242">Váš Asistent už dokáže rozpoznať váš hlas</translation> <translation id="7328867076235380839">Neplatná kombinácia</translation> <translation id="7329154610228416156">Prihlásenie zlyhalo, pretože bolo nakonfigurované tak, aby použilo nezabezpečenú webovú adresu (<ph name="BLOCKED_URL" />). Kontaktuje svojho správcu.</translation> @@ -5421,6 +5475,7 @@ <translation id="7465635034594602553">Vyskytol sa problém. Počkajte niekoľko minút a aplikáciu <ph name="APP_NAME" /> znova spustite.</translation> <translation id="7465778193084373987">Netscape – webová adresa pre zrušenie certifikátu</translation> <translation id="7469894403370665791">Automaticky sa pripojiť k tejto sieti</translation> +<translation id="7470424110735398630">Môže zobrazovať vašu schránku</translation> <translation id="747114903913869239">Chyba: Nepodarilo sa dekódovať rozšírenie</translation> <translation id="7473891865547856676">Nie, ďakujem</translation> <translation id="747459581954555080">Obnoviť všetko</translation> @@ -5530,6 +5585,7 @@ <translation id="7607002721634913082">Pozastavené</translation> <translation id="7608810328871051088">Predvoľby Androidu</translation> <translation id="7609148976235050828">Pripojte sa k internetu a skúste to znova.</translation> +<translation id="7612655942094160088">Povolenie funkcií pripojeného telefónu</translation> <translation id="7614260613810441905">Pýtať sa, keď chce nejaký web upraviť súbory alebo priečinky vo vašom zariadení (odporúčané)</translation> <translation id="761530003705945209">Zálohovanie na Disk Google. Jednoducho kedykoľvek obnovte svoje údaje alebo prejdite na iné zariadenie. Záloha obsahuje dáta aplikácií. Zálohy nahrané do Googlu sú šifrované heslom vášho účtu Google.</translation> <translation id="7615365294369022248">Pri pridávaní účtu sa vyskytla chyba</translation> @@ -5648,6 +5704,7 @@ <translation id="7732111077498238432">Sieť je riadená pravidlami</translation> <translation id="7737115349420013392">Páruje sa so zariadením <ph name="DEVICE_NAME" />...</translation> <translation id="7737238973539693982">Odstrániť Linux (beta)</translation> +<translation id="7737948071472253612">Nemôže používať vašu kameru</translation> <translation id="7740996059027112821">Štandardne</translation> <translation id="7742706086992565332">Môžete nastaviť úroveň priblíženia alebo oddialenia určitých webov</translation> <translation id="774377079771918250">Vyberte, kam sa má uložiť</translation> @@ -5656,6 +5713,7 @@ <translation id="7750228210027921155">Obraz v obraze</translation> <translation id="7751260505918304024">Zobraziť všetky</translation> <translation id="7753735457098489144">Nepodarilo sa nainštalovať pre nedostatok priestoru. Uvoľníte ho odstránením súborov z úložiska zariadenia.</translation> +<translation id="7754347746598978109">Nemôže používať JavaScript</translation> <translation id="7754704193130578113">Pred každým sťahovaním sa spýtať, kam uložiť súbor</translation> <translation id="7755287808199759310">Váš rodič ho môže pre vás odblokovať</translation> <translation id="7757592200364144203">Zmeniť názov zariadenia</translation> @@ -5708,6 +5766,7 @@ <translation id="7798844538707273832">Prehliadač automaticky blokuje <ph name="PERMISSION" /></translation> <translation id="7799299114731150374">Tapeta bola úspešne nastavená</translation> <translation id="7800518121066352902">Otočiť &proti smeru hodinových ručičiek</translation> +<translation id="7802539296536804623">Nezobrazovať karty na tejto stránke</translation> <translation id="780301667611848630">Nie, ďakujem</translation> <translation id="7804072833593604762">Karta je zatvorená</translation> <translation id="7805768142964895445">Stav</translation> @@ -6137,6 +6196,7 @@ <translation id="826905130698769948">Neplatný certifikát klienta</translation> <translation id="8270242299912238708">Dokumenty PDF</translation> <translation id="827097179112817503">Zobrazovať tlačidlo domovskej stránky</translation> +<translation id="8271379370373330993">Nasledujúce kroky sú určené pre rodičov. Po založení účtu môžete zariadenie <ph name="DEVICE_TYPE" /> vrátiť dieťaťu.</translation> <translation id="8272443605911821513">Ak chcete spravovať rozšírenia, kliknite v ponuke Ďalšie nástroje na možnosť Rozšírenia.</translation> <translation id="8274332263553132018">Prenášať súbor</translation> <translation id="8274924778568117936">V priebehu aktualizácie zariadenie <ph name="DEVICE_TYPE" /> nevypínajte ani nezatvárajte. Po dokončení inštalácie sa <ph name="DEVICE_TYPE" /> reštartuje.</translation> @@ -6160,6 +6220,7 @@ <translation id="8300011035382349091">Upraviť záložku pre túto kartu</translation> <translation id="8300374739238450534">Polnočná modrá</translation> <translation id="8300849813060516376">Zlyhanie služby OTASP</translation> +<translation id="8304383784961451596">Nemáte oprávnenie používať toto zariadenie. Požiadajte správcu o povolenie na prihlásenie alebo sa prihláste účtom Google pod dohľadom aplikácie Family Link.</translation> <translation id="8308179586020895837">Opýtať sa, ak chcú stránky <ph name="HOST" /> pristupovať ku kamere</translation> <translation id="830868413617744215">Beta</translation> <translation id="8309458809024885768">Certifikát už existuje</translation> @@ -6173,6 +6234,7 @@ <translation id="8322814362483282060">Táto stránka má zablokovaný prístup k mikrofónu.</translation> <translation id="8323167517179506834">Zadajte webovú adresu</translation> <translation id="8324784016256120271">Weby si môžu na základe súborov cookie zobraziť vašu históriu prehliadania v rámci rôznych webov (napríklad na prispôsobenie reklám)</translation> +<translation id="8325413836429495820">Nemôže zobrazovať vašu schránku</translation> <translation id="8326478304147373412">Štandard PKCS #7, certifikačná reťaz</translation> <translation id="8327039559959785305">Pri pripájaní súborov systému Linux sa vyskytla chyba. Skúste to znova.</translation> <translation id="8327676037044516220">Povolenia a nastavenia obsahu</translation> @@ -6222,6 +6284,7 @@ <translation id="8382913212082956454">Kopírovať &e-mailovú adresu</translation> <translation id="8386091599636877289">Pravidlo sa nenašlo.</translation> <translation id="8386903983509584791">Vyhľadávanie bolo dokončené</translation> +<translation id="8387361103813440603">Nemôže zobrazovať vašu polohu</translation> <translation id="8389416080014625855">Vytvoriť QR kód pre túto stránku</translation> <translation id="8389492867173948260">Umožniť tomuto rozšíreniu čítať a meniť všetky dáta na navštevovaných weboch:</translation> <translation id="8390449457866780408">Server je nedostupný.</translation> @@ -6408,6 +6471,7 @@ <translation id="8621866727807194849">V počítači máte škodlivý softvér. Chrome ho odstráni, obnoví nastavenia a deaktivuje rozšírenia. Prehliadač bude vďaka tomu znova normálne fungovať.</translation> <translation id="8621979332865976405">Zdieľanie celej obrazovky</translation> <translation id="862542460444371744">&Rozšírenia</translation> +<translation id="8625663000550647058">Nemôže používať váš mikrofón</translation> <translation id="862727964348362408">Pozastavené</translation> <translation id="862750493060684461">Vyrovnávacia pamäť CSS</translation> <translation id="8627706565932943526">Chyba synchronizácie</translation> @@ -6488,6 +6552,7 @@ <translation id="8714838604780058252">Grafika na pozadí</translation> <translation id="8715480913140015283">Karta na pozadí používa váš fotoaparát</translation> <translation id="8716931980467311658">Chcete odstrániť všetky aplikácie pre Linux a príslušné dáta v priečinku súborov systému Linux z tohto zariadenia <ph name="DEVICE_TYPE" />?</translation> +<translation id="8717145295869185525">Nemôže používať zariadenia virtuálnej reality a údaje</translation> <translation id="8717864919010420084">Kopírovať odkaz</translation> <translation id="8719472795285728850">Počúvajú sa aktivity rozšírenia…</translation> <translation id="8719653885894320876">Doplnok <ph name="PLUGIN_NAME" /> sa nepodarilo stiahnuť</translation> @@ -6909,6 +6974,7 @@ <translation id="9179734824669616955">Nastavenie systému Linux (Beta) v zariadení <ph name="DEVICE_TYPE" /></translation> <translation id="9180281769944411366">Tento proces môže trvať niekoľko minút. Spúšťa sa kontajner systému Linux.</translation> <translation id="9180380851667544951">Web môže zdieľať vašu obrazovku</translation> +<translation id="9186963452600581158">Prihlásiť sa účtom Google dieťaťa</translation> <translation id="9188732951356337132">Odosielať údaje o využití a diagnostiky. Toto zariadenie momentálne automaticky odosiela Googlu diagnostiky a údaje o používaní zariadenia a aplikácií. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie vylepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom Androidu. Ak pre dieťa aktivujete nastavenie dodatočnej aktivity na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google. <ph name="BEGIN_LINK2" />Ďalšie informácie<ph name="END_LINK2" /></translation> <translation id="9190063653747922532">L2TP/IPSec + predzdieľaný kľúč</translation> <translation id="9198090666959937775">Používanie telefónu s Androidom ako bezpečnostného kľúča</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 9a10212..d356e266e 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -926,7 +926,7 @@ <translation id="2073148037220830746">{NUM_EXTENSIONS,plural, =1{Kliko për të instaluar shtesën}other{Kliko për të instaluar këto shtesa}}</translation> <translation id="2073505299004274893">Përdor <ph name="CHARACTER_LIMIT" /> karaktere ose më pak</translation> <translation id="2075474481720804517">Bateria <ph name="BATTERY_PERCENTAGE" />%</translation> -<translation id="2075959085554270910">Të lejon të aktivizosh/çaktivizosh klikimin me trokitje dhe zvarritjen me trokitje</translation> +<translation id="2075959085554270910">Të lejon të aktivizosh/çaktivizosh "trokit për të klikuar" dhe zvarritjen me trokitje</translation> <translation id="2076269580855484719">Fshihe këtë përbërës shtesë</translation> <translation id="2076672359661571384">Mesatare (rekomandohet)</translation> <translation id="2077129598763517140">Përdor përshpejtimin e harduerit kur të jetë i mundshëm</translation> @@ -2732,7 +2732,7 @@ <translation id="4184885522552335684">Zvarrite një ekran për ta lëvizur</translation> <translation id="4187424053537113647"><ph name="APP_NAME" /> po konfigurohet...</translation> <translation id="4190828427319282529">Thekso fokusin e tastierës</translation> -<translation id="4194570336751258953">Aktivizo klikimin me trokitje</translation> +<translation id="4194570336751258953">Aktivizo "trokit për të klikuar"</translation> <translation id="4195643157523330669">Hape në një skedë të re</translation> <translation id="4195814663415092787">Vazhdo ku e ke lënë</translation> <translation id="4198146608511578238">Thjesht mbaj shtypur ikonën e Launcher për të folur me "Asistentin" tënd të Google.</translation> @@ -4881,7 +4881,7 @@ <translation id="6818198425579322765">Faqja "Gjuha në të cilën do të përkthehet"</translation> <translation id="6818802132960437751">Mbrojtje e integruar kundër viruseve</translation> <translation id="682123305478866682">Transmeto desktopin</translation> -<translation id="6823174134746916417">Trokitja për të klikuar në bllokun me prekje</translation> +<translation id="6823174134746916417">"Trokit për të klikuar" në bllokun me prekje</translation> <translation id="6823506025919456619">Duhet të identifikohesh te Chrome për të parë pajisjet e tua</translation> <translation id="6824564591481349393">Kopjo adresën e &mail-it</translation> <translation id="6824584962142919697">&Inspekto elementet</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 038195e0..5431532 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -8,6 +8,7 @@ ചില സവിശേഷതകൾ ലഭ്യമല്ലായിരിക്കാം ഒപ്പം മുൻഗണനകളിലേക്കുള്ള മാറ്റങ്ങൾ സംരക്ഷിക്കപ്പെടുന്നതുമല്ല.</translation> <translation id="1088300314857992706"><ph name="USER_EMAIL_ADDRESS" /> മുമ്പ് Chrome ഉപയോഗിച്ചിട്ടുണ്ട്</translation> +<translation id="1088654056000736875">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ നിന്ന് ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome നീക്കം ചെയ്യുന്നു...</translation> <translation id="1097330777386562916">നിങ്ങൾ Chrome-ൽ നിന്ന് പുറത്തുകടക്കുമ്പോൾ കുക്കികളും സൈറ്റ് ഡാറ്റയും മായ്ക്കുക</translation> <translation id="110877069173485804">ഇതാണ് നിങ്ങളുടെ Chrome</translation> <translation id="1125124144982679672">ആരൊക്കെയാണ് Chrome ഉപയോഗിക്കുന്നത്?</translation> @@ -18,6 +19,7 @@ <translation id="1355000804395496115">ഔദ്യോഗിക ബ്രൗസിംഗും വ്യക്തിപര ബ്രൗസിംഗും വേർതിരിക്കാനോ ഈ ഉപകരണം ഉപയോഗിക്കുന്ന വ്യത്യസ്ത ആളുകൾക്ക് വേണ്ടിയോ, Chrome-ൽ വ്യത്യസ്ത പ്രൊഫൈലുകൾ ഉപയോഗിക്കുക</translation> <translation id="137466361146087520">Google Chrome ബീറ്റ</translation> <translation id="1399397803214730675">ഈ കമ്പ്യൂട്ടറിൽ ഇപ്പോൾ തന്നെ Google Chrome-ന്റെ ഏറ്റവും പുതിയ പതിപ്പുണ്ട്. സോഫ്റ്റ്വെയർ പ്രവര്ത്തിക്കുന്നില്ലെങ്കില്, ദയവായി Google Chrome അണ്ഇന്സ്റ്റാള് ചെയ്ത് വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="140541193409212341">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താൻ Chrome നിങ്ങളുടെ കമ്പ്യൂട്ടർ പരിശോധിക്കുമ്പോൾ ഒരു പിശക് സംഭവിച്ചു</translation> <translation id="1434626383986940139">Chrome കാനറി അപ്ലിക്കേഷനുകൾ</translation> <translation id="1513277449617685876">വ്യക്തിപര അക്കൗണ്ടിലെയും <ph name="NEW_USER" /> എന്ന അക്കൗണ്ടിലെയും ബ്രൗസിംഗ് വേർതിരിക്കാൻ, Chrome-ൽ പുതിയൊരു പ്രൊഫൈൽ സൃഷ്ടിക്കുക</translation> <translation id="1553358976309200471">Chrome അപ്ഡേറ്റുചെയ്യുക</translation> @@ -59,6 +61,7 @@ <translation id="2429317896000329049">നിങ്ങളുടെ ഡൊമെയ്നിനായി സമന്വയം ലഭ്യമല്ലാത്തതിനാൽ Google Chrome-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> <translation id="2467438592969358367">നിങ്ങളുടെ പാസ്വേഡുകൾ എക്സ്പോർട്ട് ചെയ്യാൻ Google Chrome ആഗ്രഹിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്വേഡ് നൽകുക.</translation> <translation id="2485422356828889247">അണ്ഇന്സ്റ്റാള് ചെയ്യുക</translation> +<translation id="252502352004572774">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താൻ Chrome നിങ്ങളുടെ കമ്പ്യൂട്ടർ പരിശോധിക്കുന്നു...</translation> <translation id="2534507159460261402">Google Pay (Chrome-ലേക്ക് പകർത്തി)</translation> <translation id="2580411288591421699">നിലവില് പ്രവർത്തിക്കുന്ന Google Chrome പതിപ്പിന് സമാനമായത് ഇന്സ്റ്റാള് ചെയ്യാന് കഴിയില്ല. ദയവായി Google Chrome അടച്ചശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="2586406160782125153">ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ ബ്രൗസിംഗ് വിവരങ്ങൾ ഇല്ലാതാക്കും. പിന്നീട് വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation> @@ -113,10 +116,12 @@ <translation id="4050175100176540509">ഏറ്റവും പുതിയ പതിപ്പിൽ പ്രധാനപ്പെട്ട സുരക്ഷാ മെച്ചപ്പെടുത്തലുകളും പുതിയ ഫീച്ചറുകളും ലഭ്യമാണ്.</translation> <translation id="4053720452172726777">Google Chrome ഇഷ്ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക</translation> <translation id="4110895483821904099">നിങ്ങളുടെ പുതിയ Chrome പ്രൊഫൈൽ സജ്ജീകരിക്കുക</translation> +<translation id="4127976662406264741">{NUM_MINS,plural, =1{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഒരു മിനിറ്റ് മുമ്പ്.}other{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: {NUM_MINS} മിനിറ്റ് മുമ്പ്.}}</translation> <translation id="4143243756087420366">Chrome പേരും ചിത്രവും</translation> <translation id="4147555960264124640">നിങ്ങൾ ഒരു നിയന്ത്രിത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്ത് അതിന്റെ അഡ്മിനിസ്ട്രേറ്റർക്ക് നിങ്ങളുടെ Google Chrome പ്രൊഫൈലിന്റെ നിയന്ത്രണം നൽകുന്നു. നിങ്ങളുടെ ആപ്പുകൾ, ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണങ്ങൾ എന്നിവ പോലെയുള്ള Chrome ഡാറ്റ <ph name="USER_NAME" /> എന്നതുമായി ശാശ്വതമായി ബന്ധിപ്പിച്ചതായിത്തീരും. Google അക്കൗണ്ട്സ് ഡാഷ്ബോർഡ് വഴി നിങ്ങൾക്ക് ഈ ഡാറ്റ ഇല്ലാതാക്കാൻ കഴിയുമെങ്കിലും ഈ ഡാറ്റ മറ്റൊരു അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്താനാകില്ല. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ആര്ക്കൈവ് അണ്കംപ്രസ് ചെയ്യാന് ഇന്സ്റ്റാളറിന് കഴിഞ്ഞില്ല. ദയവായി Google Chrome വീണ്ടും ഡൗൺലോഡ് ചെയ്യുക.</translation> <translation id="4191857738314598978">{0,plural, =1{ഒരു ദിവസത്തിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കുക}other{# ദിവസത്തിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കുക}}</translation> +<translation id="4205362703535890467">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഇന്നലെ.</translation> <translation id="4205939740494406371">Chrome-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ <ph name="BEGIN_LINK" />നിങ്ങളുടെ Google അക്കൗണ്ടിലെ പാസ്വേഡുകൾ പരിശോധിക്കുക<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> <translation id="4251615635259297716">നിങ്ങളുടെ Chrome ഡാറ്റ ഈ അക്കൗണ്ടുമായി ലിങ്ക് ചെയ്യണോ?</translation> @@ -145,6 +150,7 @@ <translation id="4754614261631455953">Google Chrome കാനറി (mDNS-In)</translation> <translation id="4771048833395599659">ഈ ഫയൽ അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ Chrome ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="479167709087336770">Google തിരയലിൽ ഉപയോഗിക്കുന്ന അതേ സ്പെൽ ചെക്കർ ഇത് ഉപയോഗിക്കുന്നു. ബ്രൗസറിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്സ്റ്റ് Google-ന് അയയ്ക്കുന്നു. ക്രമീകരണത്തിൽ എപ്പോഴും ഈ രീതി മാറ്റാനാകും.</translation> +<translation id="4831688036548685548">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: അൽപ്പം മുമ്പ്.</translation> <translation id="4891791193823137474">പശ്ചാത്തലത്തില് Google Chrome പ്രവര്ത്തിക്കാന് അനുവദിക്കുക</translation> <translation id="4895437082222824641">പുതിയ Chrome &ടാബിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="4953650215774548573">Google Chrome-നെ നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറായി സജ്ജീകരിക്കുക</translation> @@ -160,6 +166,7 @@ <translation id="532046782124376502">മുന്നറിയിപ്പ്: നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം റെക്കോർഡ് ചെയ്യുന്നതിൽ നിന്ന് വിപുലീകരണങ്ങളെ തടയാൻ Google Chrome-ന് കഴിയില്ല. അദൃശ്യ മോഡിൽ ഈ വിപുലീകരണം പ്രവർത്തനരഹിതമാക്കാൻ, ഈ ഓപ്ഷൻ തിരഞ്ഞെടുത്തത് മാറ്റുക.</translation> <translation id="5386244825306882791">നിങ്ങൾ Chrome ആരംഭിയ്ക്കുമ്പോഴോ ഓമ്നിബോക്സിൽ നിന്ന് തിരയുമ്പോഴോ ദൃശ്യമാകുന്ന പേജും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation> <translation id="5394833366792865639">ഒരു Chrome ടാബ് പങ്കിടുക</translation> +<translation id="5409605318138185493">{NUM_DAYS,plural, =1{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഒരു ദിവസം മുമ്പ്.}other{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: {NUM_DAYS} ദിവസം മുമ്പ്.}}</translation> <translation id="5430073640787465221">നിങ്ങളുടെ മുൻഗണനാ ഫയൽ കേടായതാണ് അല്ലെങ്കിൽ അസാധുവാണ്. നിങ്ങളുടെ ക്രമീകരണം വീണ്ടെടുക്കാൻ Google Chrome-ന് കഴിയില്ല.</translation> @@ -198,6 +205,7 @@ <translation id="6750954913813541382">അക്ഷരത്തെറ്റുകൾ പരിഹരിക്കാൻ നിങ്ങൾ ബ്രൗസറിൽ ടൈപ്പ് ചെയ്യുന്ന ടെക്സ്റ്റ് Chrome Google ലേക്ക് അയയ്ക്കുന്നു</translation> <translation id="677276454032249905">എന്തായാലും Chrome-ൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="683440813066116847">mDNS ട്രാഫിക് അനുവദിക്കാൻ Google Chrome കാനറിയ്ക്കുള്ള ഇൻബൗണ്ട് റൂൾ.</translation> +<translation id="6861451385429799394">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താനുള്ള Chrome-ന്റെ പരിശോധന, <ph name="BEGIN_LINK" />നിങ്ങളുടെ അഡ്മിൻ<ph name="END_LINK" /> പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="6885412569789873916">Chrome ബീറ്റ ആപ്പുകൾ</translation> <translation id="6943584222992551122">ഈ ഉപകരണത്തിൽ നിന്ന് ഈ വ്യക്തിയുടെ ബ്രൗസിംഗ് ഡാറ്റ ഇല്ലാതാകും. ഡാറ്റ വീണ്ടെടുക്കാൻ, Chromium-ത്തിലേക്ക് <ph name="USER_EMAIL" /> ആയി സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="6967962315388095737">mDNS ട്രാഫിക് അനുവദിക്കുന്നതിന് Google Chrome ബീറ്റയ്ക്ക് വേണ്ടിയുള്ള ഇൻബൗണ്ട് റൂൾ.</translation> @@ -269,6 +277,7 @@ <translation id="8834965163890861871">പാസ്വേഡുകൾ എഡിറ്റ് ചെയ്യാൻ Google Chrome ശ്രമിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്വേഡ് ടൈപ്പ് ചെയ്യുക.</translation> <translation id="884296878221830158">നിങ്ങൾ Chrome ആരംഭിക്കുമ്പോഴോ ഹോം ബട്ടൺ ക്ലിക്ക് ചെയ്യുമ്പോഴോ ഏത് പേജാണ് കാണിക്കേണ്ടതെന്നും അത് നിയന്ത്രിയ്ക്കുന്നു.</translation> <translation id="8862326446509486874">സിസ്റ്റം തലത്തിൽ ഇന്സ്റ്റാള് ചെയ്യുന്നതിന് നിങ്ങള്ക്ക് ഉചിതമായ അവകാശങ്ങളില്ല. അഡ്മിനിസ്ട്രേറ്ററായി ഇന്സ്റ്റാളര് റണ് ചെയ്യിക്കാൻ വീണ്ടും ശ്രമിക്കൂ.</translation> +<translation id="8907906903932240086">ദോഷകരമായ സോഫ്റ്റ്വെയർ കണ്ടെത്താൻ Chrome-ന് നിങ്ങളുടെ കമ്പ്യൂട്ടർ പരിശോധിക്കാനാകും</translation> <translation id="8914504000324227558">Chrome വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="8922193594870374009"><ph name="ORIGIN" /> എന്നതിൽ നിന്ന് നിങ്ങളുടെ Android ഫോണിലേക്ക് ഒരു നമ്പർ അയയ്ക്കാൻ, രണ്ട് ഉപകരണങ്ങളിൽ നിന്നും Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="8999208279178790196">{0,plural, =0{Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}=1{Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}other{# ദിവസമായി Chrome-നൊരു അപ്ഡേറ്റ് ലഭ്യമാണ്}}</translation> @@ -276,6 +285,7 @@ <translation id="9067395829937117663">Google Chrome-ന് Windows 7 അല്ലെങ്കിൽ അതിനുശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്.</translation> <translation id="911206726377975832">നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയും ഇതോടൊപ്പം ഇല്ലാതാക്കണോ?</translation> <translation id="9138603949443464873">നിങ്ങളുടെ മാറ്റങ്ങൾ ബാധകമാക്കാൻ Chrome വീണ്ടും സമാരംഭിക്കുക</translation> +<translation id="9155112650704618965">{NUM_HOURS,plural, =1{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: ഒരു മണിക്കൂർ മുമ്പ്.}other{നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ അറിയപ്പെടുന്ന ദോഷകരമായ സോഫ്റ്റ്വെയർ Chrome കണ്ടെത്തിയില്ല. അവസാനം പരിശോധിച്ചത്: {NUM_HOURS} മണിക്കൂർ മുമ്പ്.}}</translation> <translation id="919706545465235479">സമന്വയിപ്പിക്കാൻ തുടങ്ങുന്നതിന് Chrome അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="989369509083708165">Google Chrome നിങ്ങളുടെ ഡിഫോൾട്ട് ബ്രൗസറാണ്</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 4c4f097c..9765772 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -8,6 +8,7 @@ Niektoré funkcie nemusia byť k dispozícii a zmeny vykonané v predvoľbách sa neuložia.</translation> <translation id="1088300314857992706">Účet <ph name="USER_EMAIL_ADDRESS" /> predtým používal Chrome</translation> +<translation id="1088654056000736875">Chrome odstraňuje škodlivý softvér z vášho počítača…</translation> <translation id="1097330777386562916">Po ukončení Chromu vymazať súbory cookie a údaje webov</translation> <translation id="110877069173485804">Toto je váš prehliadač Chrome</translation> <translation id="1125124144982679672">Kto používa Chrome?</translation> @@ -18,6 +19,7 @@ <translation id="1355000804395496115">Oddeľte v Chrome pracovné a osobné prehliadanie pomocou rôznych profilov, prípadne ich použite pre rôznych ľudí, ktorí toto zariadenie používajú</translation> <translation id="137466361146087520">Google Chrome beta verzie</translation> <translation id="1399397803214730675">Tento počítač už obsahuje novšiu verziu prehliadača Google Chrome. Ak softvér nefunguje, odinštalujte prehliadač Google Chrome a skúste to znova.</translation> +<translation id="140541193409212341">Počas kontroly vášho počítača Chromom s cieľom vyhľadať prípadný škodlivý softvér sa vyskytla chyba</translation> <translation id="1434626383986940139">Aplikácie Chrome Canary</translation> <translation id="1513277449617685876">Ak chcete oddeliť osobné prehliadanie od prehliadania používateľa <ph name="NEW_USER" />, vytvorte v Chrome nový profil</translation> <translation id="1553358976309200471">Aktualizovať Chrome</translation> @@ -57,6 +59,7 @@ <translation id="2429317896000329049">Prehliadaču Google Chrome sa nepodarilo synchronizovať vaše údaje, pretože možnosť synchronizácie nie je pre vašu doménu k dispozícii.</translation> <translation id="2467438592969358367">Google Chrome sa pokúša exportovať vaše heslá. Ak to chcete povoliť, zadajte heslo systému Windows.</translation> <translation id="2485422356828889247">Odinštalovať</translation> +<translation id="252502352004572774">Chrome kontroluje prítomnosť škodlivého softvéru v počítači…</translation> <translation id="2534507159460261402">Google Pay (skopírované do Chromu)</translation> <translation id="2580411288591421699">Nie je možné nainštalovať rovnakú verziu prehliadača Google Chrome, ako je aktuálne spustená verzia. Zavrite Google Chrome a skúste znova.</translation> <translation id="2586406160782125153">Táto akcia odstráni zo zariadenia údaje prehliadania. Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do Chromu ako používateľ <ph name="USER_EMAIL" />.</translation> @@ -111,10 +114,12 @@ <translation id="4050175100176540509">V najnovšej verzii sú k dispozícii dôležité vylepšenia zabezpečenia a nové funkcie.</translation> <translation id="4053720452172726777">Prispôsobiť a ovládať prehliadač Google Chrome</translation> <translation id="4110895483821904099">Nastavte si nový profil Chromu</translation> +<translation id="4127976662406264741">{NUM_MINS,plural, =1{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred minútou.}few{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_MINS} minútami.}many{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_MINS} minúty.}other{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_MINS} minútami.}}</translation> <translation id="4143243756087420366">Meno a obrázok profilu Chromu</translation> <translation id="4147555960264124640">Prihlasujete sa pomocou spravovaného účtu a jeho správcovi dávate kontrolu nad vaším profilom prehliadača Chrome. Vaše údaje prehliadača Chrome, ako sú aplikácie, záložky, história, heslá a iné nastavenia, sa natrvalo priradia k účtu <ph name="USER_NAME" />. Tieto údaje budete môcť odstrániť len pomocou panela Dashboard v Účtoch Google, ale nebudete ich môcť priradiť k inému účtu. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Inštalátor pri dekomprimovaní archívu zlyhal. Stiahnite prehliadač Google Chrome znova.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome znova spustite do jedného dňa}few{Chrome znova spustite do # dní}many{Chrome znova spustite do # dňa}other{Chrome znova spustite do # dní}}</translation> +<translation id="4205362703535890467">Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla včera.</translation> <translation id="4205939740494406371">Chrome nemôže skontrolovať heslá. Skúste to znova o 24 hodín alebo <ph name="BEGIN_LINK" />skontrolujte heslá vo svojom účte Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Odhlásiť sa z Chromu?</translation> <translation id="4251615635259297716">Chcete prepojiť údaje prehliadača Chrome s týmto účtom?</translation> @@ -143,6 +148,7 @@ <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation> <translation id="4771048833395599659">Tento súbor môže byť nebezpečný, a preto ho Chrome zablokoval.</translation> <translation id="479167709087336770">Využíva rovnaký nástroj na kontrolu pravopisu, aký sa používa vo Vyhľadávaní Google. Text zadaný do prehliadača sa odošle Googlu. Toto správanie môžete zmeniť v nastaveniach.</translation> +<translation id="4831688036548685548">Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred chvíľou.</translation> <translation id="4891791193823137474">Povoliť prehliadaču Google Chrome spustenie na pozadí</translation> <translation id="4895437082222824641">Otvoriť odkaz na novej &karte Chromu</translation> <translation id="4953650215774548573">Nastaviť Google Chrome ako predvolený prehliadač</translation> @@ -158,6 +164,7 @@ <translation id="532046782124376502">Upozornenie: Google Chrome nemôže zabrániť rozšíreniam v zaznamenávaní vašej histórie prehliadania. Ak chcete dané rozšírenie v režime inkognito zakázať, zrušte výber tejto možnosti.</translation> <translation id="5386244825306882791">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chrome alebo pri vyhľadávaní pomocou všeobecného poľa.</translation> <translation id="5394833366792865639">Zdieľanie karty Chromu</translation> +<translation id="5409605318138185493">{NUM_DAYS,plural, =1{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla včera.}few{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_DAYS} dňami.}many{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_DAYS} dňa.}other{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_DAYS} dňami.}}</translation> <translation id="5430073640787465221">Súbor predvolieb je poškodený alebo neplatný. Prehliadač Google Chrome nedokáže obnoviť vaše nastavenia.</translation> @@ -195,6 +202,7 @@ <translation id="6750954913813541382">Chrome odošle text zadaný v prehliadači Googlu s cieľom opraviť pravopisné chyby</translation> <translation id="677276454032249905">Chcete Chrome napriek tomu ukončiť?</translation> <translation id="683440813066116847">Pravidlo pre prichádzajúce prenosy pre prehliadač Google Chrome verzie Canary, ktoré povoľuje prenos dát mDNS.</translation> +<translation id="6861451385429799394"><ph name="BEGIN_LINK" />Váš správca<ph name="END_LINK" /> zakázal v Chrome kontrolu prítomnosti škodlivého softvéru</translation> <translation id="6885412569789873916">Aplikácie pre Chrome beta verzie</translation> <translation id="6943584222992551122">Dáta prehliadania tejto osoby sa odstránia z tohto zariadenia. Ak ich budete chcieť obnoviť, prihláste sa do Chromu ako <ph name="USER_EMAIL" />.</translation> <translation id="6967962315388095737">Pravidlo pre prichádzajúce prenosy pre prehliadač Google Chrome beta verzie, ktoré povoľuje prenos dát mDNS.</translation> @@ -266,6 +274,7 @@ <translation id="8834965163890861871">Google Chrome sa pokúša upraviť heslá. Ak to chcete povoliť, zadajte heslo systému Windows.</translation> <translation id="884296878221830158">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chrome alebo po kliknutí na tlačidlo Domovská stránka.</translation> <translation id="8862326446509486874">Nemáte potrebné práva na inštaláciu na úrovni systému. Skúste inštalátor spustiť znova ako správca.</translation> +<translation id="8907906903932240086">Chrome môže skontrolovať, či máte v počítači škodlivý softvér</translation> <translation id="8914504000324227558">Znova spustiť prehliadač Chrome</translation> <translation id="8922193594870374009">Ak chcete zo zariadenia <ph name="ORIGIN" /> odoslať číslo do svojho telefónu s Androidom, prihláste sa v oboch zariadeniach do Chromu.</translation> <translation id="8999208279178790196">{0,plural, =0{Je k dispozícii aktualizácia Chromu}=1{Je k dispozícii aktualizácia Chromu}few{Aktualizácia Chromu je k dispozícii už # dni}many{Aktualizácia Chromu je k dispozícii už # dňa}other{Aktualizácia Chromu je k dispozícii už # dní}}</translation> @@ -273,6 +282,7 @@ <translation id="9067395829937117663">Google Chrome vyžaduje Windows 7 alebo vyšší.</translation> <translation id="911206726377975832">Chcete tiež odstrániť svoje údaje prehliadania?</translation> <translation id="9138603949443464873">Ak chcete zmeny použiť, spustite Chrome znova</translation> +<translation id="9155112650704618965">{NUM_HOURS,plural, =1{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred hodinou.}few{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodinami.}many{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodiny.}other{Chrome nenašiel vo vašom počítači známy škodlivý softvér. Posledná kontrola prebehla pred {NUM_HOURS} hodinami.}}</translation> <translation id="919706545465235479">Ak chcete spustiť synchronizáciu, aktualizujte Chrome</translation> <translation id="989369509083708165">Google Chrome je vaším predvoleným prehliadačom</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/vr_strings.grdp b/chrome/app/vr_strings.grdp index 7d98481e..5059a31 100644 --- a/chrome/app/vr_strings.grdp +++ b/chrome/app/vr_strings.grdp
@@ -81,21 +81,6 @@ Site can use MIDI </message> </if> - <if expr="enable_arcore"> - <!-- ARCore check infobar --> - <message name="IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT" desc="Text to be displayed in the ARCore check infobar. When a WebXR page is loaded, if ARCore is needed to display AR content and it is not installed, an infobar will be shown to the user prompting them to install ARCore."> - To view augmented reality content, install ARCore - </message> - <message name="IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT" desc="Text to be displayed in the ARCore check infobar. When a WebXR page is loaded, if ARCore is needed to display AR content and the installed ARCore is not up to date to the version needed by the implementation, an infobar will be shown to the user prompting them to update ARCore."> - To view augmented reality content, update ARCore - </message> - <message name="IDS_AR_CORE_CHECK_INFOBAR_INSTALL_BUTTON" desc="Text to be displayed in the ARCore check infobar confirm button for installing."> - Install - </message> - <message name="IDS_AR_CORE_CHECK_INFOBAR_UPDATE_BUTTON" desc="Title of button that will direct the user to update an app from the market (Play Store)"> - Update - </message> - </if> <!-- VR browser --> <!-- TODO(https://crbug.com/731802): Only build these when the VR browser is supported. -->
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 7ce1812..d6d9386d 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -306,6 +306,8 @@ "component_updater/optimization_hints_component_installer.h", "component_updater/origin_trials_component_installer.cc", "component_updater/origin_trials_component_installer.h", + "component_updater/pepper_flash_component_installer.cc", + "component_updater/pepper_flash_component_installer.h", "component_updater/pnacl_component_installer.cc", "component_updater/pnacl_component_installer.h", "component_updater/recovery_component_installer.cc", @@ -2320,8 +2322,8 @@ ] if (!is_official_build) { deps += [ - "//chromeos/components/file_manager:file_manager_mojom", "//chromeos/components/file_manager:file_manager_ui", + "//chromeos/components/file_manager/mojom", "//chromeos/components/telemetry_extension_ui", "//chromeos/components/telemetry_extension_ui/mojom", ] @@ -2484,8 +2486,8 @@ "android/compositor/tab_content_manager.h", "android/consent_auditor/consent_auditor_bridge.cc", "android/content/content_utils.cc", - "android/context_menu/chrome_context_menu_populator.cc", - "android/context_menu/chrome_context_menu_populator.h", + "android/context_menu/context_menu_native_delegate_impl.cc", + "android/context_menu/context_menu_native_delegate_impl.h", "android/contextualsearch/contextual_search_context.cc", "android/contextualsearch/contextual_search_context.h", "android/contextualsearch/contextual_search_delegate.cc", @@ -5752,8 +5754,6 @@ sources += [ "browsing_data/browsing_data_flash_lso_helper.cc", "browsing_data/browsing_data_flash_lso_helper.h", - "component_updater/pepper_flash_component_installer.cc", - "component_updater/pepper_flash_component_installer.h", "metrics/plugin_metrics_provider.cc", "metrics/plugin_metrics_provider.h", "pepper_broker_infobar_delegate.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 3afcc3c..13e3faa 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1941,6 +1941,9 @@ const FeatureEntry::FeatureParam kTabbedAppOverflowMenuThreeButtonActionbarDestination[] = { {"three_button_action_bar", "destination_chip_view"}}; +const FeatureEntry::FeatureParam + kTabbedAppOverflowMenuThreeButtonAddToOption[] = { + {"three_button_action_bar", "add_to_option"}}; const FeatureEntry::FeatureVariation kTabbedAppOverflowMenuThreeButtonActionbarVariations[] = { {"(three button with action chip view)", @@ -1949,7 +1952,10 @@ {"(three button with destination chip view)", kTabbedAppOverflowMenuThreeButtonActionbarDestination, base::size(kTabbedAppOverflowMenuThreeButtonActionbarDestination), - nullptr}}; + nullptr}, + {"(three button with add to option)", + kTabbedAppOverflowMenuThreeButtonAddToOption, + base::size(kTabbedAppOverflowMenuThreeButtonAddToOption), nullptr}}; #endif // OS_ANDROID const FeatureEntry::FeatureVariation @@ -4773,10 +4779,6 @@ autofill::features::kAutofillEnableAccountWalletStorage)}, #if defined(OS_CHROMEOS) - {"enable-zero-state-suggestions", - flag_descriptions::kEnableZeroStateSuggestionsName, - flag_descriptions::kEnableZeroStateSuggestionsDescription, kOsCrOS, - FEATURE_VALUE_TYPE(app_list_features::kEnableZeroStateSuggestions)}, {"enable-zero-state-app-reinstall-suggestions", flag_descriptions::kEnableAppReinstallZeroStateName, flag_descriptions::kEnableAppReinstallZeroStateDescription, kOsCrOS,
diff --git a/chrome/browser/accessibility/accessibility_ui.cc b/chrome/browser/accessibility/accessibility_ui.cc index a651e4ed..42d79b56 100644 --- a/chrome/browser/accessibility/accessibility_ui.cc +++ b/chrome/browser/accessibility/accessibility_ui.cc
@@ -91,6 +91,8 @@ static const char kOff[] = "off"; static const char kOn[] = "on"; +using ui::AXPropertyFilter; + namespace { std::unique_ptr<base::DictionaryValue> BuildTargetDescriptor( @@ -259,20 +261,19 @@ } bool MatchesPropertyFilters( - const std::vector<content::AccessibilityTreeFormatter::PropertyFilter>& - property_filters, + const std::vector<AXPropertyFilter>& property_filters, const std::string& text) { bool allow = false; for (const auto& filter : property_filters) { if (base::MatchPattern(text, filter.match_str)) { switch (filter.type) { - case content::AccessibilityTreeFormatter::PropertyFilter::ALLOW_EMPTY: + case AXPropertyFilter::ALLOW_EMPTY: allow = true; break; - case content::AccessibilityTreeFormatter::PropertyFilter::ALLOW: + case AXPropertyFilter::ALLOW: allow = (!base::MatchPattern(text, "*=''")); break; - case content::AccessibilityTreeFormatter::PropertyFilter::DENY: + case AXPropertyFilter::DENY: allow = false; break; } @@ -284,8 +285,7 @@ std::string RecursiveDumpAXPlatformNodeAsString( ui::AXPlatformNode* node, int indent, - const std::vector<content::AccessibilityTreeFormatter::PropertyFilter>& - property_filters) { + const std::vector<AXPropertyFilter>& property_filters) { if (!node) return ""; std::string str(2 * indent, '+'); @@ -311,11 +311,9 @@ // Add property filters to the property_filters vector for the given property // filter type. The attributes are passed in as a string with each attribute // separated by a space. -void AddPropertyFilters( - std::vector<content::AccessibilityTreeFormatter::PropertyFilter>& - property_filters, - const std::string& attributes, - content::AccessibilityTreeFormatter::PropertyFilter::Type type) { +void AddPropertyFilters(std::vector<AXPropertyFilter>& property_filters, + const std::string& attributes, + AXPropertyFilter::Type type) { for (const std::string& attribute : base::SplitString( attributes, " ", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) { property_filters.emplace_back(attribute, type); @@ -565,16 +563,11 @@ // Enable AXMode to access to AX objects. ui::AXPlatformNode::NotifyAddAXModeFlags(ui::kAXModeComplete); - std::vector<content::AccessibilityTreeFormatter::PropertyFilter> - property_filters; - AddPropertyFilters( - property_filters, allow, - content::AccessibilityTreeFormatter::PropertyFilter::ALLOW); - AddPropertyFilters( - property_filters, allow_empty, - content::AccessibilityTreeFormatter::PropertyFilter::ALLOW_EMPTY); - AddPropertyFilters(property_filters, deny, - content::AccessibilityTreeFormatter::PropertyFilter::DENY); + std::vector<AXPropertyFilter> property_filters; + AddPropertyFilters(property_filters, allow, AXPropertyFilter::ALLOW); + AddPropertyFilters(property_filters, allow_empty, + AXPropertyFilter::ALLOW_EMPTY); + AddPropertyFilters(property_filters, deny, AXPropertyFilter::DENY); PrefService* pref = Profile::FromWebUI(web_ui())->GetPrefs(); bool internal = pref->GetBoolean(prefs::kShowInternalAccessibilityTree); @@ -608,16 +601,11 @@ AllowJavascript(); #if !defined(OS_ANDROID) - std::vector<content::AccessibilityTreeFormatter::PropertyFilter> - property_filters; - AddPropertyFilters( - property_filters, allow, - content::AccessibilityTreeFormatter::PropertyFilter::ALLOW); - AddPropertyFilters( - property_filters, allow_empty, - content::AccessibilityTreeFormatter::PropertyFilter::ALLOW_EMPTY); - AddPropertyFilters(property_filters, deny, - content::AccessibilityTreeFormatter::PropertyFilter::DENY); + std::vector<AXPropertyFilter> property_filters; + AddPropertyFilters(property_filters, allow, AXPropertyFilter::ALLOW); + AddPropertyFilters(property_filters, allow_empty, + AXPropertyFilter::ALLOW_EMPTY); + AddPropertyFilters(property_filters, deny, AXPropertyFilter::DENY); for (Browser* browser : *BrowserList::GetInstance()) { if (browser->session_id().id() == session_id) {
diff --git a/chrome/browser/android/context_menu/chrome_context_menu_populator.cc b/chrome/browser/android/context_menu/context_menu_native_delegate_impl.cc similarity index 77% rename from chrome/browser/android/context_menu/chrome_context_menu_populator.cc rename to chrome/browser/android/context_menu/context_menu_native_delegate_impl.cc index 7ad1d3f7c..6c3e2ed96 100644 --- a/chrome/browser/android/context_menu/chrome_context_menu_populator.cc +++ b/chrome/browser/android/context_menu/context_menu_native_delegate_impl.cc
@@ -2,37 +2,30 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/context_menu/chrome_context_menu_populator.h" +#include "chrome/browser/android/context_menu/context_menu_native_delegate_impl.h" #include "base/android/callback_android.h" -#include "base/android/jni_android.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/strings/string_util.h" -#include "chrome/android/chrome_jni_headers/ChromeContextMenuPopulator_jni.h" +#include "chrome/browser/contextmenu/jni_headers/ContextMenuNativeDelegateImpl_jni.h" #include "chrome/browser/download/android/download_controller_base.h" #include "chrome/browser/image_decoder/image_decoder.h" #include "chrome/browser/ui/tab_contents/core_tab_helper.h" #include "components/embedder_support/android/contextmenu/context_menu_builder.h" -#include "content/public/browser/context_menu_params.h" -#include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "ui/gfx/android/java_bitmap.h" -#include "ui/gfx/geometry/size.h" using base::android::JavaParamRef; using base::android::JavaRef; namespace { -class ContextMenuPopulatorImageRequest : public ImageDecoder::ImageRequest { +class ContextMenuImageRequest : public ImageDecoder::ImageRequest { public: static void Start(const JavaRef<jobject>& jcallback, const std::vector<uint8_t>& thumbnail_data) { - auto* request = new ContextMenuPopulatorImageRequest(jcallback); + auto* request = new ContextMenuImageRequest(jcallback); ImageDecoder::Start(request, thumbnail_data); } @@ -50,12 +43,12 @@ } private: - explicit ContextMenuPopulatorImageRequest(const JavaRef<jobject>& jcallback) + explicit ContextMenuImageRequest(const JavaRef<jobject>& jcallback) : jcallback_(jcallback) {} const base::android::ScopedJavaGlobalRef<jobject> jcallback_; - DISALLOW_IMPLICIT_CONSTRUCTORS(ContextMenuPopulatorImageRequest); + DISALLOW_IMPLICIT_CONSTRUCTORS(ContextMenuImageRequest); }; chrome::mojom::ImageFormat ToChromeMojomImageFormat(int image_format) { @@ -85,7 +78,7 @@ auto j_extension = base::android::ConvertUTF8ToJavaString(env, image_extension); base::android::RunObjectCallbackAndroid( - jcallback, Java_ChromeContextMenuPopulator_createImageCallbackResult( + jcallback, Java_ContextMenuNativeDelegateImpl_createImageCallbackResult( env, j_data, j_extension)); } @@ -96,20 +89,20 @@ const std::vector<uint8_t>& thumbnail_data, const gfx::Size& original_size, const std::string& filename_extension) { - ContextMenuPopulatorImageRequest::Start(jcallback, thumbnail_data); + ContextMenuImageRequest::Start(jcallback, thumbnail_data); } } // namespace -ChromeContextMenuPopulator::ChromeContextMenuPopulator( - content::WebContents* web_contents, - content::ContextMenuParams* context_menu_params, - content::RenderFrameHost* render_frame_host) +ContextMenuNativeDelegateImpl::ContextMenuNativeDelegateImpl( + content::WebContents* const web_contents, + content::ContextMenuParams* const context_menu_params, + content::RenderFrameHost* const render_frame_host) : web_contents_(web_contents), context_menu_params_(context_menu_params), render_frame_host_(render_frame_host) {} -void ChromeContextMenuPopulator::OnStartDownload( +void ContextMenuNativeDelegateImpl::StartDownload( JNIEnv* env, const JavaParamRef<jobject>& obj, jboolean jis_link) { @@ -118,7 +111,7 @@ *context_menu_params_, web_contents_, jis_link, headers); } -void ChromeContextMenuPopulator::SearchForImage( +void ContextMenuNativeDelegateImpl::SearchForImage( JNIEnv* env, const JavaParamRef<jobject>& obj) { if (!render_frame_host_) @@ -129,19 +122,19 @@ context_menu_params_->src_url); } -void ChromeContextMenuPopulator::RetrieveImageForShare( +void ContextMenuNativeDelegateImpl::RetrieveImageForShare( JNIEnv* env, const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& jcallback, jint max_width_px, jint max_height_px, - jint j_image_format) { + jint jimage_format) { RetrieveImageInternal(env, base::BindOnce(&OnRetrieveImageForShare), jcallback, max_width_px, max_height_px, - ToChromeMojomImageFormat(j_image_format)); + ToChromeMojomImageFormat(jimage_format)); } -void ChromeContextMenuPopulator::RetrieveImageForContextMenu( +void ContextMenuNativeDelegateImpl::RetrieveImageForContextMenu( JNIEnv* env, const JavaParamRef<jobject>& obj, const JavaParamRef<jobject>& jcallback, @@ -153,7 +146,7 @@ chrome::mojom::ImageFormat::PNG); } -void ChromeContextMenuPopulator::RetrieveImageInternal( +void ContextMenuNativeDelegateImpl::RetrieveImageInternal( JNIEnv* env, ImageRetrieveCallback retrieve_callback, const JavaParamRef<jobject>& jcallback, @@ -177,7 +170,7 @@ base::android::ScopedJavaGlobalRef<jobject>(env, jcallback))); } -static jlong JNI_ChromeContextMenuPopulator_Init( +static jlong JNI_ContextMenuNativeDelegateImpl_Init( JNIEnv* env, const JavaParamRef<jobject>& jweb_contents, const JavaParamRef<jobject>& jcontext_menu_params, @@ -190,6 +183,6 @@ context_menu::ContextMenuParamsFromJavaObject(jcontext_menu_params); auto* render_frame_host = content::RenderFrameHost::FromJavaRenderFrameHost(jrender_frame_host); - return reinterpret_cast<intptr_t>( - new ChromeContextMenuPopulator(web_contents, params, render_frame_host)); + return reinterpret_cast<intptr_t>(new ContextMenuNativeDelegateImpl( + web_contents, params, render_frame_host)); }
diff --git a/chrome/browser/android/context_menu/chrome_context_menu_populator.h b/chrome/browser/android/context_menu/context_menu_native_delegate_impl.h similarity index 75% rename from chrome/browser/android/context_menu/chrome_context_menu_populator.h rename to chrome/browser/android/context_menu/context_menu_native_delegate_impl.h index a989aa7..88fb5b0 100644 --- a/chrome/browser/android/context_menu/chrome_context_menu_populator.h +++ b/chrome/browser/android/context_menu/context_menu_native_delegate_impl.h
@@ -2,11 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_CONTEXT_MENU_CHROME_CONTEXT_MENU_POPULATOR_H_ -#define CHROME_BROWSER_ANDROID_CONTEXT_MENU_CHROME_CONTEXT_MENU_POPULATOR_H_ +#ifndef CHROME_BROWSER_ANDROID_CONTEXT_MENU_CONTEXT_MENU_NATIVE_DELEGATE_IMPL_H_ +#define CHROME_BROWSER_ANDROID_CONTEXT_MENU_CONTEXT_MENU_NATIVE_DELEGATE_IMPL_H_ -#include "base/android/jni_android.h" -#include "base/android/scoped_java_ref.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "content/public/browser/context_menu_params.h" #include "content/public/browser/render_frame_host.h" @@ -16,8 +14,6 @@ class WebContents; } -class ImageRetrieveCallback; - // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.contextmenu enum ContextMenuImageFormat { JPEG = 0, @@ -25,8 +21,32 @@ ORIGINAL = 2, }; -// Performs context menu-related actions. -class ChromeContextMenuPopulator { +class ContextMenuNativeDelegateImpl { + public: + explicit ContextMenuNativeDelegateImpl( + content::WebContents* const web_contents, + content::ContextMenuParams* const context_menu_params, + content::RenderFrameHost* const render_frame_host); + + void RetrieveImageForContextMenu( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& jcallback, + jint max_width_px, + jint max_height_px); + void RetrieveImageForShare( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + const base::android::JavaParamRef<jobject>& jcallback, + jint max_width_px, + jint max_height_px, + jint j_image_type); + void StartDownload(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj, + jboolean jis_link); + void SearchForImage(JNIEnv* env, + const base::android::JavaParamRef<jobject>& obj); + protected: using ImageRetrieveCallback = base::OnceCallback<void( mojo::AssociatedRemote<chrome::mojom::ChromeRenderFrame> @@ -36,32 +56,6 @@ const gfx::Size& max_dimen_px, const std::string& image_extension)>; - public: - explicit ChromeContextMenuPopulator( - content::WebContents* const web_contents, - content::ContextMenuParams* context_menu_params, - content::RenderFrameHost* const render_frame_host); - - void OnStartDownload( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - jboolean jis_link); - void SearchForImage(JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj); - void RetrieveImageForShare( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jobject>& jcallback, - jint max_width_px, - jint max_height_px, - jint j_image_type); - void RetrieveImageForContextMenu( - JNIEnv* env, - const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jobject>& jcallback, - jint max_width_px, - jint max_height_px); - private: void RetrieveImageInternal( JNIEnv* env, @@ -76,4 +70,4 @@ content::RenderFrameHost* const render_frame_host_; }; -#endif // CHROME_BROWSER_ANDROID_CONTEXT_MENU_CHROME_CONTEXT_MENU_POPULATOR_H_ +#endif // CHROME_BROWSER_ANDROID_CONTEXT_MENU_CONTEXT_MENU_NATIVE_DELEGATE_IMPL_H_
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h index 095d3239..aaa72bb 100644 --- a/chrome/browser/android/resource_id.h +++ b/chrome/browser/android/resource_id.h
@@ -46,9 +46,6 @@ LINK_RESOURCE_ID(IDR_AUTOFILL_GOOGLE_PAY_WITH_DIVIDER, R.drawable.google_pay_with_divider) -DECLARE_RESOURCE_ID(IDR_ERROR_OUTLINE_GOOGBLUE_24DP, - R.drawable.ic_error_outline_googblue_24dp) - // Autofill popup and keyboard accessory images. // We use Android's |VectorDrawableCompat| for the following images that are // displayed using |DropdownAdapter|.
diff --git a/chrome/browser/android/resource_mapper.cc b/chrome/browser/android/resource_mapper.cc index 30b41b0..6dbaec4f 100644 --- a/chrome/browser/android/resource_mapper.cc +++ b/chrome/browser/android/resource_mapper.cc
@@ -58,6 +58,7 @@ #include "components/resources/android/page_info_resource_id.h" #include "components/resources/android/permissions_resource_id.h" #include "components/resources/android/sms_resource_id.h" +#include "components/resources/android/webxr_resource_id.h" #undef LINK_RESOURCE_ID #undef DECLARE_RESOURCE_ID // Make sure ID list sizes match up.
diff --git a/chrome/browser/android/vr/BUILD.gn b/chrome/browser/android/vr/BUILD.gn index 39d4b10d..3fb5f2e 100644 --- a/chrome/browser/android/vr/BUILD.gn +++ b/chrome/browser/android/vr/BUILD.gn
@@ -61,16 +61,13 @@ "vr_shell_delegate.h", "vrcore_install_helper.cc", "vrcore_install_helper.h", - "xr_install_infobar.cc", - "xr_install_infobar.h", ] if (enable_arcore) { sources += [ "arcore_device/arcore_device_provider.cc", "arcore_device/arcore_device_provider.h", - "arcore_device/arcore_install_helper.cc", - "arcore_device/arcore_install_helper.h", + "arcore_device/arcore_device_utils.cc", "arcore_device/arcore_java_utils.cc", "arcore_device/arcore_java_utils.h", "chrome_arcore_install_helper.cc", @@ -89,7 +86,6 @@ "//chrome/common:constants", "//components/browser_ui/util/android", "//components/content_settings/core/browser", - "//components/infobars/core", "//components/language/core/browser", "//components/omnibox/browser", "//components/page_info", @@ -97,6 +93,7 @@ "//components/rappor", "//components/search_engines:search_engines", "//components/webxr:webxr", + "//components/webxr/android", "//content/public/browser", "//content/public/common", "//device/vr", @@ -178,20 +175,10 @@ } } -android_library("ar_java") { - deps = [ - "//base:base_java", - "//chrome/android:chrome_java", - "//third_party/arcore-android-sdk-client:com_google_ar_core_java", - ] - - sources = [ "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java" ] -} - if (enable_arcore) { generate_jni("ar_jni_headers") { sources = [ - "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java", + "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreDeviceUtils.java", "//chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java", ] }
diff --git a/chrome/browser/android/vr/arcore_device/arcore_device_utils.cc b/chrome/browser/android/vr/arcore_device/arcore_device_utils.cc new file mode 100644 index 0000000..6b2dad95 --- /dev/null +++ b/chrome/browser/android/vr/arcore_device/arcore_device_utils.cc
@@ -0,0 +1,38 @@ +// Copyright 2020 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. + +#include <memory> + +#include "chrome/browser/android/vr/ar_jni_headers/ArCoreDeviceUtils_jni.h" +#include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h" +#include "device/vr/android/arcore/arcore_device_provider_factory.h" + +namespace vr { + +namespace { +class ArCoreDeviceProviderFactoryImpl + : public device::ArCoreDeviceProviderFactory { + public: + ArCoreDeviceProviderFactoryImpl() = default; + ~ArCoreDeviceProviderFactoryImpl() override = default; + std::unique_ptr<device::VRDeviceProvider> CreateDeviceProvider() override; + + private: + DISALLOW_COPY_AND_ASSIGN(ArCoreDeviceProviderFactoryImpl); +}; + +std::unique_ptr<device::VRDeviceProvider> +ArCoreDeviceProviderFactoryImpl::CreateDeviceProvider() { + return std::make_unique<device::ArCoreDeviceProvider>(); +} + +} // namespace + +static void JNI_ArCoreDeviceUtils_InstallArCoreDeviceProviderFactory( + JNIEnv* env) { + device::ArCoreDeviceProviderFactory::Install( + std::make_unique<ArCoreDeviceProviderFactoryImpl>()); +} + +} // namespace vr
diff --git a/chrome/browser/android/vr/chrome_arcore_install_helper.cc b/chrome/browser/android/vr/chrome_arcore_install_helper.cc index db41d65c..711467d 100644 --- a/chrome/browser/android/vr/chrome_arcore_install_helper.cc +++ b/chrome/browser/android/vr/chrome_arcore_install_helper.cc
@@ -5,8 +5,8 @@ #include "chrome/browser/android/vr/chrome_arcore_install_helper.h" #include "chrome/browser/android/vr/android_vr_utils.h" -#include "chrome/browser/android/vr/arcore_device/arcore_install_helper.h" #include "chrome/browser/infobars/infobar_service.h" +#include "components/webxr/android/arcore_install_helper.h" using base::android::AttachCurrentThread;
diff --git a/chrome/browser/android/vr/chrome_arcore_install_helper.h b/chrome/browser/android/vr/chrome_arcore_install_helper.h index 4d8afc9..4e95f73 100644 --- a/chrome/browser/android/vr/chrome_arcore_install_helper.h +++ b/chrome/browser/android/vr/chrome_arcore_install_helper.h
@@ -6,8 +6,8 @@ #define CHROME_BROWSER_ANDROID_VR_CHROME_ARCORE_INSTALL_HELPER_H_ #include "base/callback.h" -#include "chrome/browser/android/vr/arcore_device/arcore_install_helper.h" #include "chrome/browser/vr/vr_export.h" +#include "components/webxr/android/arcore_install_helper.h" #include "content/public/browser/xr_install_helper.h" namespace vr { @@ -29,7 +29,7 @@ base::OnceCallback<void(bool)> install_callback) override; private: - ArCoreInstallHelper arcore_install_helper_; + webxr::ArCoreInstallHelper arcore_install_helper_; }; } // namespace vr
diff --git a/chrome/browser/android/vr/gvr_scheduler_delegate.cc b/chrome/browser/android/vr/gvr_scheduler_delegate.cc index dd2f613..a7ed985e 100644 --- a/chrome/browser/android/vr/gvr_scheduler_delegate.cc +++ b/chrome/browser/android/vr/gvr_scheduler_delegate.cc
@@ -211,15 +211,22 @@ session->data_provider = frame_data_receiver_.BindNewPipeAndPassRemote(); session->submit_frame_sink = std::move(submit_frame_sink); session->display_info = std::move(display_info); - session->supports_viewport_scaling = true; + + session->device_config = device::mojom::XRSessionDeviceConfig::New(); + auto* config = session->device_config.get(); + + config->supports_viewport_scaling = true; + session->enviroment_blend_mode = + device::mojom::XREnvironmentBlendMode::kOpaque; + session->interaction_mode = device::mojom::XRInteractionMode::kScreenSpace; // This scalar will be applied in the renderer to the recommended render // target sizes. For WebVR it will always be applied, for WebXR it can be // overridden. if (base::AndroidHardwareBufferCompat::IsSupportAvailable()) { - session->default_framebuffer_scale = kRecommendedResolutionScale; + config->default_framebuffer_scale = kRecommendedResolutionScale; } else { - session->default_framebuffer_scale = kNoSharedBufferResolutionScale; + config->default_framebuffer_scale = kNoSharedBufferResolutionScale; } if (CanSendWebXrVSync())
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc b/chrome/browser/android/webapps/add_to_homescreen_mediator.cc index 68e17a69d..bc1d848b 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc +++ b/chrome/browser/android/webapps/add_to_homescreen_mediator.cc
@@ -16,7 +16,10 @@ #include "chrome/browser/banners/app_banner_manager_android.h" #include "chrome/browser/banners/app_banner_metrics.h" #include "chrome/browser/banners/app_banner_settings_helper.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/installable/installable_metrics.h" +#include "components/feature_engagement/public/event_constants.h" +#include "components/feature_engagement/public/tracker.h" #include "components/url_formatter/elide_url.h" #include "content/public/browser/web_contents.h" #include "ui/gfx/android/java_bitmap.h" @@ -209,6 +212,14 @@ } UMA_HISTOGRAM_ENUMERATION("Webapp.AddToHomescreenMediator.AppTypeToMenuEntry", entry, AppTypeToMenuEntry::kAppTypeFinalEntry); + + if (is_webapk) { + DVLOG(2) << "Sending event: IPH used for Installing PWA"; + feature_engagement::Tracker* tracker = + feature_engagement::TrackerFactory::GetForBrowserContext( + data_fetcher_->web_contents()->GetBrowserContext()); + tracker->NotifyEvent(feature_engagement::events::kPwaInstallMenuSelected); + } } void AddToHomescreenMediator::RecordEventForAppMenu(
diff --git a/chrome/browser/banners/app_banner_manager_android.cc b/chrome/browser/banners/app_banner_manager_android.cc index b5b72ad..7e04d1d2 100644 --- a/chrome/browser/banners/app_banner_manager_android.cc +++ b/chrome/browser/banners/app_banner_manager_android.cc
@@ -8,6 +8,7 @@ #include "base/android/jni_string.h" #include "base/bind.h" #include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" #include "base/optional.h" #include "base/strings/string16.h" #include "base/strings/string_util.h" @@ -24,10 +25,14 @@ #include "chrome/browser/android/webapps/add_to_homescreen_params.h" #include "chrome/browser/banners/app_banner_metrics.h" #include "chrome/browser/banners/app_banner_settings_helper.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/installable/installable_metrics.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_features.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/public/tracker.h" #include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar_delegate.h" #include "components/version_info/channel.h" @@ -44,6 +49,14 @@ constexpr char kPlatformPlay[] = "play"; +// The key to look up what the minimum engagement score is for showing the +// in-product help. +constexpr char kMinEngagementForIphKey[] = "x_min_engagement_for_iph"; + +// The key to look up whether the in-product help should replace the toolbar or +// complement it. +constexpr char kIphReplacesToolbar[] = "x_iph_replaces_toolbar"; + // Whether to ignore the Chrome channel in QueryNativeApp() for testing. bool gIgnoreChromeChannelForTesting = false; @@ -457,7 +470,52 @@ return native_app_title_; } +bool AppBannerManagerAndroid::MaybeShowInProductHelp() const { + if (!web_contents()) { + DVLOG(2) << "IPH for PWA aborted: null WebContents"; + return false; + } + + Profile* profile = + Profile::FromBrowserContext(web_contents()->GetBrowserContext()); + if (!profile) { + DVLOG(2) << "IPH for PWA aborted: unable to obtain profile"; + return false; + } + + double last_engagement_score = + GetSiteEngagementService()->GetScore(validated_url_); + int min_engagement = base::GetFieldTrialParamByFeatureAsInt( + feature_engagement::kIPHPwaInstallAvailableFeature, + kMinEngagementForIphKey, 0); + if (last_engagement_score < min_engagement) { + DVLOG(2) << "IPH for PWA aborted: Engagement score too low: " + << last_engagement_score << " < " << min_engagement; + return false; + } + + JNIEnv* env = base::android::AttachCurrentThread(); + std::string error_message = base::android::ConvertJavaStringToUTF8( + Java_AppBannerManager_showInProductHelp( + env, java_banner_manager_, web_contents()->GetJavaWebContents())); + if (!error_message.empty()) { + DVLOG(2) << "IPH for PWA showing aborted. " << error_message; + return false; + } + + DVLOG(2) << "Showing IPH."; + return true; +} + void AppBannerManagerAndroid::MaybeShowAmbientBadge() { + if (MaybeShowInProductHelp() && + base::GetFieldTrialParamByFeatureAsBool( + feature_engagement::kIPHPwaInstallAvailableFeature, + kIphReplacesToolbar, false)) { + DVLOG(2) << "Install infobar overridden by IPH, as per experiment."; + return; + } + if (!base::FeatureList::IsEnabled(features::kInstallableAmbientBadgeInfoBar)) return;
diff --git a/chrome/browser/banners/app_banner_manager_android.h b/chrome/browser/banners/app_banner_manager_android.h index 40c7d38..03e5af9d 100644 --- a/chrome/browser/banners/app_banner_manager_android.h +++ b/chrome/browser/banners/app_banner_manager_android.h
@@ -132,6 +132,11 @@ // Returns the appropriate app name based on whether we have a native/web app. base::string16 GetAppName() const override; + // Shows the in-product help if possible and returns true when a request to + // show it was made, but false if conditions (e.g. engagement score) for + // showing where not deemed adequate. + bool MaybeShowInProductHelp() const; + // Hides the ambient badge if it is showing. void HideAmbientBadge();
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index 10d942ea..175d53f 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -196,11 +196,11 @@ #endif #if defined(OS_CHROMEOS) && !defined(OFFICIAL_BUILD) -#include "chromeos/components/file_manager/file_manager.mojom.h" #include "chromeos/components/file_manager/file_manager_ui.h" +#include "chromeos/components/file_manager/mojom/file_manager.mojom.h" #include "chromeos/components/telemetry_extension_ui/mojom/diagnostics_service.mojom.h" // nogncheck crbug.com/1125897 #include "chromeos/components/telemetry_extension_ui/mojom/probe_service.mojom.h" // nogncheck crbug.com/1125897 -#include "chromeos/components/telemetry_extension_ui/mojom/system_events_service.mojom.h" // nogncheck crbug.com/1125897 +#include "chromeos/components/telemetry_extension_ui/mojom/system_events_service.mojom.h" // nogncheck crbug.com/1125897 #include "chromeos/components/telemetry_extension_ui/telemetry_extension_ui.h" #endif
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 608ac5f7..660fc2d 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1685,6 +1685,8 @@ "login/screens/device_disabled_screen.h", "login/screens/discover_screen.cc", "login/screens/discover_screen.h", + "login/screens/edu_coexistence_login_screen.cc", + "login/screens/edu_coexistence_login_screen.h", "login/screens/enable_adb_sideloading_screen.cc", "login/screens/enable_adb_sideloading_screen.h", "login/screens/enable_debugging_screen.cc",
diff --git a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc index f9a1c00..dfa8471 100644 --- a/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc +++ b/chrome/browser/chromeos/android_sms/android_sms_app_setup_controller_impl.cc
@@ -21,7 +21,6 @@ #include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" #include "chrome/browser/web_applications/components/web_app_provider_base.h" -#include "chrome/common/chrome_features.h" #include "chromeos/components/multidevice/logging/logging.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/chromeos/apps/apk_web_app_installer.cc b/chrome/browser/chromeos/apps/apk_web_app_installer.cc index 7d385df..f5293ea 100644 --- a/chrome/browser/chromeos/apps/apk_web_app_installer.cc +++ b/chrome/browser/chromeos/apps/apk_web_app_installer.cc
@@ -16,7 +16,6 @@ #include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_install_utils.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" #include "content/public/browser/browser_thread.h" #include "services/data_decoder/public/cpp/decode_image.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
diff --git a/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc b/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc index 8e56bcc..2ff34da 100644 --- a/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc +++ b/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper.cc
@@ -374,6 +374,10 @@ if (node_ptr_->range_info) { out_data->AddStringAttribute(ax::mojom::StringAttribute::kValue, state_description); + } else if (GetProperty(AXBooleanProperty::CHECKABLE)) { + out_data->AddStringAttribute( + ax::mojom::StringAttribute::kCheckedStateDescription, + state_description); } else { descriptions.push_back(state_description); }
diff --git a/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc b/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc index 2f129a8..1016191 100644 --- a/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc +++ b/chrome/browser/chromeos/arc/accessibility/accessibility_node_info_data_wrapper_unittest.cc
@@ -550,6 +550,11 @@ ASSERT_FALSE( data.GetStringAttribute(ax::mojom::StringAttribute::kValue, &value)); + std::string checked_state_description; + ASSERT_FALSE(data.GetStringAttribute( + ax::mojom::StringAttribute::kCheckedStateDescription, + &checked_state_description)); + // State Description without Range Value should be stored as kDescription SetProperty(&node, AXStringProperty::STATE_DESCRIPTION, "state description"); @@ -559,6 +564,9 @@ EXPECT_EQ("state description", description); ASSERT_FALSE( data.GetStringAttribute(ax::mojom::StringAttribute::kValue, &value)); + ASSERT_FALSE(data.GetStringAttribute( + ax::mojom::StringAttribute::kCheckedStateDescription, + &checked_state_description)); // State Description with Range Value should be stored as kValue node.range_info = AXRangeInfoData::New(); @@ -569,6 +577,24 @@ ASSERT_TRUE( data.GetStringAttribute(ax::mojom::StringAttribute::kValue, &value)); EXPECT_EQ("state description", value); + ASSERT_FALSE(data.GetStringAttribute( + ax::mojom::StringAttribute::kCheckedStateDescription, + &checked_state_description)); + + // State Description for compound button should be stores as + // checkedDescription. + node.range_info.reset(); + SetProperty(&node, AXBooleanProperty::CHECKABLE, true); + + data = CallSerialize(wrapper); + ASSERT_FALSE(data.GetStringAttribute(ax::mojom::StringAttribute::kDescription, + &description)); + ASSERT_FALSE( + data.GetStringAttribute(ax::mojom::StringAttribute::kValue, &value)); + ASSERT_TRUE(data.GetStringAttribute( + ax::mojom::StringAttribute::kCheckedStateDescription, + &checked_state_description)); + EXPECT_EQ("state description", checked_state_description); } TEST_F(AccessibilityNodeInfoDataWrapperTest, LabeledByLoop) {
diff --git a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc index 49a2fe36..f55d72fe 100644 --- a/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc +++ b/chrome/browser/chromeos/arc/input_method_manager/arc_input_method_manager_service_unittest.cc
@@ -21,7 +21,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_command_line.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/arc/input_method_manager/test_input_method_manager_bridge.h" #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc index c0838d1..3c046812 100644 --- a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc +++ b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc
@@ -8,7 +8,6 @@ #include "base/bind.h" #include "base/command_line.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/arc/arc_optin_uma.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h" #include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
diff --git a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc index 3b78f5f4..f00042f 100644 --- a/chrome/browser/chromeos/attestation/platform_verification_dialog.cc +++ b/chrome/browser/chromeos/attestation/platform_verification_dialog.cc
@@ -131,7 +131,7 @@ gfx::Size PlatformVerificationDialog::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size( default_width, GetLayoutManager()->GetPreferredHeightForWidth(this, default_width));
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc index c4591d2..4404363 100644 --- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc +++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
@@ -25,7 +25,6 @@ #include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/components/web_app_tab_helper_base.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 9bdb7e7..69f6ff6d 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -680,7 +680,8 @@ arc_data_snapshotd_manager_ = std::make_unique<arc::data_snapshotd::ArcDataSnapshotdManager>( - g_browser_process->local_state()); + g_browser_process->local_state(), + base::BindOnce(chrome::AttemptUserExit)); if (base::FeatureList::IsEnabled(::features::kWilcoDtc)) wilco_dtc_supportd_manager_ = std::make_unique<WilcoDtcSupportdManager>();
diff --git a/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part_browsertest.cc b/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part_browsertest.cc index 39f55f8..3c09671 100644 --- a/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part_browsertest.cc +++ b/chrome/browser/chromeos/chrome_content_browser_client_chromeos_part_browsertest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/test/scoped_feature_list.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/settings_window_manager_chromeos.h"
diff --git a/chrome/browser/chromeos/crosapi/browser_util.cc b/chrome/browser/chromeos/crosapi/browser_util.cc index db07e98..b53ada1 100644 --- a/chrome/browser/chromeos/crosapi/browser_util.cc +++ b/chrome/browser/chromeos/crosapi/browser_util.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/callback.h" +#include "base/containers/flat_map.h" #include "base/files/file_path.h" #include "base/path_service.h" #include "base/process/process_handle.h" @@ -58,6 +59,12 @@ } } +using InterfaceVersions = base::flat_map<base::Token, uint32_t>; +template <typename T> +void AddVersion(InterfaceVersions* map) { + (*map)[T::Uuid_] = T::Version_; +} + mojom::LacrosInitParamsPtr GetLacrosInitParams( EnvironmentProvider* environment_provider) { auto params = mojom::LacrosInitParams::New(); @@ -69,6 +76,8 @@ params->session_type = environment_provider->GetSessionType(); params->device_mode = environment_provider->GetDeviceMode(); + params->interface_versions = GetInterfaceVersions(); + return params; } @@ -134,6 +143,23 @@ return base::StartsWith(*app_id, kLacrosAppIdPrefix); } +base::flat_map<base::Token, uint32_t> GetInterfaceVersions() { + static_assert( + crosapi::mojom::AshChromeService::Version_ == 4, + "if you add a new crosapi, please add it to the version map here"); + InterfaceVersions versions; + AddVersion<crosapi::mojom::AccountManager>(&versions); + AddVersion<crosapi::mojom::AshChromeService>(&versions); + AddVersion<crosapi::mojom::Feedback>(&versions); + AddVersion<crosapi::mojom::KeystoreService>(&versions); + AddVersion<crosapi::mojom::MessageCenter>(&versions); + AddVersion<crosapi::mojom::ScreenManager>(&versions); + AddVersion<crosapi::mojom::SnapshotCapturer>(&versions); + AddVersion<device::mojom::HidConnection>(&versions); + AddVersion<device::mojom::HidManager>(&versions); + return versions; +} + mojo::Remote<crosapi::mojom::LacrosChromeService> SendMojoInvitationToLacrosChrome( EnvironmentProvider* environment_provider,
diff --git a/chrome/browser/chromeos/crosapi/browser_util.h b/chrome/browser/chromeos/crosapi/browser_util.h index a0ced50..76c10895 100644 --- a/chrome/browser/chromeos/crosapi/browser_util.h +++ b/chrome/browser/chromeos/crosapi/browser_util.h
@@ -6,6 +6,8 @@ #define CHROME_BROWSER_CHROMEOS_CROSAPI_BROWSER_UTIL_H_ #include "base/callback_forward.h" +#include "base/containers/flat_map.h" +#include "base/token.h" #include "chrome/browser/chromeos/crosapi/environment_provider.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -53,6 +55,9 @@ // browser. bool IsLacrosWindow(const aura::Window* window); +// Returns the UUID and version for all tracked interfaces. Exposed for testing. +base::flat_map<base::Token, uint32_t> GetInterfaceVersions(); + // Invite the lacros-chrome to the mojo universe. // Queue messages to establish the mojo connection, so that the passed IPC is // available already when lacros-chrome accepts the invitation.
diff --git a/chrome/browser/chromeos/crosapi/browser_util_unittest.cc b/chrome/browser/chromeos/crosapi/browser_util_unittest.cc index 9969f2d..54cfb54 100644 --- a/chrome/browser/chromeos/crosapi/browser_util_unittest.cc +++ b/chrome/browser/chromeos/crosapi/browser_util_unittest.cc
@@ -13,6 +13,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "components/account_id/account_id.h" #include "components/user_manager/scoped_user_manager.h" #include "components/version_info/channel.h" @@ -92,4 +93,18 @@ EXPECT_FALSE(browser_util::IsLacrosAllowed(Channel::UNKNOWN)); } +TEST_F(LacrosUtilTest, GetInterfaceVersions) { + base::flat_map<base::Token, uint32_t> versions = + browser_util::GetInterfaceVersions(); + + // Check that a known interface with version > 0 is present and has non-zero + // version. + EXPECT_GT(versions[mojom::KeystoreService::Uuid_], 0); + + // Check that the empty token is not present. + base::Token token; + auto it = versions.find(token); + EXPECT_EQ(it, versions.end()); +} + } // namespace crosapi
diff --git a/chrome/browser/chromeos/crostini/crostini_terminal.cc b/chrome/browser/chromeos/crostini/crostini_terminal.cc index 6f5529b4..d770866 100644 --- a/chrome/browser/chromeos/crostini/crostini_terminal.cc +++ b/chrome/browser/chromeos/crostini/crostini_terminal.cc
@@ -21,7 +21,6 @@ #include "chrome/browser/ui/extensions/application_launch.h" #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h" #include "chrome/browser/web_applications/system_web_app_manager.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/chrome_unscaled_resources.h"
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index 62a522ef..d89054d 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -113,7 +113,6 @@ #include "chrome/browser/web_applications/components/web_app_provider_base.h" #include "chrome/browser/web_applications/system_web_app_manager.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/api/autotest_private.h" #include "chrome/common/pref_names.h" #include "chromeos/dbus/dbus_thread_manager.h" @@ -3639,7 +3638,7 @@ auto* frame_header = ash::FrameHeader::Get(widget); window_info.caption_height = frame_header->GetHeaderHeight(); - const ash::CaptionButtonModel* button_model = + const chromeos::CaptionButtonModel* button_model = frame_header->GetCaptionButtonModel(); int caption_button_enabled_status = 0; int caption_button_visible_status = 0;
diff --git a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc index c39117e..e9ec6a9 100644 --- a/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc +++ b/chrome/browser/chromeos/extensions/device_local_account_management_policy_provider.cc
@@ -459,9 +459,6 @@ // Probably doesn't work on Chrome OS anyways. "nativeMessaging", - // Admin controls network connectivity anyways. - "networking.config", - // Status quo considers this risky due to the ability to fake system UI - // low risk IMHO however since notifications are already badged with app // icon and won't extract any data.
diff --git a/chrome/browser/chromeos/extensions/info_private_apitest.cc b/chrome/browser/chromeos/extensions/info_private_apitest.cc index b4d79f4..437a4a8 100644 --- a/chrome/browser/chromeos/extensions/info_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/info_private_apitest.cc
@@ -6,7 +6,6 @@ #include "ash/public/cpp/ash_switches.h" #include "ash/public/cpp/stylus_utils.h" #include "base/system/sys_info.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
diff --git a/chrome/browser/chromeos/extensions/input_method_api.cc b/chrome/browser/chromeos/extensions/input_method_api.cc index 75658d24..5b2b29c 100644 --- a/chrome/browser/chromeos/extensions/input_method_api.cc +++ b/chrome/browser/chromeos/extensions/input_method_api.cc
@@ -27,7 +27,6 @@ #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/api/input_method_private.h" #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/extensions/input_method_apitest_chromeos.cc b/chrome/browser/chromeos/extensions/input_method_apitest_chromeos.cc index 6dcd886..5eef8ea 100644 --- a/chrome/browser/chromeos/extensions/input_method_apitest_chromeos.cc +++ b/chrome/browser/chromeos/extensions/input_method_apitest_chromeos.cc
@@ -10,7 +10,6 @@ #include "base/memory/ref_counted.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/extensions/input_method_event_router.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/constants/chromeos_switches.h"
diff --git a/chrome/browser/chromeos/file_manager/path_util_unittest.cc b/chrome/browser/chromeos/file_manager/path_util_unittest.cc index f6fc6b96..32fe386 100644 --- a/chrome/browser/chromeos/file_manager/path_util_unittest.cc +++ b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
@@ -11,7 +11,6 @@ #include "base/files/file_path.h" #include "base/memory/ptr_util.h" #include "base/system/sys_info.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.h" #include "chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h"
diff --git a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc index 4a0487a..18106b4 100644 --- a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc +++ b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc
@@ -17,7 +17,6 @@ #include "base/memory/weak_ptr.h" #include "base/stl_util.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/drive/file_system_util.h" #include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h" #include "chrome/browser/chromeos/file_manager/volume_manager_observer.h"
diff --git a/chrome/browser/chromeos/guest_os/guest_os_registry_service_unittest.cc b/chrome/browser/chromeos/guest_os/guest_os_registry_service_unittest.cc index 8facec7..67de2a0 100644 --- a/chrome/browser/chromeos/guest_os/guest_os_registry_service_unittest.cc +++ b/chrome/browser/chromeos/guest_os/guest_os_registry_service_unittest.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/chromeos/guest_os/guest_os_pref_names.h" #include "chrome/browser/chromeos/plugin_vm/fake_plugin_vm_features.h" #include "chrome/browser/chromeos/plugin_vm/plugin_vm_test_helper.h" -#include "chrome/common/chrome_features.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/vm_applications/apps.pb.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc index add0d63..8e0225cb 100644 --- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc +++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_service_regular.cc
@@ -32,7 +32,6 @@ #include "chrome/browser/gcm/gcm_profile_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_dialog.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" #include "chromeos/components/multidevice/logging/logging.h"
diff --git a/chrome/browser/chromeos/login/enable_debugging_browsertest.cc b/chrome/browser/chromeos/login/enable_debugging_browsertest.cc index 44da2d2..854f2164 100644 --- a/chrome/browser/chromeos/login/enable_debugging_browsertest.cc +++ b/chrome/browser/chromeos/login/enable_debugging_browsertest.cc
@@ -182,32 +182,10 @@ } void CloseEnableDebuggingScreen() { - // TODO(crbug.com/944573): inline this method once UI is polymer-based. - test::JSChecker js = test::OobeJS(); - js.set_polymer_ui(false); - js.TapOn("debugging-cancel-button"); + test::OobeJS().TapOn("debugging-cancel-button"); } - void ClickRemoveProtectionButton() { - // TODO(crbug.com/944573): inline this method once UI is polymer-based. - test::JSChecker js = test::OobeJS(); - js.set_polymer_ui(false); - js.TapOn("debugging-remove-protection-button"); - } - - void ClickEnableButton() { - // TODO(crbug.com/944573): inline this method once UI is polymer-based. - test::JSChecker js = test::OobeJS(); - js.set_polymer_ui(false); - js.TapOn("debugging-enable-button"); - } - - void ClickOKButton() { - // TODO(crbug.com/944573): inline this method once UI is polymer-based. - test::JSChecker js = test::OobeJS(); - js.set_polymer_ui(false); - js.TapOn("debugging-ok-button"); - } + void ClickEnableButton() { test::OobeJS().TapOn("debugging-enable-button"); } void ShowRemoveProtectionScreen() { debug_daemon_client_->SetDebuggingFeaturesStatus( @@ -285,7 +263,7 @@ IN_PROC_BROWSER_TEST_F(EnableDebuggingDevTest, ShowAndRemoveProtection) { ShowRemoveProtectionScreen(); debug_daemon_client_->ResetWait(); - ClickRemoveProtectionButton(); + test::OobeJS().TapOn("debugging-remove-protection-button"); debug_daemon_client_->WaitUntilCalled(); test::OobeJS().ExpectHasClass("wait-view", {"debugging"});
diff --git a/chrome/browser/chromeos/login/eula_browsertest.cc b/chrome/browser/chromeos/login/eula_browsertest.cc index b65e5a6d..07f6dfa5 100644 --- a/chrome/browser/chromeos/login/eula_browsertest.cc +++ b/chrome/browser/chromeos/login/eula_browsertest.cc
@@ -147,14 +147,6 @@ } } - // Returns an Oobe JSChecker that sends 'click' events instead of 'tap' - // events when interacting with UI elements. - test::JSChecker NonPolymerOobeJS() { - test::JSChecker js = test::OobeJS(); - js.set_polymer_ui(false); - return js; - } - base::OnceClosure SetCollectStatsConsentClosure(bool consented) { return base::BindOnce( base::IgnoreResult(&GoogleUpdateSettings::SetCollectStatsConsent), @@ -263,8 +255,8 @@ StatsReportingController::Get()->AddObserver(runloop.QuitClosure()); // Enable and disable usageStats that to see that metrics are recorded. - NonPolymerOobeJS().TapOnPath(kUsageStats); - NonPolymerOobeJS().TapOnPath(kUsageStats); + test::OobeJS().TapOnPath(kUsageStats); + test::OobeJS().TapOnPath(kUsageStats); // Advance to the next screen for changes to take effect. test::OobeJS().TapOnPath(kAcceptEulaButton); @@ -313,7 +305,7 @@ // Click on the toggle to disable stats collection and advance to the next // screen for changes to take effect. - NonPolymerOobeJS().TapOnPath(kUsageStats); + test::OobeJS().TapOnPath(kUsageStats); test::OobeJS().TapOnPath(kAcceptEulaButton); // Wait for StartReportingController update. @@ -369,7 +361,7 @@ .CreateWaiter(test::GetOobeElementPath(kAdditionalTermsDialog) + ".open") ->Wait(); - NonPolymerOobeJS().TapOnPath(kAdditionalTermsClose); + test::OobeJS().TapOnPath(kAdditionalTermsClose); test::OobeJS() .CreateWaiter(test::GetOobeElementPath(kAdditionalTermsDialog) +
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc index 2d0d48c7..941d44f 100644 --- a/chrome/browser/chromeos/login/existing_user_controller.cc +++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -78,7 +78,6 @@ #include "chrome/browser/ui/webui/chromeos/login/tpm_error_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/update_required_screen_handler.h" #include "chrome/common/channel_info.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" @@ -95,6 +94,7 @@ #include "chromeos/strings/grit/chromeos_strings.h" #include "components/account_id/account_id.h" #include "components/arc/arc_util.h" +#include "components/arc/enterprise/arc_data_snapshotd_manager.h" #include "components/google/core/common/google_util.h" #include "components/policy/core/common/cloud/cloud_policy_client.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" @@ -346,6 +346,42 @@ return offline_signin_limit - (now - last_online_signin); } +// Returns account ID of a public session account if it is unique, otherwise +// returns invalid account ID. +AccountId GetArcDataSnapshotAutoLoginAccountId( + const std::vector<policy::DeviceLocalAccount>& device_local_accounts) { + AccountId auto_login_account_id = EmptyAccountId(); + for (std::vector<policy::DeviceLocalAccount>::const_iterator it = + device_local_accounts.begin(); + it != device_local_accounts.end(); ++it) { + if (it->type == policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION) { + // Do not perform ARC data snapshot auto-login if more than one public + // session account is configured. + if (auto_login_account_id.is_valid()) + return EmptyAccountId(); + auto_login_account_id = AccountId::FromUserEmail(it->user_id); + VLOG(2) << "PublicSession autologin found: " << it->user_id; + } + } + return auto_login_account_id; +} + +// Returns account ID if a corresponding to |auto_login_account_id| device local +// account exists, otherwise returns invalid account ID. +AccountId GetPublicSessionAutoLoginAccountId( + const std::vector<policy::DeviceLocalAccount>& device_local_accounts, + const std::string& auto_login_account_id) { + for (std::vector<policy::DeviceLocalAccount>::const_iterator it = + device_local_accounts.begin(); + it != device_local_accounts.end(); ++it) { + if (it->account_id == auto_login_account_id) { + VLOG(2) << "PublicSession autologin found: " << it->user_id; + return AccountId::FromUserEmail(it->user_id); + } + } + return EmptyAccountId(); +} + class AutoLaunchNotificationDelegate : public message_center::HandleNotificationClickDelegate { public: @@ -1556,16 +1592,17 @@ policy::GetDeviceLocalAccounts(cros_settings_); const bool show_update_required_screen = IsUpdateRequiredDeadlineReached(); - public_session_auto_login_account_id_ = EmptyAccountId(); - for (std::vector<policy::DeviceLocalAccount>::const_iterator it = - device_local_accounts.begin(); - it != device_local_accounts.end(); ++it) { - if (it->account_id == auto_login_account_id) { - public_session_auto_login_account_id_ = - AccountId::FromUserEmail(it->user_id); - VLOG(2) << "PublicSession autologin found: " << it->user_id; - break; - } + auto* data_snapshotd_manager = + arc::data_snapshotd::ArcDataSnapshotdManager::Get(); + bool is_arc_data_snapshot_autologin = + (data_snapshotd_manager && + data_snapshotd_manager->IsAutoLoginConfigured()); + if (is_arc_data_snapshot_autologin) { + public_session_auto_login_account_id_ = + GetArcDataSnapshotAutoLoginAccountId(device_local_accounts); + } else { + public_session_auto_login_account_id_ = GetPublicSessionAutoLoginAccountId( + device_local_accounts, auto_login_account_id); } const user_manager::User* public_session_user = @@ -1577,7 +1614,8 @@ public_session_auto_login_account_id_ = EmptyAccountId(); } - if (!cros_settings_->GetInteger(kAccountsPrefDeviceLocalAccountAutoLoginDelay, + if (is_arc_data_snapshot_autologin || + !cros_settings_->GetInteger(kAccountsPrefDeviceLocalAccountAutoLoginDelay, &auto_login_delay_)) { auto_login_delay_ = 0; } @@ -1656,6 +1694,20 @@ StopAutoLoginTimer(); } + // Block auto-login flow until ArcDataSnapshotdManager is ready to enter an + // auto-login session. + // ArcDataSnapshotdManager stores a reset auto-login callback to fire it once + // it is ready. + auto* data_snapshotd_manager = + arc::data_snapshotd::ArcDataSnapshotdManager::Get(); + if (data_snapshotd_manager && !data_snapshotd_manager->IsAutoLoginAllowed() && + data_snapshotd_manager->IsAutoLoginConfigured()) { + data_snapshotd_manager->set_reset_autologin_callback( + base::BindOnce(&ExistingUserController::ResetAutoLoginTimer, + weak_factory_.GetWeakPtr())); + return; + } + // Start the auto-login timer. if (!auto_login_timer_) auto_login_timer_.reset(new base::OneShotTimer);
diff --git a/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc b/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc index 770fa04..933606a 100644 --- a/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc +++ b/chrome/browser/chromeos/login/existing_user_controller_browsertest.cc
@@ -59,6 +59,7 @@ #include "chromeos/network/network_state_test_helper.h" #include "chromeos/settings/cros_settings_names.h" #include "chromeos/settings/cros_settings_provider.h" +#include "components/arc/enterprise/arc_data_snapshotd_manager.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" @@ -108,6 +109,8 @@ const char kHash[] = "test_hash"; const char kPublicSessionUserEmail[] = "public_session_user@localhost"; +const char kPublicSessionSecondUserEmail[] = + "public_session_second_user@localhost"; const int kAutoLoginNoDelay = 0; const int kAutoLoginShortDelay = 1; const int kAutoLoginLongDelay = 10000; @@ -143,6 +146,10 @@ return path.Append("kerberos").Append("krb5cc"); } +arc::data_snapshotd::ArcDataSnapshotdManager* arc_data_snapshotd_manager() { + return arc::data_snapshotd::ArcDataSnapshotdManager::Get(); +} + } // namespace class ExistingUserControllerTest : public policy::DevicePolicyCrosBrowserTest { @@ -328,6 +335,12 @@ void SetUpOnMainThread() override { ExistingUserControllerTest::SetUpOnMainThread(); + // By default ArcDataSnapshotdManager does not influence an auto login + // flow. + EXPECT_TRUE(arc_data_snapshotd_manager()); + EXPECT_TRUE(arc_data_snapshotd_manager()->IsAutoLoginAllowed()); + EXPECT_FALSE(arc_data_snapshotd_manager()->IsAutoLoginConfigured()); + // Wait for the public session user to be created. if (!user_manager::UserManager::Get()->IsKnownUser( public_session_account_id_)) { @@ -706,6 +719,98 @@ FireAutoLogin(); } +IN_PROC_BROWSER_TEST_F(ExistingUserControllerPublicSessionTest, + ArcDataSnapshotdAutoLogin) { + arc_data_snapshotd_manager()->set_state_for_testing( + arc::data_snapshotd::ArcDataSnapshotdManager::State::kBlockedUi); + EXPECT_FALSE(arc_data_snapshotd_manager()->IsAutoLoginAllowed()); + EXPECT_TRUE(arc_data_snapshotd_manager()->IsAutoLoginConfigured()); + + ConfigureAutoLogin(); + existing_user_controller()->OnSigninScreenReady(); + + // Do not start an auto-login public account session when in blocked UI mode. + EXPECT_TRUE(auto_login_account_id().is_valid()); + EXPECT_EQ(public_session_account_id_, auto_login_account_id()); + EXPECT_EQ(0, auto_login_delay()); + EXPECT_FALSE(auto_login_timer()); + + // Allow to launch public account session (MGS). + arc_data_snapshotd_manager()->set_state_for_testing( + arc::data_snapshotd::ArcDataSnapshotdManager::State::kMgsToLaunch); + EXPECT_TRUE(arc_data_snapshotd_manager()->IsAutoLoginAllowed()); + EXPECT_TRUE(arc_data_snapshotd_manager()->IsAutoLoginConfigured()); + + // Set up mocks to check login success. + UserContext user_context(user_manager::USER_TYPE_PUBLIC_ACCOUNT, + public_session_account_id_); + user_context.SetUserIDHash(user_context.GetAccountId().GetUserEmail()); + ExpectSuccessfulLogin(user_context); + existing_user_controller()->OnSigninScreenReady(); + + // Start auto-login and wait for login tasks to complete. + content::RunAllPendingInMessageLoop(); + + arc_data_snapshotd_manager()->OnSessionStateChanged(); + + EXPECT_TRUE(auto_login_account_id().is_valid()); + EXPECT_EQ(0, auto_login_delay()); + EXPECT_TRUE(auto_login_timer()); + EXPECT_EQ(arc::data_snapshotd::ArcDataSnapshotdManager::State::kMgsLaunched, + arc_data_snapshotd_manager()->state()); +} + +class ExistingUserControllerSecondPublicSessionTest + : public ExistingUserControllerPublicSessionTest { + public: + void SetUpInProcessBrowserTestFixture() override { + ExistingUserControllerPublicSessionTest::SetUpInProcessBrowserTestFixture(); + AddSecondPublicSessionAccount(); + } + + private: + void AddSecondPublicSessionAccount() { + // Setup the device policy. + em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); + em::DeviceLocalAccountInfoProto* account = + proto.mutable_device_local_accounts()->add_account(); + account->set_account_id(kPublicSessionSecondUserEmail); + account->set_type( + em::DeviceLocalAccountInfoProto::ACCOUNT_TYPE_PUBLIC_SESSION); + RefreshDevicePolicy(); + + // Setup the device local account policy. + policy::UserPolicyBuilder device_local_account_policy; + device_local_account_policy.policy_data().set_username( + kPublicSessionSecondUserEmail); + device_local_account_policy.policy_data().set_policy_type( + policy::dm_protocol::kChromePublicAccountPolicyType); + device_local_account_policy.policy_data().set_settings_entity_id( + kPublicSessionSecondUserEmail); + device_local_account_policy.Build(); + session_manager_client()->set_device_local_account_policy( + kPublicSessionSecondUserEmail, device_local_account_policy.GetBlob()); + } +}; +// Test that if two public session accounts are configured for the device, auto +// login is not happening. +IN_PROC_BROWSER_TEST_F(ExistingUserControllerSecondPublicSessionTest, + ArcDataSnapshotdTwoAccounts) { + // Allow to launch public account session (MGS). + arc_data_snapshotd_manager()->set_state_for_testing( + arc::data_snapshotd::ArcDataSnapshotdManager::State::kMgsToLaunch); + EXPECT_TRUE(arc_data_snapshotd_manager()->IsAutoLoginAllowed()); + EXPECT_TRUE(arc_data_snapshotd_manager()->IsAutoLoginConfigured()); + + ConfigureAutoLogin(); + existing_user_controller()->OnSigninScreenReady(); + + // Do not configure auto login if more than one public session is configured. + EXPECT_FALSE(auto_login_account_id().is_valid()); + EXPECT_EQ(0, auto_login_delay()); + EXPECT_FALSE(auto_login_timer()); +} + class ExistingUserControllerActiveDirectoryTest : public ExistingUserControllerTest { public:
diff --git a/chrome/browser/chromeos/login/screens/edu_coexistence_login_browsertest.cc b/chrome/browser/chromeos/login/screens/edu_coexistence_login_browsertest.cc new file mode 100644 index 0000000..aacbd1fd --- /dev/null +++ b/chrome/browser/chromeos/login/screens/edu_coexistence_login_browsertest.cc
@@ -0,0 +1,195 @@ +// Copyright 2020 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. + +#include "chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h" + +#include "base/callback.h" +#include "base/optional.h" +#include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/chromeos/login/test/fake_gaia_mixin.h" +#include "chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h" +#include "chrome/browser/chromeos/login/test/login_manager_mixin.h" +#include "chrome/browser/chromeos/login/test/oobe_base_test.h" +#include "chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h" +#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" +#include "chrome/browser/chromeos/login/test/user_policy_mixin.h" +#include "chrome/browser/chromeos/login/test/wizard_controller_screen_exit_waiter.h" +#include "chrome/browser/chromeos/login/ui/login_display_host.h" +#include "chrome/browser/chromeos/login/wizard_context.h" +#include "chrome/browser/chromeos/login/wizard_controller.h" +#include "chrome/browser/supervised_user/supervised_user_features.h" +#include "chrome/browser/supervised_user/supervised_user_service.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" +#include "chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.h" +#include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h" +#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" +#include "components/account_id/account_id.h" +#include "content/public/test/browser_test.h" + +namespace chromeos { + +namespace { + +SystemWebDialogDelegate* GetInlineLoginDialog() { + return chromeos::SystemWebDialogDelegate::FindInstance( + SupervisedUserService::GetEduCoexistenceLoginUrl()); +} + +bool IsInlineLoginDialogShown() { + return GetInlineLoginDialog() != nullptr; +} + +} // namespace + +class EduCoexistenceLoginBrowserTest : public OobeBaseTest { + public: + EduCoexistenceLoginBrowserTest(); + ~EduCoexistenceLoginBrowserTest() override = default; + + EduCoexistenceLoginBrowserTest(const EduCoexistenceLoginBrowserTest&) = + delete; + EduCoexistenceLoginBrowserTest& operator=( + const EduCoexistenceLoginBrowserTest&) = delete; + + void SetUpOnMainThread() override; + + protected: + void WaitForScreenExit(); + + EduCoexistenceLoginScreen* GetEduCoexistenceLoginScreen(); + + const base::Optional<EduCoexistenceLoginScreen::Result>& result() { + return result_; + } + + LoginManagerMixin& login_manager_mixin() { return login_manager_mixin_; } + + base::HistogramTester& histogram_tester() { return histogram_tester_; } + + private: + void HandleScreenExit(EduCoexistenceLoginScreen::Result result); + + base::OnceCallback<void()> quit_closure_; + + base::Optional<EduCoexistenceLoginScreen::Result> result_; + + EduCoexistenceLoginScreen::ScreenExitCallback original_callback_; + + FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()}; + + base::test::ScopedFeatureList feature_list_; + + base::HistogramTester histogram_tester_; + + LoginManagerMixin login_manager_mixin_{&mixin_host_, {}, &fake_gaia_}; +}; + +EduCoexistenceLoginBrowserTest::EduCoexistenceLoginBrowserTest() { + feature_list_.InitAndEnableFeature(supervised_users::kEduCoexistenceFlowV2); +} + +void EduCoexistenceLoginBrowserTest::SetUpOnMainThread() { + EduCoexistenceLoginScreen* screen = GetEduCoexistenceLoginScreen(); + original_callback_ = screen->get_exit_callback_for_test(); + screen->set_exit_callback_for_test( + base::BindRepeating(&EduCoexistenceLoginBrowserTest::HandleScreenExit, + base::Unretained(this))); + OobeBaseTest::SetUpOnMainThread(); +} + +void EduCoexistenceLoginBrowserTest::HandleScreenExit( + EduCoexistenceLoginScreen::Result result) { + result_ = result; + original_callback_.Run(result); + if (quit_closure_) + std::move(quit_closure_).Run(); +} + +void EduCoexistenceLoginBrowserTest::WaitForScreenExit() { + if (result_.has_value()) + return; + base::RunLoop run_loop; + quit_closure_ = base::BindOnce(run_loop.QuitClosure()); + run_loop.Run(); +} + +EduCoexistenceLoginScreen* +EduCoexistenceLoginBrowserTest::GetEduCoexistenceLoginScreen() { + return EduCoexistenceLoginScreen::Get( + WizardController::default_controller()->screen_manager()); +} + +IN_PROC_BROWSER_TEST_F(EduCoexistenceLoginBrowserTest, RegularUserLogin) { + login_manager_mixin().LoginAsNewRegularUser(); + WaitForScreenExit(); + + // Regular user login shouldn't show the EduCoexistenceLoginScreen. + EXPECT_EQ(result().value(), EduCoexistenceLoginScreen::Result::SKIPPED); + + histogram_tester().ExpectTotalCount( + "OOBE.StepCompletionTimeByExitReason.Edu-coexistence-login.Done", 0); +} + +class EduCoexistenceLoginChildBrowserTest + : public EduCoexistenceLoginBrowserTest { + public: + // Child users require a user policy, set up an empty one so the user can + // get through login. + void SetUpInProcessBrowserTestFixture() override { + ASSERT_TRUE(user_policy_mixin_.RequestPolicyUpdate()); + EduCoexistenceLoginBrowserTest::SetUpInProcessBrowserTestFixture(); + } + + void LoginAsNewChildUser() { + WizardController::default_controller() + ->get_wizard_context_for_testing() + ->sign_in_as_child = true; + login_manager_mixin().LoginAsNewChildUser(); + + WizardControllerExitWaiter(UserCreationView::kScreenId).Wait(); + + base::RunLoop().RunUntilIdle(); + } + + private: + LocalPolicyTestServerMixin policy_server_mixin_{&mixin_host_}; + UserPolicyMixin user_policy_mixin_{ + &mixin_host_, + AccountId::FromUserEmailGaiaId(test::kTestEmail, test::kTestGaiaId), + &policy_server_mixin_}; +}; + +IN_PROC_BROWSER_TEST_F(EduCoexistenceLoginChildBrowserTest, ChildUserLogin) { + LoginAsNewChildUser(); + + WizardController* wizard = WizardController::default_controller(); + + EXPECT_EQ(wizard->current_screen()->screen_id(), + EduCoexistenceLoginScreen::kScreenId); + + EduCoexistenceLoginScreen* screen = GetEduCoexistenceLoginScreen(); + + // Expect that the inline login dialog is shown. + EXPECT_TRUE(IsInlineLoginDialogShown()); + screen->Hide(); + base::RunLoop().RunUntilIdle(); + + // Expect that the inline login dialog is hidden. + EXPECT_FALSE(IsInlineLoginDialogShown()); + + screen->Show(wizard->get_wizard_context_for_testing()); + + // Expect that the inline login dialog is shown. + EXPECT_TRUE(IsInlineLoginDialogShown()); + + // Dialog got closed. + GetInlineLoginDialog()->Close(); + WaitForScreenExit(); + + histogram_tester().ExpectTotalCount( + "OOBE.StepCompletionTimeByExitReason.Edu-coexistence-login.Done", 1); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.cc b/chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.cc new file mode 100644 index 0000000..0c307f88 --- /dev/null +++ b/chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.cc
@@ -0,0 +1,97 @@ +// Copyright 2020 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. + +#include "chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h" + +#include <string> + +#include "base/feature_list.h" +#include "chrome/browser/chromeos/login/oobe_screen.h" +#include "chrome/browser/chromeos/login/screen_manager.h" +#include "chrome/browser/chromeos/login/ui/login_display_host.h" +#include "chrome/browser/chromeos/login/ui/login_display_host_mojo.h" +#include "chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h" +#include "chrome/browser/chromeos/login/wizard_context.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/supervised_user/supervised_user_features.h" +#include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" +#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" +#include "ui/gfx/geometry/rect.h" + +namespace chromeos { + +// static +constexpr StaticOobeScreenId EduCoexistenceLoginScreen::kScreenId; + +// static +EduCoexistenceLoginScreen* EduCoexistenceLoginScreen::Get( + ScreenManager* screen_manager) { + return static_cast<EduCoexistenceLoginScreen*>( + screen_manager->GetScreen(EduCoexistenceLoginScreen::kScreenId)); +} + +// static +std::string EduCoexistenceLoginScreen::GetResultString(Result result) { + switch (result) { + case Result::DONE: + return "Done"; + case Result::SKIPPED: + return BaseScreen::kNotApplicable; + } +} + +EduCoexistenceLoginScreen::EduCoexistenceLoginScreen( + const ScreenExitCallback& exit_callback) + : BaseScreen(EduCoexistenceLoginScreen::kScreenId, + OobeScreenPriority::DEFAULT), + exit_callback_(exit_callback) { + observed_login_display_host_.Add(LoginDisplayHost::default_host()); +} + +EduCoexistenceLoginScreen::~EduCoexistenceLoginScreen() {} + +bool EduCoexistenceLoginScreen::MaybeSkip(WizardContext* context) { + if (ProfileManager::GetActiveUserProfile()->IsChild() && + base::FeatureList::IsEnabled(supervised_users::kEduCoexistenceFlowV2)) { + return false; + } + + exit_callback_.Run(Result::SKIPPED); + return true; +} + +void EduCoexistenceLoginScreen::ShowImpl() { + LoginDisplayHost* host = LoginDisplayHost::default_host(); + DCHECK(host); + OobeUI* oobe_ui = host->GetOobeUI(); + DCHECK(oobe_ui); + DCHECK(!dialog_delegate_); + + InlineLoginDialogChromeOSOnboarding* dialog = + InlineLoginDialogChromeOSOnboarding::Show( + oobe_ui->GetViewSize(), + /* parent window */ oobe_ui->GetTopLevelNativeWindow(), + base::BindOnce(exit_callback_, Result::DONE)); + + dialog_delegate_ = + std::make_unique<InlineLoginDialogChromeOSOnboarding::Delegate>(dialog); +} + +void EduCoexistenceLoginScreen::HideImpl() { + if (dialog_delegate_) { + dialog_delegate_->CloseWithoutCallback(); + dialog_delegate_.reset(); + } +} + +void EduCoexistenceLoginScreen::WebDialogViewBoundsChanged( + const gfx::Rect& bounds) { + if (!dialog_delegate_) + return; + + dialog_delegate_->UpdateDialogBounds(bounds); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h b/chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h new file mode 100644 index 0000000..4049786a --- /dev/null +++ b/chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h
@@ -0,0 +1,66 @@ +// Copyright 2020 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 CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_EDU_COEXISTENCE_LOGIN_SCREEN_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_EDU_COEXISTENCE_LOGIN_SCREEN_H_ + +#include "base/callback.h" +#include "base/scoped_observer.h" +#include "chrome/browser/chromeos/login/screens/base_screen.h" +#include "chrome/browser/chromeos/login/ui/login_display_host.h" +#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" + +namespace gfx { +class Rect; +} // namespace gfx + +namespace chromeos { + +class WizardContext; +class ScreenManager; + +// OOBE screen to add EDU account as a secondary account when the user is a +// supervised user. +class EduCoexistenceLoginScreen : public BaseScreen, + public LoginDisplayHost::Observer { + public: + constexpr static StaticOobeScreenId kScreenId{"edu-coexistence-login"}; + + enum class Result { DONE, SKIPPED }; + + static EduCoexistenceLoginScreen* Get(ScreenManager* screen_manager); + static std::string GetResultString(Result result); + + using ScreenExitCallback = base::RepeatingCallback<void(Result)>; + explicit EduCoexistenceLoginScreen(const ScreenExitCallback& exit_callback); + ~EduCoexistenceLoginScreen() override; + + EduCoexistenceLoginScreen(const EduCoexistenceLoginScreen&) = delete; + EduCoexistenceLoginScreen& operator=(const EduCoexistenceLoginScreen&) = + delete; + + ScreenExitCallback get_exit_callback_for_test() { return exit_callback_; } + void set_exit_callback_for_test(const ScreenExitCallback& callback) { + exit_callback_ = callback; + } + + private: + bool MaybeSkip(WizardContext* context) override; + void ShowImpl() override; + void HideImpl() override; + + // LoginDisplayHost::Observer + void WebDialogViewBoundsChanged(const gfx::Rect& bounds) override; + + ScreenExitCallback exit_callback_; + std::unique_ptr<InlineLoginDialogChromeOSOnboarding::Delegate> + dialog_delegate_; + + ScopedObserver<LoginDisplayHost, LoginDisplayHost::Observer> + observed_login_display_host_{this}; +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_EDU_COEXISTENCE_LOGIN_SCREEN_H_
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc index 468a7db..59adf5f 100644 --- a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
@@ -57,7 +57,6 @@ std::string feature_toggle = test::GetOobeElementPath({"connect", feature_name, "button"}) + ".checked"; - js.set_polymer_ui(false); if (!new_value) feature_toggle = "!" + feature_toggle;
diff --git a/chrome/browser/chromeos/login/test/js_checker.cc b/chrome/browser/chromeos/login/test/js_checker.cc index 76468ef..4fb9ac5 100644 --- a/chrome/browser/chromeos/login/test/js_checker.cc +++ b/chrome/browser/chromeos/login/test/js_checker.cc
@@ -451,13 +451,7 @@ void JSChecker::TapOnPath( std::initializer_list<base::StringPiece> element_ids) { ExpectVisiblePath(element_ids); - // TODO(crbug.com/949377): Switch to always firing 'click' events when - // missing OOBE UI components are migrated to handle 'click' events. - if (polymer_ui_) { - Evaluate(GetOobeElementPath(element_ids) + ".fire('tap')"); - } else { - Evaluate(GetOobeElementPath(element_ids) + ".click()"); - } + Evaluate(GetOobeElementPath(element_ids) + ".click()"); } void JSChecker::TapOn(const std::string& element_id) {
diff --git a/chrome/browser/chromeos/login/test/js_checker.h b/chrome/browser/chromeos/login/test/js_checker.h index cb270b9eb..4565ed4b 100644 --- a/chrome/browser/chromeos/login/test/js_checker.h +++ b/chrome/browser/chromeos/login/test/js_checker.h
@@ -229,17 +229,11 @@ web_contents_ = web_contents; } - void set_polymer_ui(bool polymer_ui) { polymer_ui_ = polymer_ui; } - private: void GetBoolImpl(const std::string& expression, bool* result); void GetIntImpl(const std::string& expression, int* result); void GetStringImpl(const std::string& expression, std::string* result); - // Checks if we assume that WebUI is polymer-based. There are few UI elements - // that were not migrated to polymer, as well as some test-only UIs - // (e.g. test SAML pages) that require old-fashioned interaction. - bool polymer_ui_ = true; content::WebContents* web_contents_ = nullptr; };
diff --git a/chrome/browser/chromeos/login/test/oobe_base_test.cc b/chrome/browser/chromeos/login/test/oobe_base_test.cc index 0212c908..50a7897 100644 --- a/chrome/browser/chromeos/login/test/oobe_base_test.cc +++ b/chrome/browser/chromeos/login/test/oobe_base_test.cc
@@ -218,8 +218,6 @@ LoginDisplayHost::default_host()->GetOobeWebContents(), gaia_frame_parent_); test::JSChecker result = test::JSChecker(frame); - // Fake GAIA / fake SAML pages do not use polymer-based UI. - result.set_polymer_ui(false); return result; }
diff --git a/chrome/browser/chromeos/login/ui/captive_portal_view.cc b/chrome/browser/chromeos/login/ui/captive_portal_view.cc index 1589c7e..d4f4b6c1 100644 --- a/chrome/browser/chromeos/login/ui/captive_portal_view.cc +++ b/chrome/browser/chromeos/login/ui/captive_portal_view.cc
@@ -13,6 +13,7 @@ #include "components/captive_portal/core/captive_portal_detector.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/views/widget/widget_delegate.h" #include "url/gurl.h" namespace { @@ -38,13 +39,7 @@ CaptivePortalView::CaptivePortalView(Profile* profile, CaptivePortalWindowProxy* proxy) - : SimpleWebViewDialog(profile), proxy_(proxy), redirected_(false) { - SetCanResize(false); - SetModalType(ui::MODAL_TYPE_SYSTEM); - SetShowTitle(true); - SetTitle(WindowTitleForNetwork( - NetworkHandler::Get()->network_state_handler()->DefaultNetwork())); -} + : SimpleWebViewDialog(profile), proxy_(proxy), redirected_(false) {} CaptivePortalView::~CaptivePortalView() {} @@ -78,4 +73,14 @@ // proxy_->OnOriginalURLLoaded(); } +std::unique_ptr<views::WidgetDelegate> CaptivePortalView::MakeWidgetDelegate() { + auto delegate = SimpleWebViewDialog::MakeWidgetDelegate(); + delegate->SetCanResize(false); + delegate->SetModalType(ui::MODAL_TYPE_SYSTEM); + delegate->SetShowTitle(true); + delegate->SetTitle(WindowTitleForNetwork( + NetworkHandler::Get()->network_state_handler()->DefaultNetwork())); + return delegate; +} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/captive_portal_view.h b/chrome/browser/chromeos/login/ui/captive_portal_view.h index d641208..d582809a 100644 --- a/chrome/browser/chromeos/login/ui/captive_portal_view.h +++ b/chrome/browser/chromeos/login/ui/captive_portal_view.h
@@ -27,6 +27,9 @@ void LoadingStateChanged(content::WebContents* source, bool to_different_document) override; + // Overridden from SimpleWebViewDialog: + std::unique_ptr<views::WidgetDelegate> MakeWidgetDelegate() override; + private: // Contains CaptivePortalWindowProxy to be notified when redirection state is // resolved.
diff --git a/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc b/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc index 71fee0a0..d9b44ec4 100644 --- a/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc +++ b/chrome/browser/chromeos/login/ui/captive_portal_window_proxy.cc
@@ -43,13 +43,14 @@ // The captive portal dialog is system-modal, but uses the web-content-modal // dialog manager (odd) and requires this atypical dialog widget initialization. -views::Widget* CreateWindowAsFramelessChild(Profile* profile, - views::WidgetDelegate* delegate, - gfx::NativeView parent) { +views::Widget* CreateWindowAsFramelessChild( + Profile* profile, + std::unique_ptr<views::WidgetDelegate> delegate, + gfx::NativeView parent) { views::Widget* widget = new CaptivePortalWidget(profile); views::Widget::InitParams params; - params.delegate = delegate; + params.delegate = delegate.release(); params.child = true; params.parent = parent; params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; @@ -100,11 +101,14 @@ InitCaptivePortalView(); - CaptivePortalView* portal = captive_portal_view_.release(); + std::unique_ptr<views::WidgetDelegate> delegate = + captive_portal_view_->MakeWidgetDelegate(); + CaptivePortalView* portal = + delegate->SetContentsView(std::move(captive_portal_view_)); auto* manager = web_modal::WebContentsModalDialogManager::FromWebContents(web_contents_); widget_ = CreateWindowAsFramelessChild( - profile_, portal, + profile_, std::move(delegate), manager->delegate()->GetWebContentsModalDialogHost()->GetHostView()); portal->Init(); widget_->AddObserver(this);
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc index 602ad27..8ddb9e4 100644 --- a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc +++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -139,4 +139,9 @@ return false; } +void FakeLoginDisplayHost::AddObserver(LoginDisplayHost::Observer* observer) {} + +void FakeLoginDisplayHost::RemoveObserver( + LoginDisplayHost::Observer* observer) {} + } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h index 43f217e..d524629 100644 --- a/chrome/browser/chromeos/login/ui/fake_login_display_host.h +++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -66,6 +66,8 @@ void UpdateAddUserButtonStatus() override; void RequestSystemInfoUpdate() override; bool HasUserPods() override; + void AddObserver(LoginDisplayHost::Observer* observer) override; + void RemoveObserver(LoginDisplayHost::Observer* observer) override; private: class FakeBaseScreen;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h index 479f7e5..1ab1fa4 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host.h +++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -11,6 +11,7 @@ #include "ash/public/cpp/login_accelerators.h" #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" +#include "base/observer_list_types.h" #include "base/optional.h" #include "chrome/browser/chromeos/customization/customization_document.h" #include "chrome/browser/chromeos/login/auth/auth_prewarmer.h" @@ -30,6 +31,10 @@ class WebContents; } +namespace gfx { +class Rect; +} // namespace gfx + namespace chromeos { class KioskLaunchController; @@ -60,6 +65,12 @@ // - LoginDisplayHostWebUI is for OOBE, which is written in HTML/JS/CSS. class LoginDisplayHost { public: + class Observer : public base::CheckedObserver { + public: + // |bounds| is the WebDialogView's bounds in screen coordinate system. + virtual void WebDialogViewBoundsChanged(const gfx::Rect& bounds) = 0; + }; + // Returns the default LoginDisplayHost instance if it has been created. static LoginDisplayHost* default_host() { return default_host_; } @@ -202,6 +213,10 @@ // Returns if the device has any user after filtering based on policy. virtual bool HasUserPods() = 0; + // Used to add an observer for the changes in the web dilaog login view. + virtual void AddObserver(Observer* observer) = 0; + virtual void RemoveObserver(Observer* observer) = 0; + protected: LoginDisplayHost(); virtual ~LoginDisplayHost();
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc index 83d88aa..42bd012 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -43,6 +43,7 @@ #include "components/user_manager/user_names.h" #include "google_apis/gaia/gaia_auth_util.h" #include "ui/aura/window.h" +#include "ui/views/view.h" namespace chromeos { @@ -360,6 +361,15 @@ return user_count_ > 0; } +void LoginDisplayHostMojo::AddObserver(LoginDisplayHost::Observer* observer) { + observers_.AddObserver(observer); +} + +void LoginDisplayHostMojo::RemoveObserver( + LoginDisplayHost::Observer* observer) { + observers_.RemoveObserver(observer); +} + void LoginDisplayHostMojo::OnCancelPasswordChangedFlow() { HideOobeDialog(); } @@ -505,6 +515,18 @@ StopObservingOobeUI(); } +// views::ViewObserver: +void LoginDisplayHostMojo::OnViewBoundsChanged(views::View* observed_view) { + DCHECK(scoped_observer_.IsObserving(observed_view)); + for (auto& observer : observers_) + observer.WebDialogViewBoundsChanged(observed_view->GetBoundsInScreen()); +} + +void LoginDisplayHostMojo::OnViewIsDeleting(views::View* observed_view) { + DCHECK(scoped_observer_.IsObserving(observed_view)); + scoped_observer_.Remove(observed_view); +} + bool LoginDisplayHostMojo::IsOobeUIDialogVisible() const { return dialog_ && dialog_->IsVisible(); } @@ -516,6 +538,9 @@ dialog_ = new OobeUIDialogDelegate(weak_factory_.GetWeakPtr()); dialog_->GetOobeUI()->signin_screen_handler()->SetDelegate( login_display_.get()); + + views::View* web_dialog_view = dialog_->GetWebDialogView(); + scoped_observer_.Add(web_dialog_view); } void LoginDisplayHostMojo::OnChallengeResponseKeysPrepared(
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h index 5ee2ba6f..6bbe6dd 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h +++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -12,7 +12,9 @@ #include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" +#include "base/observer_list.h" #include "base/optional.h" +#include "base/scoped_observer.h" #include "chrome/browser/chromeos/login/challenge_response_auth_keys_loader.h" #include "chrome/browser/chromeos/login/security_token_pin_dialog_host_ash_impl.h" #include "chrome/browser/chromeos/login/ui/login_display_host_common.h" @@ -21,6 +23,12 @@ #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chromeos/login/auth/auth_status_consumer.h" #include "chromeos/login/auth/challenge_response_key.h" +#include "ui/views/view.h" +#include "ui/views/view_observer.h" + +namespace views { +class View; +} // namespace views namespace chromeos { @@ -36,7 +44,8 @@ class LoginDisplayHostMojo : public LoginDisplayHostCommon, public LoginScreenClient::Delegate, public AuthStatusConsumer, - public OobeUI::Observer { + public OobeUI::Observer, + public views::ViewObserver { public: enum class DisplayedScreen { SIGN_IN_SCREEN, USER_ADDING_SCREEN }; @@ -89,6 +98,8 @@ void UpdateAddUserButtonStatus() override; void RequestSystemInfoUpdate() override; bool HasUserPods() override; + void AddObserver(LoginDisplayHost::Observer* observer) override; + void RemoveObserver(LoginDisplayHost::Observer* observer) override; // LoginScreenClient::Delegate: void HandleAuthenticateUserWithPasswordOrPin( @@ -122,6 +133,10 @@ OobeScreenId new_screen) override; void OnDestroyingOobeUI() override; + // views::ViewObserver: + void OnViewBoundsChanged(views::View* observed_view) override; + void OnViewIsDeleting(views::View* observed_view) override; + // TODO(https://crbug.com/1103564) This function needed to isolate error // messages on the Views and WebUI side. Consider removing. bool IsOobeUIDialogVisible() const; @@ -203,6 +218,10 @@ // Store which screen is currently displayed. DisplayedScreen displayed_screen_ = DisplayedScreen::SIGN_IN_SCREEN; + ScopedObserver<views::View, views::ViewObserver> scoped_observer_{this}; + + base::ObserverList<LoginDisplayHost::Observer> observers_; + base::WeakPtrFactory<LoginDisplayHostMojo> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(LoginDisplayHostMojo);
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc index a622cbd9..cab13f4 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -1028,6 +1028,11 @@ return false; } +void LoginDisplayHostWebUI::AddObserver(LoginDisplayHost::Observer* observer) {} + +void LoginDisplayHostWebUI::RemoveObserver( + LoginDisplayHost::Observer* observer) {} + void LoginDisplayHostWebUI::PlayStartupSoundIfPossible() { if (!need_to_play_startup_sound_ || oobe_startup_sound_played_) return;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.h b/chrome/browser/chromeos/login/ui/login_display_host_webui.h index de16a05e..21b117e 100644 --- a/chrome/browser/chromeos/login/ui/login_display_host_webui.h +++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
@@ -88,6 +88,8 @@ void RequestSystemInfoUpdate() override; void OnCancelPasswordChangedFlow() override; bool HasUserPods() override; + void AddObserver(LoginDisplayHost::Observer* observer) override; + void RemoveObserver(LoginDisplayHost::Observer* observer) override; // Trace id for ShowLoginWebUI event (since there exists at most one login // WebUI at a time).
diff --git a/chrome/browser/chromeos/login/ui/mock_login_display_host.h b/chrome/browser/chromeos/login/ui/mock_login_display_host.h index 55b61c5..a9f5548 100644 --- a/chrome/browser/chromeos/login/ui/mock_login_display_host.h +++ b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
@@ -89,6 +89,8 @@ MOCK_METHOD(void, UpdateAddUserButtonStatus, (), (override)); MOCK_METHOD(void, RequestSystemInfoUpdate, (), (override)); MOCK_METHOD(bool, HasUserPods, (), (override)); + MOCK_METHOD(void, AddObserver, (LoginDisplayHost::Observer*), (override)); + MOCK_METHOD(void, RemoveObserver, (LoginDisplayHost::Observer*), (override)); private: DISALLOW_COPY_AND_ASSIGN(MockLoginDisplayHost);
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc index bc870bdb..27fc1def 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.cc
@@ -434,6 +434,10 @@ return widget_ ? widget_->GetNativeWindow() : nullptr; } +views::View* OobeUIDialogDelegate::GetWebDialogView() { + return dialog_view_; +} + ui::ModalType OobeUIDialogDelegate::GetDialogModalType() const { return ui::MODAL_TYPE_WINDOW; }
diff --git a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h index ad1e014..92005cdc 100644 --- a/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h +++ b/chrome/browser/chromeos/login/ui/oobe_ui_dialog_delegate.h
@@ -83,6 +83,8 @@ OobeUI* GetOobeUI() const; gfx::NativeWindow GetNativeWindow() const; + views::View* GetWebDialogView(); + private: // ui::WebDialogDelegate: ui::ModalType GetDialogModalType() const override;
diff --git a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc index 310607a9..892a6ef 100644 --- a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc +++ b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc
@@ -37,6 +37,7 @@ #include "ui/views/layout/grid_layout.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_delegate.h" using content::WebContents; using views::GridLayout; @@ -246,14 +247,6 @@ Layout(); } -void SimpleWebViewDialog::Layout() { - views::WidgetDelegateView::Layout(); -} - -views::View* SimpleWebViewDialog::GetInitiallyFocusedView() { - return web_view_; -} - void SimpleWebViewDialog::ButtonPressed(views::Button* sender, const ui::Event& event) { command_updater_->ExecuteCommand(sender->tag()); @@ -335,6 +328,14 @@ } } +std::unique_ptr<views::WidgetDelegate> +SimpleWebViewDialog::MakeWidgetDelegate() { + auto delegate = std::make_unique<views::WidgetDelegate>(); + delegate->SetInitiallyFocusedView(web_view_); + delegate->SetOwnedByWidget(true); + return delegate; +} + void SimpleWebViewDialog::LoadImages() { const ui::ThemeProvider* tp = GetThemeProvider();
diff --git a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h index 93dd89b..01d880c 100644 --- a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h +++ b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h
@@ -15,7 +15,6 @@ #include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents_delegate.h" #include "ui/views/controls/button/image_button.h" -#include "ui/views/widget/widget_delegate.h" #include "url/gurl.h" class CommandUpdaterImpl; @@ -26,6 +25,7 @@ namespace views { class WebView; class Widget; +class WidgetDelegate; } // namespace views namespace chromeos { @@ -38,7 +38,7 @@ // to be used for sign in to captive portal on login screen (when Browser // isn't running). class SimpleWebViewDialog : public views::ButtonListener, - public views::WidgetDelegateView, + public views::View, public LocationBarView::Delegate, public ChromeLocationBarModelDelegate, public CommandUpdaterDelegate, @@ -54,12 +54,6 @@ // Inits view. Should be attached to a Widget before call. void Init(); - // Overridden from views::View: - void Layout() override; - - // Overridden from views::WidgetDelegate: - views::View* GetInitiallyFocusedView() override; - // Implements views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; @@ -85,6 +79,8 @@ // Implements CommandUpdaterDelegate: void ExecuteCommandWithDisposition(int id, WindowOpenDisposition) override; + virtual std::unique_ptr<views::WidgetDelegate> MakeWidgetDelegate(); + private: friend class SimpleWebViewDialogTest;
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 8c76c3f6..ba49604d 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -58,6 +58,7 @@ #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h" #include "chrome/browser/chromeos/login/screens/device_disabled_screen.h" #include "chrome/browser/chromeos/login/screens/discover_screen.h" +#include "chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h" #include "chrome/browser/chromeos/login/screens/enable_adb_sideloading_screen.h" #include "chrome/browser/chromeos/login/screens/enable_debugging_screen.h" #include "chrome/browser/chromeos/login/screens/encryption_migration_screen.h" @@ -670,6 +671,10 @@ base::BindRepeating(&WizardController::OnActiveDirectoryLoginScreenExit, weak_factory_.GetWeakPtr()))); + append(std::make_unique<EduCoexistenceLoginScreen>( + base::BindRepeating(&WizardController::OnEduCoexistenceLoginScreenExit, + weak_factory_.GetWeakPtr()))); + return result; } @@ -847,6 +852,10 @@ SetCurrentScreen(GetScreen(PackagedLicenseView::kScreenId)); } +void WizardController::ShowEduCoexistenceLoginScreen() { + SetCurrentScreen(GetScreen(EduCoexistenceLoginScreen::kScreenId)); +} + void WizardController::ShowActiveDirectoryPasswordChangeScreen( const std::string& username) { ActiveDirectoryPasswordChangeScreen::Get(screen_manager()) @@ -910,6 +919,13 @@ LoginDisplayHost::default_host()->HideOobeDialog(); } +void WizardController::OnEduCoexistenceLoginScreenExit( + EduCoexistenceLoginScreen::Result result) { + OnScreenExit(EduCoexistenceLoginScreen::kScreenId, + EduCoexistenceLoginScreen::GetResultString(result)); + ShowSyncConsentScreen(); +} + void WizardController::SkipToLoginForTesting() { VLOG(1) << "WizardController::SkipToLoginForTesting()"; if (current_screen_ && current_screen_->screen_id() == GaiaView::kScreenId) @@ -1279,7 +1295,8 @@ FamilyLinkNoticeScreen::Result result) { OnScreenExit(FamilyLinkNoticeView::kScreenId, FamilyLinkNoticeScreen::GetResultString(result)); - ShowSyncConsentScreen(); + + ShowEduCoexistenceLoginScreen(); } void WizardController::OnSyncConsentScreenExit( @@ -1873,6 +1890,7 @@ default_controller()->current_screen()->screen_id(); if (current_screen_id == TermsOfServiceScreenView::kScreenId || current_screen_id == FamilyLinkNoticeView::kScreenId || + current_screen_id == EduCoexistenceLoginScreen::kScreenId || current_screen_id == SyncConsentScreenView::kScreenId || current_screen_id == FingerprintSetupScreenView::kScreenId || current_screen_id == ArcTermsOfServiceScreenView::kScreenId ||
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h index d2d30bb..1eb32ca4 100644 --- a/chrome/browser/chromeos/login/wizard_controller.h +++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -28,6 +28,7 @@ #include "chrome/browser/chromeos/login/screens/demo_preferences_screen.h" #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h" #include "chrome/browser/chromeos/login/screens/discover_screen.h" +#include "chrome/browser/chromeos/login/screens/edu_coexistence_login_screen.h" #include "chrome/browser/chromeos/login/screens/enable_adb_sideloading_screen.h" #include "chrome/browser/chromeos/login/screens/enable_debugging_screen.h" #include "chrome/browser/chromeos/login/screens/eula_screen.h" @@ -248,6 +249,7 @@ void ShowDiscoverScreen(); void ShowMarketingOptInScreen(); void ShowPackagedLicenseScreen(); + void ShowEduCoexistenceLoginScreen(); // Shows images login screen. void ShowLoginScreen(); @@ -306,6 +308,8 @@ void OnUserCreationScreenExit(UserCreationScreen::Result result); void OnGaiaScreenExit(GaiaScreen::Result result); void OnActiveDirectoryLoginScreenExit(); + void OnEduCoexistenceLoginScreenExit( + EduCoexistenceLoginScreen::Result result); // Callback invoked once it has been determined whether the device is disabled // or not.
diff --git a/chrome/browser/chromeos/net/network_diagnostics/README.md b/chrome/browser/chromeos/net/network_diagnostics/README.md index 8d82f7f..98f9a5b 100644 --- a/chrome/browser/chromeos/net/network_diagnostics/README.md +++ b/chrome/browser/chromeos/net/network_diagnostics/README.md
@@ -69,7 +69,7 @@ above the threshold. * `kUnsuccessfulNonDefaultNetworksPings`: One or more of the non-default networks has failed pings. -* `kNonDefaultNetworksAboveLatencyThreshold`: One of more of the non-default +* `kNonDefaultNetworksAboveLatencyThreshold`: One or more of the non-default networks has a latency above the threshold. #### HasSecureWiFiConnection
diff --git a/chrome/browser/chromeos/net/network_portal_detector_impl.h b/chrome/browser/chromeos/net/network_portal_detector_impl.h index de970cf5..51506ae9 100644 --- a/chrome/browser/chromeos/net/network_portal_detector_impl.h +++ b/chrome/browser/chromeos/net/network_portal_detector_impl.h
@@ -28,8 +28,6 @@ #include "content/public/browser/notification_registrar.h" #include "url/gurl.h" -class NetworkingConfigTest; - namespace base { class Value; } @@ -58,7 +56,6 @@ ~NetworkPortalDetectorImpl() override; private: - friend class ::NetworkingConfigTest; friend class NetworkPortalDetectorImplTest; friend class NetworkPortalDetectorImplBrowserTest;
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc index fccc2af..b203299 100644 --- a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc +++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.cc
@@ -112,14 +112,13 @@ return state_ != State::kIdle; } -void PluginVmInstaller::Start() { +base::Optional<PluginVmInstaller::FailureReason> PluginVmInstaller::Start() { if (IsProcessing()) { LOG(ERROR) << "Download of a PluginVm image couldn't be started as" << " another PluginVm image is currently being processed " << "in state " << GetStateName(state_) << ", " << GetInstallingStateName(installing_state_); - InstallFailed(FailureReason::OPERATION_IN_PROGRESS); - return; + return FailureReason::OPERATION_IN_PROGRESS; } // Defensive check preventing any download attempts when PluginVm is @@ -128,18 +127,26 @@ if (!PluginVmFeatures::Get()->IsAllowed(profile_)) { LOG(ERROR) << "Download of PluginVm image cannot be started because " << "the user is not allowed to run PluginVm"; - InstallFailed(FailureReason::NOT_ALLOWED); - return; + return FailureReason::NOT_ALLOWED; } - if (content::GetNetworkConnectionTracker()->IsOffline()) { - InstallFailed(FailureReason::OFFLINE); - return; - } + if (content::GetNetworkConnectionTracker()->IsOffline()) + return FailureReason::OFFLINE; + // Request wake lock when state_ goes to kInstalling, and cancel it when state + // goes back to kIdle. + GetWakeLock()->RequestWakeLock(); + state_ = State::kInstalling; setup_start_tick_ = base::TimeTicks::Now(); progress_ = 0; - CheckLicense(); + + // Perform the first step asynchronously to ensure OnError() isn't called + // before Start() returns. + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(&PluginVmInstaller::CheckLicense, + weak_ptr_factory_.GetWeakPtr())); + + return base::nullopt; } void PluginVmInstaller::Cancel() { @@ -173,10 +180,6 @@ } void PluginVmInstaller::CheckLicense() { - // Request wake lock when state_ goes to kInstalling, and cancel it when state - // goes back to kIdle. - GetWakeLock()->RequestWakeLock(); - state_ = State::kInstalling; UpdateInstallingState(InstallingState::kCheckingLicense); // If the server has provided a license key, responsibility of validating is
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h index ed25d09..3762199 100644 --- a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h +++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer.h
@@ -112,7 +112,8 @@ bool IsProcessing(); // Start the installation. Progress updates will be sent to the observer. - void Start(); + // Returns a FailureReason if the installation couldn't be started. + base::Optional<FailureReason> Start(); // Cancel the installation. void Cancel();
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc index ef29685..50e398c 100644 --- a/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc +++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_installer_unittest.cc
@@ -624,8 +624,7 @@ TEST_F(PluginVmInstallerDownloadServiceTest, CannotStartIfPluginVmIsDisabled) { profile_->ScopedCrosSettingsTestHelper()->SetBoolean( chromeos::kPluginVmAllowed, false); - EXPECT_CALL(*observer_, OnError(FailureReason::NOT_ALLOWED)); - installer_->Start(); + EXPECT_EQ(FailureReason::NOT_ALLOWED, installer_->Start()); task_environment_.RunUntilIdle(); }
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc index d169bcd..a5e655aa 100644 --- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc +++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -35,7 +35,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/lock.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" #include "base/values.h" @@ -103,7 +102,6 @@ #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc index 6143255..28e8e2b 100644 --- a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc +++ b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
@@ -27,7 +27,6 @@ #include "chrome/browser/chromeos/policy/device_local_account_policy_store.h" #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chrome/common/chrome_content_client.h" -#include "chrome/common/chrome_features.h" #include "chromeos/constants/chromeos_paths.h" #include "chromeos/dbus/session_manager/session_manager_client.h" #include "chromeos/settings/cros_settings_names.h"
diff --git a/chrome/browser/chromeos/policy/status_collector/child_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/child_status_collector.cc index d5f1c3a..5640ff8 100644 --- a/chrome/browser/chromeos/policy/status_collector/child_status_collector.cc +++ b/chrome/browser/chromeos/policy/status_collector/child_status_collector.cc
@@ -35,7 +35,6 @@ #include "chrome/browser/chromeos/policy/status_collector/status_collector_state.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chromeos/dbus/util/version_loader.h" #include "chromeos/login/login_state/login_state.h"
diff --git a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc index 25481d7a..e0e7f943 100644 --- a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc +++ b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc
@@ -86,7 +86,7 @@ gfx::Size IdleActionWarningDialogView::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size( default_width, GetLayoutManager()->GetPreferredHeightForWidth(this, default_width));
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc index f5e3caaf..c760309 100644 --- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc +++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -27,7 +27,6 @@ #include "chrome/browser/chromeos/printing/test_printer_configurer.h" #include "chrome/browser/chromeos/printing/usb_printer_detector.h" #include "chrome/browser/chromeos/printing/usb_printer_notification_controller.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" #include "components/sync_preferences/testing_pref_service_syncable.h"
diff --git a/chrome/browser/chromeos/printing/print_management/printing_manager_unittest.cc b/chrome/browser/chromeos/printing/print_management/printing_manager_unittest.cc index 6406208..d2e4041 100644 --- a/chrome/browser/chromeos/printing/print_management/printing_manager_unittest.cc +++ b/chrome/browser/chromeos/printing/print_management/printing_manager_unittest.cc
@@ -8,7 +8,6 @@ #include "base/memory/scoped_refptr.h" #include "base/scoped_observer.h" #include "base/task/cancelable_task_tracker.h" -#include "base/test/scoped_feature_list.h" #include "base/test/test_mock_time_task_runner.h" #include "chrome/browser/chromeos/printing/cups_print_job.h" #include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h"
diff --git a/chrome/browser/chromeos/printing/printer_configurer.cc b/chrome/browser/chromeos/printing/printer_configurer.cc index d007a54..2e037b08 100644 --- a/chrome/browser/chromeos/printing/printer_configurer.cc +++ b/chrome/browser/chromeos/printing/printer_configurer.cc
@@ -24,7 +24,6 @@ #include "chrome/browser/chromeos/printing/ppd_provider_factory.h" #include "chrome/browser/component_updater/cros_component_installer_chromeos.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/webui_url_constants.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/debug_daemon/debug_daemon_client.h"
diff --git a/chrome/browser/chromeos/printing/synced_printers_manager.cc b/chrome/browser/chromeos/printing/synced_printers_manager.cc index 9145c12..d2aaaa867 100644 --- a/chrome/browser/chromeos/printing/synced_printers_manager.cc +++ b/chrome/browser/chromeos/printing/synced_printers_manager.cc
@@ -18,7 +18,6 @@ #include "chrome/browser/chromeos/printing/printers_sync_bridge.h" #include "chrome/browser/chromeos/printing/specifics_translation.h" #include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chromeos/printing/printer_configuration.h" #include "chromeos/printing/printer_translator.h"
diff --git a/chrome/browser/chromeos/smb_client/smb_service_factory.cc b/chrome/browser/chromeos/smb_client/smb_service_factory.cc index 008093e..8ba490b 100644 --- a/chrome/browser/chromeos/smb_client/smb_service_factory.cc +++ b/chrome/browser/chromeos/smb_client/smb_service_factory.cc
@@ -14,7 +14,6 @@ #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/smb_client/smb_service.h" #include "chrome/browser/profiles/incognito_helpers.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/ui/echo_dialog_view.cc b/chrome/browser/chromeos/ui/echo_dialog_view.cc index 17cccf1..841ca29 100644 --- a/chrome/browser/chromeos/ui/echo_dialog_view.cc +++ b/chrome/browser/chromeos/ui/echo_dialog_view.cc
@@ -122,7 +122,7 @@ gfx::Size EchoDialogView::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size( default_width, GetLayoutManager()->GetPreferredHeightForWidth(this, default_width));
diff --git a/chrome/browser/chromeos/ui/request_pin_view.cc b/chrome/browser/chromeos/ui/request_pin_view.cc index 4a7dab0..1df55754 100644 --- a/chrome/browser/chromeos/ui/request_pin_view.cc +++ b/chrome/browser/chromeos/ui/request_pin_view.cc
@@ -117,7 +117,7 @@ gfx::Size RequestPinView::CalculatePreferredSize() const { int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(default_width, GetHeightForWidth(default_width)); }
diff --git a/chrome/browser/component_updater/pepper_flash_component_installer.cc b/chrome/browser/component_updater/pepper_flash_component_installer.cc index 47420e0..ca2f698 100644 --- a/chrome/browser/component_updater/pepper_flash_component_installer.cc +++ b/chrome/browser/component_updater/pepper_flash_component_installer.cc
@@ -4,392 +4,26 @@ #include "chrome/browser/component_updater/pepper_flash_component_installer.h" -#include <stddef.h> - -#include <memory> -#include <string> -#include <utility> -#include <vector> - -#include "base/base_paths.h" #include "base/bind.h" -#include "base/command_line.h" #include "base/files/file_path.h" #include "base/files/file_util.h" -#include "base/json/json_reader.h" -#include "base/logging.h" -#include "base/memory/ref_counted.h" #include "base/path_service.h" -#include "base/stl_util.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" +#include "base/task/task_traits.h" #include "base/task/thread_pool.h" -#include "base/version.h" -#include "build/branding_buildflags.h" -#include "build/build_config.h" -#include "chrome/browser/component_updater/component_installer_errors.h" -#include "chrome/browser/plugins/plugin_prefs.h" -#include "chrome/common/chrome_constants.h" -#include "chrome/common/chrome_content_client.h" -#include "chrome/common/chrome_paths.h" -#include "chrome/common/chrome_switches.h" -#include "chrome/common/pepper_flash.h" -#include "chrome/common/ppapi_utils.h" -#include "components/component_updater/component_installer.h" -#include "components/component_updater/component_updater_service.h" -#include "components/update_client/update_client.h" -#include "components/update_client/update_client_errors.h" -#include "components/update_client/utils.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/plugin_service.h" -#include "content/public/common/content_constants.h" -#include "content/public/common/pepper_plugin_info.h" -#include "crypto/sha2.h" -#include "ppapi/shared_impl/ppapi_permissions.h" - -#if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/settings/cros_settings.h" -#include "chrome/browser/ui/ash/system_tray_client.h" -#include "chrome/common/chrome_features.h" -#include "chromeos/dbus/dbus_method_call_status.h" -#include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/image_loader_client.h" -#elif defined(OS_LINUX) || defined(OS_CHROMEOS) -#include "chrome/common/component_flash_hint_file_linux.h" -#endif // defined(OS_CHROMEOS) - -using content::BrowserThread; -using content::PluginService; +#include "components/component_updater/component_updater_paths.h" namespace component_updater { -namespace { - -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -#if defined(OS_CHROMEOS) -// CRX hash for Chrome OS. The extension id is: -// ckjlcfmdbdglblbjglepgnoekdnkoklc. -const uint8_t kFlashSha2Hash[] = { - 0x2a, 0x9b, 0x25, 0xc3, 0x13, 0x6b, 0x1b, 0x19, 0x6b, 0x4f, 0x6d, - 0xe4, 0xa3, 0xda, 0xea, 0xb2, 0x67, 0xeb, 0xf0, 0xbb, 0x1f, 0x48, - 0xa2, 0x73, 0xea, 0x47, 0x11, 0xc8, 0x2b, 0xd9, 0x03, 0xb5}; -#else -// CRX hash. The extension id is: mimojjlkmoijpicakmndhoigimigcmbb. -const uint8_t kFlashSha2Hash[] = { - 0xc8, 0xce, 0x99, 0xba, 0xce, 0x89, 0xf8, 0x20, 0xac, 0xd3, 0x7e, - 0x86, 0x8c, 0x86, 0x2c, 0x11, 0xb9, 0x40, 0xc5, 0x55, 0xaf, 0x08, - 0x63, 0x70, 0x54, 0xf9, 0x56, 0xd3, 0xe7, 0x88, 0xba, 0x8c}; -#endif // defined(OS_CHROMEOS) -static_assert(base::size(kFlashSha2Hash) == crypto::kSHA256Length, - "Wrong hash length"); - -#if defined(OS_CHROMEOS) -void LogRegistrationResult(base::Optional<bool> result) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!result.has_value()) { - LOG(ERROR) << "Call to imageloader service failed."; +void CleanUpPepperFlashComponent() { + base::FilePath component_dir; + if (!base::PathService::Get(DIR_COMPONENT_USER, &component_dir)) return; - } - if (!result.value()) { - LOG(ERROR) << "Component flash registration failed"; - return; - } - SystemTrayClient* tray = SystemTrayClient::Get(); - if (tray) { - tray->SetFlashUpdateAvailable(); - } -} - -void ImageLoaderRegistration(const std::string& version, - const base::FilePath& install_dir) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - chromeos::ImageLoaderClient* loader = - chromeos::DBusThreadManager::Get()->GetImageLoaderClient(); - - if (loader) { - loader->RegisterComponent("PepperFlashPlayer", version, install_dir.value(), - base::BindOnce(&LogRegistrationResult)); - } else { - LOG(ERROR) << "Failed to get ImageLoaderClient object."; - } -} - -// Determine whether or not to skip registering flash component updates. -bool SkipFlashRegistration(ComponentUpdateService* cus) { - if (!base::FeatureList::IsEnabled(features::kCrosCompUpdates)) - return true; - - // If the version of Chrome is pinned on the device (probably via enterprise - // policy), do not component update Flash player. - chromeos::CrosSettingsProvider::TrustedStatus status = - chromeos::CrosSettings::Get()->PrepareTrustedValues( - base::Bind(&RegisterPepperFlashComponent, cus)); - - // Only if the settings are trusted, read the update settings and allow them - // to disable Flash component updates. If the settings are untrusted, then we - // fail-safe and allow the security updates. - std::string version_prefix; - bool update_disabled = false; - switch (status) { - case chromeos::CrosSettingsProvider::TEMPORARILY_UNTRUSTED: - // Return and allow flash registration to occur once the settings are - // trusted. - return true; - case chromeos::CrosSettingsProvider::TRUSTED: - chromeos::CrosSettings::Get()->GetBoolean(chromeos::kUpdateDisabled, - &update_disabled); - chromeos::CrosSettings::Get()->GetString(chromeos::kTargetVersionPrefix, - &version_prefix); - - return update_disabled || !version_prefix.empty(); - case chromeos::CrosSettingsProvider::PERMANENTLY_UNTRUSTED: - return false; - } - - // Default to not skipping component flash registration since updates are - // security critical. - return false; -} -#endif // defined(OS_CHROMEOS) -#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) - -#if (!defined(OS_LINUX) && !defined(OS_CHROMEOS)) && \ - BUILDFLAG(GOOGLE_CHROME_BRANDING) -bool MakePepperFlashPluginInfo(const base::FilePath& flash_path, - const base::Version& flash_version, - bool out_of_process, - content::PepperPluginInfo* plugin_info) { - if (!flash_version.IsValid()) - return false; - const std::vector<uint32_t> ver_nums = flash_version.components(); - if (ver_nums.size() < 3) - return false; - - plugin_info->is_internal = false; - plugin_info->is_out_of_process = out_of_process; - plugin_info->path = flash_path; - plugin_info->name = content::kFlashPluginName; - plugin_info->permissions = kPepperFlashPermissions; - - // The description is like "Shockwave Flash 10.2 r154". - plugin_info->description = base::StringPrintf("%s %d.%d r%d", - content::kFlashPluginName, - ver_nums[0], - ver_nums[1], - ver_nums[2]); - - plugin_info->version = flash_version.GetString(); - - content::WebPluginMimeType swf_mime_type(content::kFlashPluginSwfMimeType, - content::kFlashPluginSwfExtension, - content::kFlashPluginName); - plugin_info->mime_types.push_back(swf_mime_type); - content::WebPluginMimeType spl_mime_type(content::kFlashPluginSplMimeType, - content::kFlashPluginSplExtension, - content::kFlashPluginName); - plugin_info->mime_types.push_back(spl_mime_type); - return true; -} - -// |path| is the path to the latest Chrome-managed Flash installation (bundled -// or component updated). -// |version| is the version of that Flash implementation. -void RegisterPepperFlashWithChrome(const base::FilePath& path, - const base::Version& version) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - content::PepperPluginInfo plugin_info; - if (!MakePepperFlashPluginInfo(path, version, true, &plugin_info)) - return; - content::WebPluginInfo web_plugin = plugin_info.ToWebPluginInfo(); - - base::FilePath system_flash_path; - base::PathService::Get(chrome::FILE_PEPPER_FLASH_SYSTEM_PLUGIN, - &system_flash_path); - - std::vector<content::WebPluginInfo> plugins; - PluginService::GetInstance()->GetInternalPlugins(&plugins); - for (const auto& plugin : plugins) { - if (!plugin.is_pepper_plugin() || plugin.name != web_plugin.name) - continue; - - if (plugin.path.value() == ChromeContentClient::kNotPresent) { - // This is the Flash placeholder; replace it regardless of version or - // other considerations. - PluginService::GetInstance()->UnregisterInternalPlugin(plugin.path); - break; - } - - base::Version registered_version(base::UTF16ToUTF8(plugin.version)); - - // If lower or equal version, never register. - if (registered_version.IsValid() && - version.CompareTo(registered_version) <= 0) { - return; - } - - // If the version is newer, remove the old one first. - PluginService::GetInstance()->UnregisterInternalPlugin(plugin.path); - break; - } - - PluginService::GetInstance()->RegisterInternalPlugin(web_plugin, true); - PluginService::GetInstance()->RefreshPlugins(); -} - -void UpdatePathService(const base::FilePath& path) { - base::PathService::Override(chrome::DIR_PEPPER_FLASH_PLUGIN, path); -} -#endif // (!defined(OS_LINUX) && !defined(OS_CHROMEOS)) && - // BUILDFLAG(GOOGLE_CHROME_BRANDING) - -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) -class FlashComponentInstallerPolicy : public ComponentInstallerPolicy { - public: - FlashComponentInstallerPolicy(); - ~FlashComponentInstallerPolicy() override = default; - - private: - // The following methods override ComponentInstallerPolicy. - bool SupportsGroupPolicyEnabledComponentUpdates() const override; - bool RequiresNetworkEncryption() const override; - update_client::CrxInstaller::Result OnCustomInstall( - const base::DictionaryValue& manifest, - const base::FilePath& install_dir) override; - void OnCustomUninstall() override; - bool VerifyInstallation(const base::DictionaryValue& manifest, - const base::FilePath& install_dir) const override; - void ComponentReady(const base::Version& version, - const base::FilePath& path, - std::unique_ptr<base::DictionaryValue> manifest) override; - base::FilePath GetRelativeInstallDir() const override; - void GetHash(std::vector<uint8_t>* hash) const override; - std::string GetName() const override; - update_client::InstallerAttributes GetInstallerAttributes() const override; - std::vector<std::string> GetMimeTypes() const override; - - DISALLOW_COPY_AND_ASSIGN(FlashComponentInstallerPolicy); -}; - -FlashComponentInstallerPolicy::FlashComponentInstallerPolicy() = default; - -bool FlashComponentInstallerPolicy::SupportsGroupPolicyEnabledComponentUpdates() - const { - return true; -} - -bool FlashComponentInstallerPolicy::RequiresNetworkEncryption() const { - return false; -} - -update_client::CrxInstaller::Result -FlashComponentInstallerPolicy::OnCustomInstall( - const base::DictionaryValue& manifest, - const base::FilePath& install_dir) { - std::string version; - if (!manifest.GetString("version", &version)) { - return update_client::ToInstallerResult( - FlashError::MISSING_VERSION_IN_MANIFEST); - } - -#if defined(OS_CHROMEOS) - content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce(&ImageLoaderRegistration, version, install_dir)); -#elif defined(OS_LINUX) || defined(OS_CHROMEOS) - const base::FilePath flash_path = - install_dir.Append(chrome::kPepperFlashPluginFilename); - // Populate the component updated flash hint file so that the zygote can - // locate and preload the latest version of flash. - if (!component_flash_hint_file::RecordFlashUpdate(flash_path, flash_path, - version)) { - return update_client::ToInstallerResult(FlashError::HINT_FILE_RECORD_ERROR); - } -#endif // defined(OS_LINUX) || defined(OS_CHROMEOS) - return update_client::CrxInstaller::Result(update_client::InstallError::NONE); -} - -void FlashComponentInstallerPolicy::OnCustomUninstall() {} - -void FlashComponentInstallerPolicy::ComponentReady( - const base::Version& version, - const base::FilePath& path, - std::unique_ptr<base::DictionaryValue> manifest) { -#if !defined(OS_LINUX) && !defined(OS_CHROMEOS) - // Installation is done. Now tell the rest of chrome. Both the path service - // and to the plugin service. On Linux, a restart is required to use the new - // Flash version, so we do not do this. - RegisterPepperFlashWithChrome(path.Append(chrome::kPepperFlashPluginFilename), - version); - base::ThreadPool::PostTask( - FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()}, - base::BindOnce(&UpdatePathService, path)); -#endif // !defined(OS_LINUX) && !defined(OS_CHROMEOS) -} - -bool FlashComponentInstallerPolicy::VerifyInstallation( - const base::DictionaryValue& manifest, - const base::FilePath& install_dir) const { - base::Version unused; - return CheckPepperFlashManifest(manifest, &unused); -} - -// The base directory on Windows looks like: -// <profile>\AppData\Local\Google\Chrome\User Data\PepperFlash\. -base::FilePath FlashComponentInstallerPolicy::GetRelativeInstallDir() const { - return base::FilePath(FILE_PATH_LITERAL("PepperFlash")); -} - -void FlashComponentInstallerPolicy::GetHash(std::vector<uint8_t>* hash) const { - hash->assign(kFlashSha2Hash, kFlashSha2Hash + base::size(kFlashSha2Hash)); -} - -std::string FlashComponentInstallerPolicy::GetName() const { - return "Adobe Flash Player"; -} - -update_client::InstallerAttributes -FlashComponentInstallerPolicy::GetInstallerAttributes() const { - // For Chrome OS, send the built-in flash player version to the server, - // otherwise it will serve component updates of outdated flash players. - update_client::InstallerAttributes attrs; -#if defined(OS_CHROMEOS) - const std::string flash_version = - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kPpapiFlashVersion); - attrs["built_in_version"] = flash_version; -#endif // #defined(OS_CHROMEOS) - return attrs; -} - -std::vector<std::string> FlashComponentInstallerPolicy::GetMimeTypes() const { - std::vector<std::string> mime_types; - mime_types.push_back("application/x-shockwave-flash"); - mime_types.push_back("application/futuresplash"); - return mime_types; -} -#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) - -} // namespace - -void RegisterPepperFlashComponent(ComponentUpdateService* cus) { -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - // Component updated flash supersedes bundled flash therefore if that one - // is disabled then this one should never install. - base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); - if (cmd_line->HasSwitch(switches::kDisableBundledPpapiFlash)) - return; - -#if defined(OS_CHROMEOS) - if (SkipFlashRegistration(cus)) - return; -#endif // defined(OS_CHROMEOS) - - auto installer = base::MakeRefCounted<ComponentInstaller>( - std::make_unique<FlashComponentInstallerPolicy>()); - installer->Register(cus, base::OnceClosure()); -#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) + base::ThreadPool::PostTask(FROM_HERE, {base::MayBlock()}, + base::BindOnce( + [](const base::FilePath& dir) -> void { + base::DeletePathRecursively(dir); + }, + component_dir.AppendASCII("PepperFlash"))); } } // namespace component_updater
diff --git a/chrome/browser/component_updater/pepper_flash_component_installer.h b/chrome/browser/component_updater/pepper_flash_component_installer.h index 6323ef6..e3f34c8 100644 --- a/chrome/browser/component_updater/pepper_flash_component_installer.h +++ b/chrome/browser/component_updater/pepper_flash_component_installer.h
@@ -7,12 +7,11 @@ namespace component_updater { -class ComponentUpdateService; - -// Our job is to 1) find what Pepper flash is installed (if any) and 2) register -// with the component updater to download the latest version when available. -// The first part is IO intensive so we do it asynchronously in the file thread. -void RegisterPepperFlashComponent(ComponentUpdateService* cus); +// Deletes any Flash component implementations that still reside on disk. +// Historically, Flash was delivered via component update. It has since been +// removed, but this function still is called to clean up any existing +// flash component files. +void CleanUpPepperFlashComponent(); } // namespace component_updater
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc index 9a3335a..f288d39 100644 --- a/chrome/browser/component_updater/registration.cc +++ b/chrome/browser/component_updater/registration.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/component_updater/mei_preload_component_installer.h" #include "chrome/browser/component_updater/optimization_hints_component_installer.h" #include "chrome/browser/component_updater/origin_trials_component_installer.h" +#include "chrome/browser/component_updater/pepper_flash_component_installer.h" #include "chrome/browser/component_updater/safety_tips_component_installer.h" #include "chrome/browser/component_updater/ssl_error_assistant_component_installer.h" #include "chrome/browser/component_updater/sth_set_component_remover.h" @@ -66,10 +67,6 @@ #include "chrome/browser/component_updater/pnacl_component_installer.h" #endif // BUILDFLAG(ENABLE_NACL) -#if BUILDFLAG(ENABLE_PLUGINS) -#include "chrome/browser/component_updater/pepper_flash_component_installer.h" -#endif - #if BUILDFLAG(ENABLE_VR) #include "chrome/browser/component_updater/vr_assets_component_installer.h" #endif @@ -99,9 +96,8 @@ RegisterRecoveryComponent(cus, g_browser_process->local_state()); #endif // defined(OS_WIN) -#if BUILDFLAG(ENABLE_PLUGINS) - RegisterPepperFlashComponent(cus); -#endif + // TODO(crbug.com/1069814): Remove after 2021-10-01. + CleanUpPepperFlashComponent(); #if BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT) RegisterWidevineCdmComponent(cus);
diff --git a/chrome/browser/contextmenu/BUILD.gn b/chrome/browser/contextmenu/BUILD.gn index 05af850..9556eaf 100644 --- a/chrome/browser/contextmenu/BUILD.gn +++ b/chrome/browser/contextmenu/BUILD.gn
@@ -9,17 +9,26 @@ android_library("java") { sources = [ "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate.java", + "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegate.java", + "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java", "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulator.java", "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory.java", ] + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] srcjar_deps = [ "//chrome:context_menu_image_format_enum_javagen" ] deps = [ "//base:base_java", + "//base:jni_java", + "//components/browser_ui/share/android:java", "//components/embedder_support/android:context_menu_java", "//content/public/android:content_java", "//third_party/android_deps:androidx_annotation_annotation_java", "//ui/android:ui_no_recycler_view_java", ] } + +generate_jni("jni_headers") { + sources = [ "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java" ] +}
diff --git a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegate.java b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegate.java new file mode 100644 index 0000000..53e9cbb3 --- /dev/null +++ b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegate.java
@@ -0,0 +1,48 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.contextmenu; + +import android.graphics.Bitmap; +import android.net.Uri; + +import org.chromium.base.Callback; + +/** + * Interface to handle context menu actions in native. + */ +public interface ContextMenuNativeDelegate { + /** + * Called when this {@link ContextMenuNativeDelegate} is being destroyed. + */ + void destroy(); + + /** + * Retrieves the image bitmap from the current {@link RenderFrameHost} that the context menu + * was triggered on to use in the context menu. + * @param maxWidthPx The maximum width for the retrieved bitmap in pixels. + * @param maxHeightPx The maximum height for the retrieved bitmap in pixels. + * @param callback The callback to be called with the retrieved bitmap. + */ + void retrieveImageForContextMenu(int maxWidthPx, int maxHeightPx, Callback<Bitmap> callback); + + /** + * Retrieves the image from the current {@link RenderFrameHost} that the context menu was + * triggered on, to be shared. + * @param imageFormat The image format that will be requested. + * @param callback The callback to be called with the retrieved image's {@link Uri}. + */ + void retrieveImageForShare(@ContextMenuImageFormat int imageFormat, Callback<Uri> callback); + + /** + * Starts a download based on the params. + * @param isLink Whether the download target is a link. + */ + void startDownload(boolean isLink); + + /** + * Does a reverse image search for the current image that the context menu was triggered on. + */ + void searchForImage(); +}
diff --git a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java new file mode 100644 index 0000000..7918bef7 --- /dev/null +++ b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuNativeDelegateImpl.java
@@ -0,0 +1,140 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.contextmenu; + +import android.graphics.Bitmap; +import android.net.Uri; + +import androidx.annotation.VisibleForTesting; + +import org.chromium.base.Callback; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.NativeMethods; +import org.chromium.components.browser_ui.share.ShareImageFileUtils; +import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; +import org.chromium.content_public.browser.RenderFrameHost; +import org.chromium.content_public.browser.WebContents; + +class ContextMenuNativeDelegateImpl implements ContextMenuNativeDelegate { + private static final int MAX_SHARE_DIMEN_PX = 2048; + + private long mNativePtr; + + /** + * See function for details. + */ + private static byte[] sHardcodedImageBytesForTesting; + private static String sHardcodedImageExtensionForTesting; + + /** + * The tests trigger the context menu via JS rather than via a true native call which means + * the native code does not have a reference to the image's render frame host. Instead allow + * test cases to hardcode the test image bytes that will be shared. + * @param hardcodedImageBytes The hard coded image bytes to fake or null if image should not be + * faked. + * @param hardcodedImageExtension The hard coded image extension. + */ + @VisibleForTesting + public static void setHardcodedImageBytesForTesting( + byte[] hardcodedImageBytes, String hardcodedImageExtension) { + sHardcodedImageBytesForTesting = hardcodedImageBytes; + sHardcodedImageExtensionForTesting = hardcodedImageExtension; + } + + public ContextMenuNativeDelegateImpl(WebContents webContents, RenderFrameHost renderFrameHost, + ContextMenuParams contextMenuParams) { + mNativePtr = ContextMenuNativeDelegateImplJni.get().init( + webContents, contextMenuParams, renderFrameHost); + } + + @Override + public void destroy() { + mNativePtr = 0; + } + + @Override + public void retrieveImageForShare(int imageFormat, Callback<Uri> callback) { + if (mNativePtr == 0) return; + + Callback<ImageCallbackResult> imageRetrieveCallback = (result) -> { + ShareImageFileUtils.generateTemporaryUriFromData( + result.imageData, result.extension, callback); + }; + + if (sHardcodedImageBytesForTesting != null) { + imageRetrieveCallback.onResult(createImageCallbackResultForTesting()); + } else { + ContextMenuNativeDelegateImplJni.get().retrieveImageForShare(mNativePtr, + ContextMenuNativeDelegateImpl.this, imageRetrieveCallback, MAX_SHARE_DIMEN_PX, + MAX_SHARE_DIMEN_PX, imageFormat); + } + } + + @Override + public void retrieveImageForContextMenu( + int maxWidthPx, int maxHeightPx, Callback<Bitmap> callback) { + if (mNativePtr == 0) return; + + ContextMenuNativeDelegateImplJni.get().retrieveImageForContextMenu( + mNativePtr, ContextMenuNativeDelegateImpl.this, callback, maxWidthPx, maxHeightPx); + } + + @Override + public void startDownload(boolean isLink) { + if (mNativePtr == 0) return; + + ContextMenuNativeDelegateImplJni.get().startDownload( + mNativePtr, ContextMenuNativeDelegateImpl.this, isLink); + } + + @Override + public void searchForImage() { + if (mNativePtr == 0) return; + + ContextMenuNativeDelegateImplJni.get().searchForImage( + mNativePtr, ContextMenuNativeDelegateImpl.this); + } + + /** + * The class hold the |retrieveImageForShare| callback result. + */ + @VisibleForTesting + static class ImageCallbackResult { + public byte[] imageData; + public String extension; + + public ImageCallbackResult(byte[] imageData, String extension) { + this.imageData = imageData; + this.extension = extension; + } + } + + private static ImageCallbackResult createImageCallbackResultForTesting() { + return new ImageCallbackResult( + sHardcodedImageBytesForTesting, sHardcodedImageExtensionForTesting); + } + + @CalledByNative + private static ImageCallbackResult createImageCallbackResult( + byte[] imageData, String extension) { + return new ImageCallbackResult(imageData, extension); + } + + @NativeMethods + interface Natives { + long init(WebContents webContents, ContextMenuParams contextMenuParams, + RenderFrameHost renderFrameHost); + void retrieveImageForShare(long nativeContextMenuNativeDelegateImpl, + ContextMenuNativeDelegateImpl caller, Callback<ImageCallbackResult> callback, + int maxWidthPx, int maxHeightPx, @ContextMenuImageFormat int imageFormat); + void retrieveImageForContextMenu(long nativeContextMenuNativeDelegateImpl, + ContextMenuNativeDelegateImpl caller, Callback<Bitmap> callback, int maxWidthPx, + int maxHeightPx); + void startDownload(long nativeContextMenuNativeDelegateImpl, + ContextMenuNativeDelegateImpl caller, boolean isLink); + void searchForImage( + long nativeContextMenuNativeDelegateImpl, ContextMenuNativeDelegateImpl caller); + } +}
diff --git a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulator.java b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulator.java index d76614ff..249e5e2 100644 --- a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulator.java +++ b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulator.java
@@ -4,11 +4,8 @@ package org.chromium.chrome.browser.contextmenu; -import android.graphics.Bitmap; -import android.net.Uri; import android.util.Pair; -import org.chromium.base.Callback; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import java.util.List; @@ -19,11 +16,6 @@ */ public interface ContextMenuPopulator { /** - * Called when this ContextMenuPopulator is about to be destroyed. - */ - void onDestroy(); - - /** * Should be used to populate {@code menu} with the correct context menu items. * @param isShoppyImage Whether the selected item was a shoppy image. * @return A list separate by groups. Each "group" will contain items related to said group as @@ -42,20 +34,6 @@ boolean onItemSelected(int itemId); /** - * Gets the thumbnail of the current image that triggered the context menu. - * @param callback Called once the the thumbnail is received. - */ - void getThumbnail(final Callback<Bitmap> callback); - - /** - * Retrieves a URI for the selected image for sharing with external apps. If the function fails - * to retrieve the image bytes or generate a URI the callback will *not* be called. - * @param imageFormat The image format will be requested. - * @param callback Called once the image is generated and ready to be shared. - */ - void retrieveImage(@ContextMenuImageFormat int imageFormat, Callback<Uri> callback); - - /** * Called when the context menu is closed. */ void onMenuClosed();
diff --git a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory.java b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory.java index 803685e9..0a68f0a 100644 --- a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory.java +++ b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuPopulatorFactory.java
@@ -7,7 +7,6 @@ import android.content.Context; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; -import org.chromium.content_public.browser.RenderFrameHost; /** * Factory interface for creating {@link ContextMenuPopulator}s. @@ -17,11 +16,11 @@ * Creates a {@ContextMenuPopulator}. * @param context The {@link Context} used to retrieve the strings. * @param params The {@link ContextMenuParams} used to build the context menu. - * @param renderFrameHost The {@link RenderFrameHost} for the context menu. + * @param nativeDelegate The {@link ContextMenuNativeDelegate} for the context menu. * @return The new {@ContextMenuPopulator}. */ ContextMenuPopulator createContextMenuPopulator( - Context context, ContextMenuParams params, RenderFrameHost renderFrameHost); + Context context, ContextMenuParams params, ContextMenuNativeDelegate nativeDelegate); void onDestroy(); }
diff --git a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/DEPS b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/DEPS index 5d791165..bf78820a 100644 --- a/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/DEPS +++ b/chrome/browser/contextmenu/java/src/org/chromium/chrome/browser/contextmenu/DEPS
@@ -2,4 +2,5 @@ "-chrome", "+base/android/java/src/org/chromium/base", "+content/public/android/java/src/org/chromium/content_public", + "+components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share", ]
diff --git a/chrome/browser/data_saver/lite_video_browsertest.cc b/chrome/browser/data_saver/lite_video_browsertest.cc index dc37317..a409f1e 100644 --- a/chrome/browser/data_saver/lite_video_browsertest.cc +++ b/chrome/browser/data_saver/lite_video_browsertest.cc
@@ -307,6 +307,55 @@ lite_video::LiteVideoThrottleResult::kThrottleStoppedOnRebuffer)); } +// When video is seeked throttling is stopped. +IN_PROC_BROWSER_TEST_F(LiteVideoBrowserTest, StopsThrottlingOnPlaybackSeek) { + ukm::TestAutoSetUkmRecorder ukm_recorder; + TestMSEPlayback("bear-vp9.webm", "2000", "2000", false); + + RetryForHistogramUntilCountReached(histogram_tester(), + "Media.VideoHeight.Initial.MSE", 1); + + histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); + + // Trigger a media playback seek. + ASSERT_TRUE(content::ExecuteScript( + browser()->tab_strip_model()->GetActiveWebContents(), + "document.querySelector('video').currentTime = 1")); + + // Verify some responses were throttled and then throttling is stopped. + RetryForHistogramUntilCountReached(histogram_tester(), + "LiteVideo.HintsAgent.StopThrottling", 1); + EXPECT_GE(1U, histogram_tester() + .GetAllSamples("LiteVideo.URLLoader.ThrottleLatency") + .size()); + EXPECT_EQ(1U, histogram_tester() + .GetAllSamples("LiteVideo.HintsAgent.StopThrottling") + .size()); + EXPECT_GE( + 1U, histogram_tester() + .GetAllSamples("LiteVideo.NavigationMetrics.FrameRebufferMapSize") + .size()); + + // Close the tab to flush the UKM metrics. + browser()->tab_strip_model()->GetActiveWebContents()->Close(); + + auto entries = + ukm_recorder.GetEntriesByName(ukm::builders::LiteVideo::kEntryName); + ASSERT_EQ(1u, entries.size()); + auto* entry = entries[0]; + ukm_recorder.ExpectEntrySourceHasUrl(entry, media_url()); + ukm_recorder.ExpectEntryMetric( + entry, ukm::builders::LiteVideo::kThrottlingStartDecisionName, + static_cast<int>(lite_video::LiteVideoDecision::kAllowed)); + ukm_recorder.ExpectEntryMetric( + entry, ukm::builders::LiteVideo::kBlocklistReasonName, + static_cast<int>(lite_video::LiteVideoBlocklistReason::kUnknown)); + ukm_recorder.ExpectEntryMetric( + entry, ukm::builders::LiteVideo::kThrottlingResultName, + static_cast<int>( + lite_video::LiteVideoThrottleResult::kThrottledWithoutStop)); +} + class LiteVideoAndLiteModeDisabledBrowserTest : public LiteVideoBrowserTest { public: LiteVideoAndLiteModeDisabledBrowserTest()
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc index 03bbe55e..5b625ca9 100644 --- a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc +++ b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
@@ -21,7 +21,6 @@ #include "chrome/browser/sync/profile_sync_service_factory.h" #include "chrome/browser/sync/sync_ui_util.h" #include "chrome/browser/ui/browser.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "components/browsing_data/core/pref_names.h"
diff --git a/chrome/browser/extensions/api/identity/identity_api_unittest.cc b/chrome/browser/extensions/api/identity/identity_api_unittest.cc index fb8e51b..323dab6 100644 --- a/chrome/browser/extensions/api/identity/identity_api_unittest.cc +++ b/chrome/browser/extensions/api/identity/identity_api_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "base/optional.h" -#include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/extensions/test_extension_prefs.h" #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/extensions/api/idltest/idltest_apitest.cc b/chrome/browser/extensions/api/idltest/idltest_apitest.cc index 3308f8c..65c9d74 100644 --- a/chrome/browser/extensions/api/idltest/idltest_apitest.cc +++ b/chrome/browser/extensions/api/idltest/idltest_apitest.cc
@@ -21,5 +21,4 @@ IN_PROC_BROWSER_TEST_F(ExtensionIdltestApiTest, IdlCompiler) { EXPECT_TRUE(RunExtensionSubtest("idltest/binary_data", "binary.html")); EXPECT_TRUE(RunExtensionSubtest("idltest/nocompile", "nocompile.html")); - EXPECT_TRUE(RunExtensionSubtest("idltest/nodefine", "nodefine.html")); }
diff --git a/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc b/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc deleted file mode 100644 index 835c27f8..0000000 --- a/chrome/browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc +++ /dev/null
@@ -1,173 +0,0 @@ -// Copyright 2015 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. - -#include <memory> -#include <string> - -#include "base/location.h" -#include "base/macros.h" -#include "base/run_loop.h" -#include "base/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/values.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/net/network_portal_detector_impl.h" -#include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/browser/notifications/notification_display_service_tester.h" -#include "chrome/browser/ui/ash/network/network_portal_notification_controller.h" -#include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/dbus/shill/shill_device_client.h" -#include "chromeos/dbus/shill/shill_profile_client.h" -#include "chromeos/dbus/shill/shill_service_client.h" -#include "components/captive_portal/core/captive_portal_testing_utils.h" -#include "content/public/test/browser_test.h" -#include "content/public/test/test_utils.h" -#include "extensions/test/result_catcher.h" -#include "net/base/net_errors.h" -#include "third_party/cros_system_api/dbus/service_constants.h" -#include "ui/message_center/public/cpp/notification.h" -#include "ui/message_center/public/cpp/notification_delegate.h" - -using chromeos::DBusThreadManager; -using chromeos::NetworkPortalDetector; -using chromeos::NetworkPortalDetectorImpl; -using chromeos::NetworkPortalNotificationController; -using chromeos::ShillDeviceClient; -using chromeos::ShillProfileClient; -using chromeos::ShillServiceClient; - -namespace { - -const char kWifiDevicePath[] = "/device/stub_wifi_device1"; -const char kWifi1ServicePath[] = "stub_wifi1"; -const char kWifi1ServiceGUID[] = "wifi1_guid"; - -} // namespace - -class NetworkingConfigTest - : public extensions::ExtensionApiTest, - public captive_portal::CaptivePortalDetectorTestBase { - public: - NetworkingConfigTest() : network_portal_detector_(nullptr) {} - ~NetworkingConfigTest() override = default; - - void SetUpOnMainThread() override { - extensions::ExtensionApiTest::SetUpOnMainThread(); - content::RunAllPendingInMessageLoop(); - - display_service_ = std::make_unique<NotificationDisplayServiceTester>( - nullptr /* profile */); - - DBusThreadManager* const dbus_manager = DBusThreadManager::Get(); - ShillServiceClient::TestInterface* const service_test = - dbus_manager->GetShillServiceClient()->GetTestInterface(); - ShillDeviceClient::TestInterface* const device_test = - dbus_manager->GetShillDeviceClient()->GetTestInterface(); - ShillProfileClient::TestInterface* const profile_test = - dbus_manager->GetShillProfileClient()->GetTestInterface(); - - device_test->ClearDevices(); - service_test->ClearServices(); - - device_test->AddDevice(kWifiDevicePath, shill::kTypeWifi, - "stub_wifi_device1"); - - service_test->AddService(kWifi1ServicePath, kWifi1ServiceGUID, "wifi1", - shill::kTypeWifi, shill::kStateOnline, - true /* add_to_visible */); - service_test->SetServiceProperty(kWifi1ServicePath, shill::kWifiBSsid, - base::Value("01:02:ab:7f:90:00")); - service_test->SetServiceProperty( - kWifi1ServicePath, shill::kSignalStrengthProperty, base::Value(40)); - profile_test->AddService(ShillProfileClient::GetSharedProfilePath(), - kWifi1ServicePath); - - content::RunAllPendingInMessageLoop(); - - network_portal_detector_ = - new NetworkPortalDetectorImpl(test_loader_factory()); - // Takes ownership of |network_portal_detector_|: - chromeos::network_portal_detector::InitializeForTesting( - network_portal_detector_); - network_portal_detector_->Enable(false /* start_detection */); - set_detector(network_portal_detector_->captive_portal_detector_.get()); - network_portal_notification_controller_ = - std::make_unique<NetworkPortalNotificationController>( - network_portal_detector_); - } - - void TearDownOnMainThread() override { - network_portal_notification_controller_.reset(); - } - - void LoadTestExtension() { - extension_ = LoadExtension(test_data_dir_.AppendASCII("networking_config")); - } - - bool RunExtensionTest(const std::string& path) { - return RunExtensionSubtest("networking_config", - extension_->GetResourceURL(path).spec()); - } - - void SimulateCaptivePortal() { - network_portal_detector_->StartDetection(); - content::RunAllPendingInMessageLoop(); - - // Simulate a captive portal reply. - CompleteURLFetch(net::OK, 200, nullptr); - } - - void SimulateSuccessfulCaptivePortalAuth() { - content::RunAllPendingInMessageLoop(); - CompleteURLFetch(net::OK, 204, nullptr); - } - - NetworkPortalDetector::CaptivePortalStatus GetCaptivePortalStatus( - const std::string& guid) { - return network_portal_detector_->GetCaptivePortalState(kWifi1ServiceGUID) - .status; - } - - protected: - NetworkPortalDetectorImpl* network_portal_detector_; - std::unique_ptr<NetworkPortalNotificationController> - network_portal_notification_controller_; - const extensions::Extension* extension_ = nullptr; - std::unique_ptr<NotificationDisplayServiceTester> display_service_; -}; - -IN_PROC_BROWSER_TEST_F(NetworkingConfigTest, ApiAvailability) { - ASSERT_TRUE(RunExtensionSubtest("networking_config", "api_availability.html")) - << message_; -} - -// Test the full, positive flow starting with the extension registration and -// ending with the captive portal being authenticated. -IN_PROC_BROWSER_TEST_F(NetworkingConfigTest, FullTest) { - LoadTestExtension(); - // This will cause the extension to register for wifi1. - ASSERT_TRUE(RunExtensionTest("full_test.html")) << message_; - - SimulateCaptivePortal(); - - // Wait until a captive portal notification is displayed and verify that it is - // the expected captive portal notification. - auto notification = display_service_->GetNotification( - NetworkPortalNotificationController::kNotificationId); - ASSERT_TRUE(notification); - - // Simulate the user click which leads to the extension being notified. - notification->delegate()->Click( - NetworkPortalNotificationController::kUseExtensionButtonIndex, - base::nullopt); - - extensions::ResultCatcher catcher; - EXPECT_TRUE(catcher.GetNextResult()); - - // Simulate the captive portal vanishing. - SimulateSuccessfulCaptivePortalAuth(); - - ASSERT_EQ(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, - GetCaptivePortalStatus(kWifi1ServiceGUID)); -}
diff --git a/chrome/browser/extensions/api/notifications/notifications_apitest.cc b/chrome/browser/extensions/api/notifications/notifications_apitest.cc index 0b48607c..fb2794e 100644 --- a/chrome/browser/extensions/api/notifications/notifications_apitest.cc +++ b/chrome/browser/extensions/api/notifications/notifications_apitest.cc
@@ -26,7 +26,6 @@ #include "chrome/browser/notifications/notifier_state_tracker.h" #include "chrome/browser/notifications/notifier_state_tracker_factory.h" #include "chrome/browser/profiles/profile_manager.h" -#include "chrome/common/chrome_features.h" #include "chrome/test/base/interactive_test_utils.h" #include "content/public/browser/notification_service.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/extensions/browsertest_util.cc b/chrome/browser/extensions/browsertest_util.cc index 58f68c6..1d765ef 100644 --- a/chrome/browser/extensions/browsertest_util.cc +++ b/chrome/browser/extensions/browsertest_util.cc
@@ -22,7 +22,6 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" -#include "chrome/common/chrome_features.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/notification_service.h" #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc index cd16a8f..bca6ff57 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -46,7 +46,6 @@ #include "chrome/browser/ui/bluetooth/chrome_extension_bluetooth_chooser.h" #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" #include "chrome/common/channel_info.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/extensions/extension_bindings_apitest.cc b/chrome/browser/extensions/extension_bindings_apitest.cc index 0b132d6d..5e52e2e6 100644 --- a/chrome/browser/extensions/extension_bindings_apitest.cc +++ b/chrome/browser/extensions/extension_bindings_apitest.cc
@@ -5,7 +5,6 @@ // Contains holistic tests of the bindings infrastructure #include "base/run_loop.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/extensions/api/permissions/permissions_api.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc index 518c392..87c0f9b 100644 --- a/chrome/browser/extensions/extension_management.cc +++ b/chrome/browser/extensions/extension_management.cc
@@ -26,7 +26,6 @@ #include "chrome/browser/extensions/standard_management_policy_provider.h" #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" #include "components/crx_file/id_util.h"
diff --git a/chrome/browser/extensions/extension_management_unittest.cc b/chrome/browser/extensions/extension_management_unittest.cc index 40eb1164..2d4d966 100644 --- a/chrome/browser/extensions/extension_management_unittest.cc +++ b/chrome/browser/extensions/extension_management_unittest.cc
@@ -11,13 +11,11 @@ #include "base/json/json_reader.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "chrome/browser/extensions/extension_management_internal.h" #include "chrome/browser/extensions/extension_management_test_util.h" #include "chrome/browser/extensions/external_policy_loader.h" #include "chrome/browser/extensions/standard_management_policy_provider.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/extensions/extension_messages_apitest.cc b/chrome/browser/extensions/extension_messages_apitest.cc index e44e6417..3b3ad2e 100644 --- a/chrome/browser/extensions/extension_messages_apitest.cc +++ b/chrome/browser/extensions/extension_messages_apitest.cc
@@ -35,7 +35,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" #include "chrome/test/base/ui_test_utils.h" #include "components/crx_file/id_util.h"
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index e2e6ff6..370d920 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -36,7 +36,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind_test_util.h" -#include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "base/values.h" #include "base/version.h"
diff --git a/chrome/browser/extensions/extension_util.cc b/chrome/browser/extensions/extension_util.cc index 901cc16..c71493e 100644 --- a/chrome/browser/extensions/extension_util.cc +++ b/chrome/browser/extensions/extension_util.cc
@@ -23,7 +23,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" #include "chrome/browser/web_applications/extensions/bookmark_app_util.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h" #include "chrome/common/extensions/sync_helper.h"
diff --git a/chrome/browser/extensions/lazy_background_page_apitest.cc b/chrome/browser/extensions/lazy_background_page_apitest.cc index ebd3ed26..2dd0ada 100644 --- a/chrome/browser/extensions/lazy_background_page_apitest.cc +++ b/chrome/browser/extensions/lazy_background_page_apitest.cc
@@ -26,7 +26,6 @@ #include "chrome/browser/ui/extensions/extension_action_test_helper.h" #include "chrome/browser/ui/location_bar/location_bar.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/api/tabs.h"
diff --git a/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc b/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc index 70bbf121..077ccd2 100644 --- a/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc +++ b/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc
@@ -11,7 +11,6 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/task/post_task.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chrome_browser_main.h" #include "chrome/browser/chrome_browser_main_extra_parts.h" #include "chrome/browser/extensions/browsertest_util.h"
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index e39dc80..3039bb4d 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2409,11 +2409,6 @@ "expiry_milestone": 90 }, { - "name": "enable-zero-state-suggestions", - "owners": [ "jennyz", "xiyuan" ], - "expiry_milestone": 75 - }, - { "name": "enhanced_clipboard", "owners": ["newcomer@chromium.org", "tbarzic@chromium.org"], "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 2e00bf1..0303ba9 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4017,11 +4017,6 @@ const char kTrimOnMemoryPressureDescription[] = "Trim Working Set periodically on memory pressure"; -const char kEnableZeroStateSuggestionsName[] = "Enable Zero State Suggetions"; -const char kEnableZeroStateSuggestionsDescription[] = - "Enable Zero State Suggestions feature in Launcher, which will show " - "suggestions when launcher search box is active with an empty query"; - const char kEnableSuggestedFilesName[] = "Enable Suggested Files"; const char kEnableSuggestedFilesDescription[] = "Enable Suggested Files feature in Launcher, which will show file "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index f6bb6810f..14b6df01 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2328,9 +2328,6 @@ extern const char kTrimOnMemoryPressureName[]; extern const char kTrimOnMemoryPressureDescription[]; -extern const char kEnableZeroStateSuggestionsName[]; -extern const char kEnableZeroStateSuggestionsDescription[]; - extern const char kEnableSuggestedFilesName[]; extern const char kEnableSuggestedFilesDescription[];
diff --git a/chrome/browser/lite_video/lite_video_observer.cc b/chrome/browser/lite_video/lite_video_observer.cc index 55173b3..d2e9cae 100644 --- a/chrome/browser/lite_video/lite_video_observer.cc +++ b/chrome/browser/lite_video/lite_video_observer.cc
@@ -275,4 +275,29 @@ render_frame_host->GetLastCommittedURL(), true); } +void LiteVideoObserver::MediaPlayerSeek(const content::MediaPlayerId& id) { + content::RenderFrameHost* render_frame_host = id.render_frame_host; + + if (!render_frame_host || !render_frame_host->GetProcess()) + return; + + // Only consider a seek event related to LiteVideos if they were allowed on + // current navigation. + if (!nav_metrics_ || + nav_metrics_->decision() != lite_video::LiteVideoDecision::kAllowed) { + return; + } + + mojo::AssociatedRemote<blink::mojom::PreviewsResourceLoadingHintsReceiver> + loading_hints_agent; + + if (!render_frame_host->GetRemoteAssociatedInterfaces()) + return; + + render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( + &loading_hints_agent); + + loading_hints_agent->StopThrottlingMediaRequests(); +} + WEB_CONTENTS_USER_DATA_KEY_IMPL(LiteVideoObserver)
diff --git a/chrome/browser/lite_video/lite_video_observer.h b/chrome/browser/lite_video/lite_video_observer.h index 283f3e3..2c85eeb0 100644 --- a/chrome/browser/lite_video/lite_video_observer.h +++ b/chrome/browser/lite_video/lite_video_observer.h
@@ -44,6 +44,7 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; void MediaBufferUnderflow(const content::MediaPlayerId& id) override; + void MediaPlayerSeek(const content::MediaPlayerId& id) override; // Determines the LiteVideoDecision based on |hint| and the coinflip // holdback state.
diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc index bd9dda8..88b66b4 100644 --- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc +++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
@@ -347,7 +347,7 @@ const char product[] = "Chrome"; #elif defined(OS_MAC) const char product[] = "Chrome_Mac"; -#elif defined(OS_LINUX) +#elif defined(OS_LINUX) && !defined(OS_CHROMEOS) #if !defined(ADDRESS_SANITIZER) const char product[] = "Chrome_Linux"; #else
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc index dbd1812f..caa32b0 100644 --- a/chrome/browser/pdf/pdf_extension_test.cc +++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -3162,13 +3162,13 @@ } private: - using PropertyFilter = content::AccessibilityTreeFormatter::PropertyFilter; + using AXPropertyFilter = ui::AXPropertyFilter; // See chrome/test/data/pdf/accessibility/readme.md for more info. void ParsePdfForExtraDirectives( const std::string& pdf_contents, content::AccessibilityTreeFormatter* formatter, - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { const char kCommentMark = '%'; for (const std::string& line : base::SplitString( pdf_contents, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { @@ -3178,8 +3178,8 @@ const std::string& allow_str = formatter->GetAllowString(); if (base::StartsWith(trimmed_line, allow_str, base::CompareCase::SENSITIVE)) { - property_filters->push_back(PropertyFilter( - trimmed_line.substr(allow_str.size()), PropertyFilter::ALLOW)); + property_filters->push_back(AXPropertyFilter( + trimmed_line.substr(allow_str.size()), AXPropertyFilter::ALLOW)); } } } @@ -3196,7 +3196,7 @@ // file. std::unique_ptr<content::AccessibilityTreeFormatter> formatter = test_pass_.create_formatter(); - std::vector<PropertyFilter> property_filters; + std::vector<AXPropertyFilter> property_filters; formatter->AddDefaultFilters(&property_filters); AddDefaultFilters(&property_filters); ParsePdfForExtraDirectives(pdf_contents, formatter.get(), @@ -3250,18 +3250,19 @@ test_file_path, expected_file_path, actual_lines, *expected_lines)); } - void AddDefaultFilters(std::vector<PropertyFilter>* property_filters) { + void AddDefaultFilters(std::vector<AXPropertyFilter>* property_filters) { AddPropertyFilter(property_filters, "value='*'"); // The value attribute on the document object contains the URL of the // current page which will not be the same every time the test is run. // The PDF plugin uses the 'chrome-extension' protocol, so block that as // well. - AddPropertyFilter(property_filters, "value='http*'", PropertyFilter::DENY); + AddPropertyFilter(property_filters, "value='http*'", + AXPropertyFilter::DENY); AddPropertyFilter(property_filters, "value='chrome-extension*'", - PropertyFilter::DENY); + AXPropertyFilter::DENY); // Object attributes.value AddPropertyFilter(property_filters, "layout-guess:*", - PropertyFilter::ALLOW); + AXPropertyFilter::ALLOW); AddPropertyFilter(property_filters, "select*"); AddPropertyFilter(property_filters, "descript*"); @@ -3271,15 +3272,17 @@ AddPropertyFilter(property_filters, "isPageBreakingObject*"); // Deny most empty values - AddPropertyFilter(property_filters, "*=''", PropertyFilter::DENY); + AddPropertyFilter(property_filters, "*=''", AXPropertyFilter::DENY); // After denying empty values, because we want to allow name='' - AddPropertyFilter(property_filters, "name=*", PropertyFilter::ALLOW_EMPTY); + AddPropertyFilter(property_filters, "name=*", + AXPropertyFilter::ALLOW_EMPTY); } - void AddPropertyFilter(std::vector<PropertyFilter>* property_filters, - std::string filter, - PropertyFilter::Type type = PropertyFilter::ALLOW) { - property_filters->push_back(PropertyFilter(filter, type)); + void AddPropertyFilter( + std::vector<AXPropertyFilter>* property_filters, + std::string filter, + AXPropertyFilter::Type type = AXPropertyFilter::ALLOW) { + property_filters->push_back(AXPropertyFilter(filter, type)); } content::AccessibilityTreeFormatter::TestPass test_pass_;
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc index bc07603c..562950f 100644 --- a/chrome/browser/policy/chrome_browser_policy_connector.cc +++ b/chrome/browser/policy/chrome_browser_policy_connector.cc
@@ -86,7 +86,8 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) { std::unique_ptr<DeviceManagementService::Configuration> configuration( new DeviceManagementServiceConfiguration(GetDeviceManagementUrl(), - GetRealtimeReportingUrl())); + GetRealtimeReportingUrl(), + GetEncryptedReportingUrl())); std::unique_ptr<DeviceManagementService> device_management_service( new DeviceManagementService(std::move(configuration))); device_management_service->ScheduleInitialization(
diff --git a/chrome/browser/policy/device_management_service_configuration.cc b/chrome/browser/policy/device_management_service_configuration.cc index 2f5aeb9..7c7aa3e2 100644 --- a/chrome/browser/policy/device_management_service_configuration.cc +++ b/chrome/browser/policy/device_management_service_configuration.cc
@@ -26,15 +26,18 @@ namespace policy { DeviceManagementServiceConfiguration::DeviceManagementServiceConfiguration( - const std::string& server_url, - const std::string& reporting_server_url) - : server_url_(server_url), reporting_server_url_(reporting_server_url) {} + const std::string& dm_server_url, + const std::string& realtime_reporting_server_url, + const std::string& encrypted_reporting_server_url) + : dm_server_url_(dm_server_url), + realtime_reporting_server_url_(realtime_reporting_server_url), + encrypted_reporting_server_url_(encrypted_reporting_server_url) {} DeviceManagementServiceConfiguration::~DeviceManagementServiceConfiguration() { } std::string DeviceManagementServiceConfiguration::GetDMServerUrl() { - return server_url_; + return dm_server_url_; } std::string DeviceManagementServiceConfiguration::GetAgentParameter() { @@ -79,8 +82,14 @@ "%s|%s|%s", os_name.c_str(), os_hardware.c_str(), os_version.c_str()); } -std::string DeviceManagementServiceConfiguration::GetReportingServerUrl() { - return reporting_server_url_; +std::string +DeviceManagementServiceConfiguration::GetRealtimeReportingServerUrl() { + return realtime_reporting_server_url_; +} + +std::string +DeviceManagementServiceConfiguration::GetEncryptedReportingServerUrl() { + return encrypted_reporting_server_url_; } std::string
diff --git a/chrome/browser/policy/device_management_service_configuration.h b/chrome/browser/policy/device_management_service_configuration.h index b25b5976..7140a1a1 100644 --- a/chrome/browser/policy/device_management_service_configuration.h +++ b/chrome/browser/policy/device_management_service_configuration.h
@@ -18,19 +18,23 @@ class DeviceManagementServiceConfiguration : public DeviceManagementService::Configuration { public: - DeviceManagementServiceConfiguration(const std::string& server_url, - const std::string& reporting_server_url); + DeviceManagementServiceConfiguration( + const std::string& dm_server_url, + const std::string& realtime_reporting_server_url, + const std::string& encrypted_reporting_server_url); ~DeviceManagementServiceConfiguration() override; std::string GetDMServerUrl() override; std::string GetAgentParameter() override; std::string GetPlatformParameter() override; - std::string GetReportingServerUrl() override; + std::string GetRealtimeReportingServerUrl() override; + std::string GetEncryptedReportingServerUrl() override; std::string GetReportingConnectorServerUrl() override; private: - const std::string server_url_; - const std::string reporting_server_url_; + const std::string dm_server_url_; + const std::string realtime_reporting_server_url_; + const std::string encrypted_reporting_server_url_; DISALLOW_COPY_AND_ASSIGN(DeviceManagementServiceConfiguration); };
diff --git a/chrome/browser/policy/dm_token_utils.cc b/chrome/browser/policy/dm_token_utils.cc index 34728318..9cd90fc 100644 --- a/chrome/browser/policy/dm_token_utils.cc +++ b/chrome/browser/policy/dm_token_utils.cc
@@ -31,7 +31,7 @@ } // namespace -DMToken GetDMToken(Profile* const profile) { +DMToken GetDMToken(Profile* const profile, bool only_affiliated) { DMToken dm_token = *GetTestingDMTokenStorage(); #if defined(OS_CHROMEOS) @@ -40,7 +40,8 @@ auto* policy_manager = profile->GetUserCloudPolicyManagerChromeOS(); const user_manager::User* user = chromeos::ProfileHelper::Get()->GetUserByProfile(profile); - if (dm_token.is_empty() && user && user->IsAffiliated() && policy_manager && + if (dm_token.is_empty() && user && + (user->IsAffiliated() || !only_affiliated) && policy_manager && policy_manager->IsClientRegistered()) { dm_token = DMToken(DMToken::Status::kValid, policy_manager->core()->client()->dm_token());
diff --git a/chrome/browser/policy/dm_token_utils.h b/chrome/browser/policy/dm_token_utils.h index 1de07bc..7257a8d8 100644 --- a/chrome/browser/policy/dm_token_utils.h +++ b/chrome/browser/policy/dm_token_utils.h
@@ -13,9 +13,11 @@ // Returns a platform specific DM Token: // - Browser platforms get the CBCM DM Token. -// - Chrome OS gets the DM token for the |profile| if it's an affiliated user. -// If a nullptr is passed for |profile|, an empty test DM Token is returned. -DMToken GetDMToken(Profile* const profile = nullptr); +// - Unless only_affiliated is set to false, Chrome OS only gets the DM token +// for the |profile| if it's an affiliated user. If a nullptr is passed for +// |profile|, an empty test DM Token is returned. +DMToken GetDMToken(Profile* const profile = nullptr, + bool only_affiliated = true); // Overrides the DM token returned by |GetDMToken|, used for testing purposes. void SetDMTokenForTesting(const DMToken& dm_token);
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 40aa0dd..11f49b2b 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -590,21 +590,19 @@ grit_flags = [ "-E", "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir), + "-E", + "root_src_dir=" + rebase_path("//", root_build_dir), ] defines = chrome_grit_defines - if (optimize_webui) { - source = "print_preview/print_preview_resources_vulcanized.grd" - deps = [ "//chrome/browser/resources/print_preview:build" ] - } else { - # These arguments are needed since the grd is generated at build time. - enable_input_discovery_for_gn_analyze = false - defines += [ "SHARED_INTERMEDIATE_DIR=" + - rebase_path(root_gen_dir, root_build_dir) ] - print_gen_dir = "$root_gen_dir/chrome/browser/resources/print_preview" - source = "$print_gen_dir/print_preview_resources.grd" - deps = [ "//chrome/browser/resources/print_preview:build_grd" ] - } + + # These arguments are needed since the grd is generated at build time. + enable_input_discovery_for_gn_analyze = false + defines += [ "SHARED_INTERMEDIATE_DIR=" + + rebase_path(root_gen_dir, root_build_dir) ] + print_gen_dir = "$root_gen_dir/chrome/browser/resources/print_preview" + source = "$print_gen_dir/print_preview_resources.grd" + deps = [ "//chrome/browser/resources/print_preview:build_grd" ] outputs = [ "grit/print_preview_resources.h",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js index 6808267..f9cc2fa 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
@@ -42,7 +42,7 @@ EventType.ACTIVE_DESCENDANT_CHANGED, this.onActiveDescendantChanged); this.addListener_( EventType.MENU_LIST_ITEM_SELECTED, this.onEventIfSelected); - this.addListener_(EventType.TEXT_CHANGED, this.onTextChanged_); + this.addListener_(EventType.VALUE_CHANGED, this.onValueChanged_); } /** @@ -92,9 +92,7 @@ /** * @param {!ChromeVoxEvent} evt */ - onTextChanged_(evt) { - // TODO: listen to value changes instead when they are generated. - // Here only to handle popup buttons. + onValueChanged_(evt) { if (evt.target.role != RoleType.POP_UP_BUTTON || evt.target.state.editable) { return;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js index 84299cc..7344a16 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js
@@ -23,6 +23,8 @@ chrome.i18n.getUILanguage().toLowerCase(); /** @private {string} */ this.currentLocale_ = LocaleOutputHelper.BROWSER_UI_LOCALE_ || ''; + /** @private {string} */ + this.lastSpokenLocale_ = this.currentLocale_; /** * Confidence threshold to meet before assigning sub-node language. * @const @@ -60,10 +62,11 @@ contextNode.detectedLanguage || contextNode.language || ''; const newLocale = this.computeNewLocale_(nodeLocale); let outputString = text; - const shouldAlert = newLocale !== this.currentLocale_; + const shouldAnnounce = this.shouldAnnounceLocale_(newLocale); if (this.hasVoiceForLocale_(newLocale)) { this.setCurrentLocale_(newLocale); - if (shouldAlert) { + if (shouldAnnounce) { + this.lastSpokenLocale_ = newLocale; // Prepend the human-readable locale to |outputString|. const displayLanguage = chrome.accessibilityPrivate.getDisplayNameForLocale( @@ -135,6 +138,28 @@ } } + /** + * @param {string} newLocale + * @return {boolean} + * @private + */ + shouldAnnounceLocale_(newLocale) { + const [lastSpokenLanguage, lastSpokenCountry] = + this.lastSpokenLocale_.split('-'); + const [newLanguage, newCountry] = newLocale.split('-'); + if (lastSpokenLanguage !== newLanguage) { + return true; + } + + if (!newCountry) { + // If |newCountry| is undefined, then we don't want to announce the + // locale. For example, we don't want to announce 'en-us' -> 'en'. + return false; + } + + return lastSpokenCountry !== newCountry; + } + // =============== Static Methods ============== /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js index 7d5b2e3..f4c4ee3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js
@@ -162,20 +162,16 @@ get chineseDoc() { return ` <p lang="en-us">United States</p> - <p lang="zh">Chinese</p> <p lang="zh-hans">Simplified Chinese</p> <p lang="zh-hant">Traditional Chinese</p> - <p lang="zh">Chinese</p> `; } get portugueseDoc() { return ` <p lang="en-us">United States</p> - <p lang="pt">Portuguese</p> <p lang="pt-br">Brazil</p> <p lang="pt-pt">Portugal</p> - <p lang="pt">Portuguese</p> `; } }; @@ -208,7 +204,7 @@ this.setAvailableVoices(); mockFeedback.call(doCmd('jumpToTop')) .expectSpeechWithLocale( - 'en', 'English: In the morning, I sometimes eat breakfast.'); + 'en', 'In the morning, I sometimes eat breakfast.'); mockFeedback.call(doCmd('nextLine')) .expectSpeechWithLocale( 'fr', 'français: Dans l\'apres-midi, je dejeune.'); @@ -303,7 +299,7 @@ mockFeedback.call(doCmd('jumpToTop')) .expectSpeechWithLocale( 'en', - 'English: This entire object should be read in English, even' + + 'This entire object should be read in English, even' + ' the following French passage: ' + 'salut mon ami! Ca va? Bien, et toi? It\'s hard to' + ' differentiate between latin-based languages.'); @@ -457,7 +453,7 @@ this.setAvailableVoices(); mockFeedback.call(doCmd('jumpToTop')) .expectSpeechWithLocale( - 'en', 'English: In the morning, I sometimes eat breakfast.') + 'en', 'In the morning, I sometimes eat breakfast.') .call(doCmd('nextLine')) .expectSpeechWithLocale( 'fr', 'français: Dans l\'apres-midi, je dejeune.') @@ -509,7 +505,7 @@ this.setAvailableVoices(); mockFeedback.call(doCmd('jumpToTop')) .expectSpeechWithLocale( - 'en', 'English: In the morning, I sometimes eat breakfast.') + 'en', 'In the morning, I sometimes eat breakfast.') .call(doCmd('nextLine')) .expectSpeechWithLocale( 'fr', 'français: Dans l\'apres-midi, je dejeune.') @@ -556,15 +552,11 @@ mockFeedback.call(doCmd('jumpToTop')) .expectSpeechWithLocale('en-us', 'United States') .call(doCmd('nextLine')) - .expectSpeechWithLocale('zh', '中文: Chinese') - .call(doCmd('nextLine')) .expectSpeechWithLocale( 'zh-hans', '中文(简体): Simplified Chinese') .call(doCmd('nextLine')) .expectSpeechWithLocale( - 'zh-hant', '中文(繁體): Traditional Chinese') - .call(doCmd('nextLine')) - .expectSpeechWithLocale('zh', '中文: Chinese'); + 'zh-hant', '中文(繁體): Traditional Chinese'); mockFeedback.replay(); }); }); @@ -579,13 +571,38 @@ mockFeedback.call(doCmd('jumpToTop')) .expectSpeechWithLocale('en-us', 'United States') .call(doCmd('nextLine')) - .expectSpeechWithLocale('pt', 'português: Portuguese') - .call(doCmd('nextLine')) .expectSpeechWithLocale('pt-br', 'português (Brasil): Brazil') .call(doCmd('nextLine')) - .expectSpeechWithLocale('pt-pt', 'português (Portugal): Portugal') - .call(doCmd('nextLine')) - .expectSpeechWithLocale('pt', 'português: Portuguese'); + .expectSpeechWithLocale('pt-pt', 'português (Portugal): Portugal'); mockFeedback.replay(); }); }); + +// Tests logic in shouldAnnounceLocale_(). We only announce the locale once when +// transitioning to more specific locales, e.g. 'en' -> 'en-us'. Transitions to +// less specific locales, e.g. 'en-us' -> 'en' should not be announced. Finally, +// subsequent transitions to the same locale, e.g. 'en' -> 'en-us' should not be +// announced. +TEST_F('ChromeVoxLocaleOutputHelperTest', 'MaybeAnnounceLocale', function() { + const mockFeedback = this.createMockFeedback(); + this.runWithLoadedTree( + ` + <p lang="en">Start</p> + <p lang="en-ca">Middle</p> + <p lang="en">Penultimate</p> + <p lang="en-ca">End</p> + `, + function() { + localStorage['languageSwitching'] = 'true'; + this.setAvailableVoices(); + mockFeedback.call(doCmd('jumpToTop')) + .expectSpeechWithLocale('en', 'Start') + .call(doCmd('nextObject')) + .expectSpeechWithLocale('en-ca', 'English (Canada): Middle') + .call(doCmd('nextObject')) + .expectSpeechWithLocale('en', 'Penultimate') + .call(doCmd('nextObject')) + .expectSpeechWithLocale('en-ca', 'End') + .replay(); + }); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js index e8b45b1..6afc4c0a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js
@@ -1372,7 +1372,10 @@ if (!prevRange && range.start.node.root) { prevRange = cursors.Range.fromNode(range.start.node.root); + } else if (!prevRange) { + return; } + let cursor = cursors.Cursor.fromNode(range.start.node); let prevNode = prevRange.start.node; @@ -2474,7 +2477,8 @@ }, checkBox: { speak: `$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) - $name $role $checked $description $state $restriction` + $name $role $if($checkedStateDescription, $checkedStateDescription, $checked) + $description $state $restriction` }, client: {speak: `$name`}, comboBoxMenuButton: {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output_test.js index aca5f80..b795d96 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output_test.js
@@ -1361,3 +1361,23 @@ assertFalse(called); }); }); + +TEST_F('ChromeVoxOutputE2ETest', 'ARCCheckbox', function() { + this.runWithLoadedTree('<input type="checkbox">', function(root) { + const checkbox = root.firstChild.firstChild; + Object.defineProperty(checkbox, 'checkedStateDescription', { + value: 'checked state description', + }); + const range = cursors.Range.fromNode(checkbox); + const o = new Output().withoutHints().withSpeechAndBraille( + range, null, 'navigate'); + checkSpeechOutput( + '|Check box|checked state description', + [ + {value: new Output.EarconAction('CHECK_OFF'), start: 0, end: 0}, + {value: 'role', start: 1, end: 10}, + {value: 'checkedStateDescription', start: 11, end: 36} + ], + o); + }); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js index 4f882247..a295e8f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_test.js
@@ -60,11 +60,7 @@ .call(press(KeyCode.DOWN)) .expectSpeech('Digits', 'List item', ' 2 of 2 ') .call(press(KeyCode.RETURN)) - - // TODO: The underlying select behavior here is unexpected because we - // never get a new focus event for the select (moving us away from the - // menu item). We simply repeat the menu item. - .expectSpeech('Digits', ' 2 of 2 ') + .expectSpeech('Digits', 'Collapsed') .call(() => { assertEquals('asDigits', localStorage['numberReadingStyle']); }) @@ -108,11 +104,7 @@ .call(press(KeyCode.DOWN)) .expectSpeech('Some', 'List item', ' 2 of 3 ') .call(press(KeyCode.RETURN)) - - // TODO(josiahk): The underlying select behavior here is unexpected - // because we never get a new focus event for the select (moving us - // away from the menu item). We simply repeat the menu item. - .expectSpeech('Some', ' 2 of 3 ') + .expectSpeech('Some', 'Collapsed') .call(() => { assertEquals( PUNCTUATION_ECHO_SOME,
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js index 344544f..095b481 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
@@ -198,7 +198,6 @@ this.assertActiveMenuItem( 'panel_menu_form_controls', 'español: Prueba Button'); this.fireMockEvent('ArrowUp')(); - this.assertActiveMenuItem( - 'panel_menu_form_controls', 'English: Test Button'); + this.assertActiveMenuItem('panel_menu_form_controls', 'Test Button'); }); });
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js index c085e66..43439b4 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/node_utils.js
@@ -61,9 +61,10 @@ * @return {boolean} whether this node was marked user-select:none */ static isNotSelectable(node) { - return node && + return !!( + node && (node.notUserSelectableStyle || - (node.parent && node.parent.notUserSelectableStyle)); + (node.parent && node.parent.notUserSelectableStyle))); } /**
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb index d12a96c..6b45bef 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ml.xtb
@@ -68,6 +68,7 @@ <translation id="1383876407941801731">Search</translation> <translation id="1396114365388024581">tablst</translation> <translation id="1405567553485452995">ഇളം പച്ച</translation> +<translation id="141454040365657399">പേജിന്റെ തലക്കെട്ട്</translation> <translation id="1417889266572670458">നേവി</translation> <translation id="1431911867058218151">പ്ലം</translation> <translation id="1439316808600711881">rgn</translation> @@ -348,6 +349,7 @@ <translation id="3549141990712742152"><ph name="TEXT" /> മുറിക്കുക.</translation> <translation id="3549680091535286226">സംസാരിക്കുന്നത് താൽക്കാലികമായി നിർത്താൻ രണ്ട് വിരലുകൾ ഉപയോഗിച്ച് ടാപ്പ് ചെയ്യുക</translation> <translation id="3564729643041517261">നിലവിലുള്ള ഡിസ്പ്ലേ ശൈലി വശങ്ങളിൽ കാണിക്കുന്ന തരത്തിലാണ്</translation> +<translation id="3573145950452451508">പേജിന്റെ അടിക്കുറിപ്പ്</translation> <translation id="3587482841069643663">എല്ലാം</translation> <translation id="3589661172894441357">പദസഞ്ചയം</translation> <translation id="3591784666823501596">റോയൽ നീല</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb index 232d793..87ed6e6 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sk.xtb
@@ -68,6 +68,7 @@ <translation id="1383876407941801731">Vyhľadávanie</translation> <translation id="1396114365388024581">tablst</translation> <translation id="1405567553485452995">Svetlozelená</translation> +<translation id="141454040365657399">Hlavička stránky</translation> <translation id="1417889266572670458">Námornícka modrá</translation> <translation id="1431911867058218151">Slivková</translation> <translation id="1439316808600711881">oblasť</translation> @@ -348,6 +349,7 @@ <translation id="3549141990712742152">vystrihnúť <ph name="TEXT" />.</translation> <translation id="3549680091535286226">Reč dočasne zastavíte klepnutím dvoma prstami</translation> <translation id="3564729643041517261">Aktuálny štýl zobrazenia je vedľa seba</translation> +<translation id="3573145950452451508">Päta stránky</translation> <translation id="3587482841069643663">Všetko</translation> <translation id="3589661172894441357">Glosár</translation> <translation id="3591784666823501596">Kráľovská modrá</translation>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html index 34207e0..92f2fc3 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_get_more.html
@@ -32,7 +32,7 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-text-button id="next-button" inverse on-tap="onNextTap_" + <oobe-text-button id="next-button" inverse on-click="onNextTap_" disabled="[[buttonsDisabled]]" hidden="[[moreContents]]" text-key="assistantReadyButton"> </oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html index 8517bd6..4fa5bfd 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_loading.html
@@ -34,10 +34,10 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-text-button id="skip-button" on-tap="onSkipTap_" + <oobe-text-button id="skip-button" on-click="onSkipTap_" disabled="[[buttonsDisabled]]" text-key="assistantOptinSkipButton"> </oobe-text-button> - <oobe-text-button id="retry-button" inverse on-tap="onRetryTap_" + <oobe-text-button id="retry-button" inverse on-click="onRetryTap_" disabled="[[buttonsDisabled]]" text-key="assistantOptinRetryButton"> </oobe-text-button> </div>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html index 2360ecc..905c084e 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_third_party.html
@@ -21,7 +21,7 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-next-button id="next-button" inverse on-tap="onNextTap_" + <oobe-next-button id="next-button" inverse on-click="onNextTap_" disabled="[[buttonsDisabled]]" hidden="[[moreContents]]"> <div id="next-button-text" slot="text"></div> </oobe-next-button>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html index 9af1ad4..eb3d58d 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_value_prop.html
@@ -33,11 +33,11 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-text-button id="skip-button" on-tap="onSkipTap_" + <oobe-text-button id="skip-button" on-click="onSkipTap_" disabled="[[buttonsDisabled]]"> <div id="skip-button-text" slot="text"></div> </oobe-text-button> - <oobe-text-button id="next-button" inverse on-tap="onNextTap_" + <oobe-text-button id="next-button" inverse on-click="onNextTap_" disabled="[[buttonsDisabled]]"> <div id="next-button-text" slot="text"></div> </oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html b/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html index b7b3f4c..86e8e67 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html +++ b/chrome/browser/resources/chromeos/assistant_optin/assistant_voice_match.html
@@ -91,14 +91,14 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-text-button id="skip-button" on-tap="onSkipTap_" + <oobe-text-button id="skip-button" on-click="onSkipTap_" disabled="[[buttonsDisabled]]" text-key="assistantOptinNoThanksButton"> </oobe-text-button> - <oobe-text-button id="later-button" on-tap="onSkipTap_" + <oobe-text-button id="later-button" on-click="onSkipTap_" disabled="[[buttonsDisabled]]" text-key="assistantOptinLaterButton"> </oobe-text-button> - <oobe-text-button id="agree-button" inverse on-tap="onAgreeTap_" + <oobe-text-button id="agree-button" inverse on-click="onAgreeTap_" disabled="[[buttonsDisabled]]" text-key="assistantOptinAgreeButton"> </oobe-text-button> </div>
diff --git a/chrome/browser/resources/chromeos/edu_login/edu_login_button.html b/chrome/browser/resources/chromeos/edu_login/edu_login_button.html index 3d204428..8297416b5 100644 --- a/chrome/browser/resources/chromeos/edu_login/edu_login_button.html +++ b/chrome/browser/resources/chromeos/edu_login/edu_login_button.html
@@ -7,7 +7,7 @@ padding-inline-start: 10px; } </style> -<cr-button class$="[[getClass_(buttonType)]]" on-tap="onTap_" +<cr-button class$="[[getClass_(buttonType)]]" on-click="onTap_" disabled="[[disabled]]"> <template is="dom-if" if="[[hasIconBeforeText_(buttonType)]]"> <iron-icon icon="[[getIcon_(buttonType)]]"></iron-icon>
diff --git a/chrome/browser/resources/chromeos/edu_login/edu_login_parent_signin.html b/chrome/browser/resources/chromeos/edu_login/edu_login_parent_signin.html index 5886d769..c5f155b 100644 --- a/chrome/browser/resources/chromeos/edu_login/edu_login_parent_signin.html +++ b/chrome/browser/resources/chromeos/edu_login/edu_login_parent_signin.html
@@ -144,7 +144,7 @@ <h1>[[getParentSigninTitle_(parent)]]</h1> <div class="account-selection-container" - on-tap="onBackClicked_" + on-click="onBackClicked_" role="button" aria-labelledby="backButton" aria-describedby="parentEmail"> @@ -173,7 +173,7 @@ class="password-icon" title="[[getPasswordIconLabel_(isPasswordVisible_)]]" aria-label="[[getPasswordIconLabel_(isPasswordVisible_)]]" - on-tap="onTogglePasswordVisibilityClicked_"> + on-click="onTogglePasswordVisibilityClicked_"> </cr-icon-button> </div> <p hidden="[[!isWrongPassword_]]" class="error-message">
diff --git a/chrome/browser/resources/chromeos/edu_login/edu_login_parents.html b/chrome/browser/resources/chromeos/edu_login/edu_login_parents.html index 1a573a4..bb391a3 100644 --- a/chrome/browser/resources/chromeos/edu_login/edu_login_parents.html +++ b/chrome/browser/resources/chromeos/edu_login/edu_login_parents.html
@@ -57,7 +57,7 @@ aria-label$="[[item.displayName]] [[item.email]]" class$="account-list-item main-padding [[getSelectedClass_(selectedParent, item)]]" - on-tap="selectParent_" on-keydown="onParentSelectionKeydown_"> + on-click="selectParent_" on-keydown="onParentSelectionKeydown_"> <div class="profile-icon" style="background-image: [[getIconImageSet_(item.profileImage)]]"> </div>
diff --git a/chrome/browser/resources/chromeos/login/app_downloading.html b/chrome/browser/resources/chromeos/login/app_downloading.html index e7a0d3e..8f0f87db 100644 --- a/chrome/browser/resources/chromeos/login/app_downloading.html +++ b/chrome/browser/resources/chromeos/login/app_downloading.html
@@ -32,7 +32,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-next-button id="continue-setup-button" - text-key="appDownloadingContinueSetup" on-tap="onContinue_" + text-key="appDownloadingContinueSetup" on-click="onContinue_" class="focus-on-show" inverse></oobe-next-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html index 57fb8d4..dafce26 100644 --- a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html +++ b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
@@ -33,7 +33,7 @@ <p> <span>[[i18nDynamic(locale, metricsTextKey)]]</span> <a href="#" id="learnMoreLinkMetrics" - on-tap="onMetricsLearnMoreTap_"> + on-click="onMetricsLearnMoreTap_"> [[i18nDynamic(locale, 'arcLearnMoreText')]] </a> </p> @@ -54,7 +54,7 @@ <p> <span>[[i18nDynamic(locale, 'arcTextBackupRestore')]]</span> <a href="#" id="learnMoreLinkBackupRestore" - on-tap="onBackupRestoreLearnMoreTap_"> + on-click="onBackupRestoreLearnMoreTap_"> [[i18nDynamic(locale, 'arcLearnMoreText')]] </a> </p> @@ -72,7 +72,7 @@ <p> <span>[[i18nDynamic(locale, 'arcTextLocationService')]]</span> <a href="#" id="learnMoreLinkLocationService" - on-tap="onLocationServiceLearnMoreTap_"> + on-click="onLocationServiceLearnMoreTap_"> [[i18nDynamic(locale, 'arcLearnMoreText')]] </a> </p> @@ -82,7 +82,7 @@ <p> <span>[[i18nDynamic(locale, 'arcTextPaiService')]]</span> <a href="#" id="learnMoreLinkPai" - on-tap="onPaiLearnMoreTap_"> + on-click="onPaiLearnMoreTap_"> [[i18nDynamic(locale, 'arcLearnMoreText')]] </a> </p> @@ -115,16 +115,16 @@ <div class="flex"> </div> <oobe-text-button id="arcTosRetryButton" - inverse on-tap="onRetry_" + inverse on-click="onRetry_" disabled="[[arcTosButtonsDisabled]]" text-key="arcTermsOfServiceRetryButton"></oobe-text-button> <oobe-text-button id="arcTosNextButton" - inverse on-tap="onNext_" + inverse on-click="onNext_" disabled="[[arcTosButtonsDisabled]]" hidden="[[showFullDialog]]" text-key="arcTermsOfServiceNextButton"></oobe-text-button> <oobe-text-button id="arcTosAcceptButton" - inverse on-tap="onAccept_" + inverse on-click="onAccept_" disabled="[[arcTosButtonsDisabled]]" hidden="[[!showFullDialog]]" text-key="[[acceptTextKey]]"></oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_buttons.html b/chrome/browser/resources/chromeos/login/components/oobe_buttons.html index e4a8209..f78bf6e 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_buttons.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_buttons.html
@@ -59,7 +59,7 @@ <template> <style include="cr-shared-style oobe-common"></style> <link rel="stylesheet" href="oobe_text_buttons.css"> - <cr-button id="textButton" on-tap="onClick_" disabled="[[disabled]]" + <cr-button id="textButton" on-click="onClick_" disabled="[[disabled]]" inverse$="[[inverse]]" aria-label$="[[labelForAriaText_]]" border$="[[border]]"> <div id="container" @@ -126,7 +126,7 @@ <style include="cr-icons cr-shared-style oobe-common"></style> <link rel="stylesheet" href="oobe_text_buttons.css"> <link rel="stylesheet" href="oobe_next_button.css"> - <cr-button id="button" on-tap="onClick_" disabled="[[disabled]]" + <cr-button id="button" on-click="onClick_" disabled="[[disabled]]" aria-label$="[[labelForAria_]]" class="action-button"> <div class="flex horizontal layout start center"> <slot name="text">
diff --git a/chrome/browser/resources/chromeos/login/demo_preferences.html b/chrome/browser/resources/chromeos/login/demo_preferences.html index 369eb76..cc7ce068 100644 --- a/chrome/browser/resources/chromeos/login/demo_preferences.html +++ b/chrome/browser/resources/chromeos/login/demo_preferences.html
@@ -49,7 +49,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal justified"> <oobe-back-button on-click="onBackClicked_"></oobe-back-button> - <oobe-text-button id="nextButton" inverse on-tap="onNextClicked_" + <oobe-text-button id="nextButton" inverse on-click="onNextClicked_" text-key="demoPreferencesNextButtonLabel"></oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/demo_setup.html b/chrome/browser/resources/chromeos/login/demo_setup.html index 14a637a..fcbbd81 100644 --- a/chrome/browser/resources/chromeos/login/demo_setup.html +++ b/chrome/browser/resources/chromeos/login/demo_setup.html
@@ -48,11 +48,11 @@ <div slot="bottom-buttons" class="layout horizontal justified"> <oobe-back-button inverse on-click="onCloseClicked_" disabled="[[isPowerwashRequired_]]"></oobe-back-button> - <oobe-text-button id="retryButton" on-tap="onRetryClicked_" + <oobe-text-button id="retryButton" on-click="onRetryClicked_" text-key="demoSetupErrorScreenRetryButtonLabel" inverse hidden="[[isPowerwashRequired_]]"> </oobe-text-button> - <oobe-text-button id="powerwashButton" on-tap="onPowerwashClicked_" + <oobe-text-button id="powerwashButton" on-click="onPowerwashClicked_" text-key="demoSetupErrorScreenPowerwashButtonLabel" inverse hidden="[[!isPowerwashRequired_]]"> </oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/login/discover/modules/discover_module_pin_setup.html b/chrome/browser/resources/chromeos/login/discover/modules/discover_module_pin_setup.html index f55591d..abcb2aef 100644 --- a/chrome/browser/resources/chromeos/login/discover/modules/discover_module_pin_setup.html +++ b/chrome/browser/resources/chromeos/login/discover/modules/discover_module_pin_setup.html
@@ -54,10 +54,10 @@ </cr-input> </div> <div slot="bottom-buttons" class="flex layout horizontal end-justified"> - <oobe-text-button on-tap="onSkipButton_" + <oobe-text-button on-click="onSkipButton_" text-key="discoverPinSetupSkip"></oobe-text-button> <oobe-next-button inverse disabled="[[!password_]]" - on-tap="onPasswordSubmitButton_"> + on-click="onPasswordSubmitButton_"> </oobe-next-button> </div> </oobe-dialog> @@ -109,17 +109,17 @@ <div slot="bottom-buttons" class="flex layout horizontal end-justified"> <oobe-back-button hidden="[[isStepHidden_(step_, 'confirm')]]" - on-tap="onBackButton_"></oobe-back-button> + on-click="onBackButton_"></oobe-back-button> <div class="flex"></div> - <oobe-text-button id="setupSkipButton" on-tap="onSkipButton_" + <oobe-text-button id="setupSkipButton" on-click="onSkipButton_" text-key="discoverPinSetupSkip" hidden="[[!isStepHidden_(step_, 'done')]]"> </oobe-text-button> <oobe-next-button inverse disabled="[[isNextDisabled_(step_, enableSubmit_)]]" - on-tap="onNextButton_" class="focus-on-show" + on-click="onNextButton_" class="focus-on-show" hidden="[[!isStepHidden_(step_, 'done')]]"></oobe-next-button> - <oobe-text-button inverse on-tap="onDoneButton_" class="focus-on-show" + <oobe-text-button inverse on-click="onDoneButton_" class="focus-on-show" text-key="discoverPinSetupDone" hidden="[[isStepHidden_(step_, 'done')]]"> </oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/login/encryption_migration.html b/chrome/browser/resources/chromeos/login/encryption_migration.html index d2bbb01..8dabe0a 100644 --- a/chrome/browser/resources/chromeos/login/encryption_migration.html +++ b/chrome/browser/resources/chromeos/login/encryption_migration.html
@@ -49,10 +49,10 @@ <div slot="bottom-buttons" class="flex layout horizontal" hidden="[[isResuming]]"> <div class="flex"></div> - <oobe-text-button border id="skip-button" on-tap="onSkip_" + <oobe-text-button border id="skip-button" on-click="onSkip_" hidden="[[isSkipHidden_()]]" text-key="migrationButtonSkip"> </oobe-text-button> - <oobe-text-button inverse id="upgrade-button" on-tap="onUpgrade_" + <oobe-text-button inverse id="upgrade-button" on-click="onUpgrade_" disabled="[[isUpdateDisabled_(isEnoughBattery, isSkipped)]]" text-key="migrationButtonUpdate"></oobe-text-button> </div> @@ -84,11 +84,11 @@ <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> <if expr="_google_chrome"> - <oobe-text-button border on-tap="onReportAnIssue_" + <oobe-text-button border on-click="onReportAnIssue_" text-key="migrationButtonReportAnIssue"></oobe-text-button> </if> <oobe-text-button inverse id="restart-button" - on-tap="onRestartOnFailure_" text-key="migrationButtonRestart"> + on-click="onRestartOnFailure_" text-key="migrationButtonRestart"> </oobe-text-button> </div> </oobe-dialog> @@ -112,11 +112,11 @@ <div class="flex"></div> <oobe-text-button inverse id="insufficient-space-skip-button" hidden="[[isResuming]]" - on-tap="onSkip_" text-key="migrationButtonContinue"> + on-click="onSkip_" text-key="migrationButtonContinue"> </oobe-text-button> <oobe-text-button inverse id="insufficient-space-restart-button" hidden="[[!isResuming]]" - on-tap="onRestartOnLowStorage_" + on-click="onRestartOnLowStorage_" text-key="migrationButtonRestart"> </oobe-text-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/enterprise_enrollment.html b/chrome/browser/resources/chromeos/login/enterprise_enrollment.html index 53ab6a6..8a502f5 100644 --- a/chrome/browser/resources/chromeos/login/enterprise_enrollment.html +++ b/chrome/browser/resources/chromeos/login/enterprise_enrollment.html
@@ -95,19 +95,19 @@ <!-- BACK - Shown when the generic cancel button is hidden --> <oobe-back-button id="errorCancelBackButton" hidden$="[[isGenericCancel_(isAutoEnroll_, isForced_)]]" - on-tap="cancel" style="margin-right: auto"></oobe-back-button> + on-click="cancel" style="margin-right: auto"></oobe-back-button> <!-- GENERAL CANCEL BUTTON (SKIP / ENROLL MANUALLY) --> <oobe-text-button id="errorGenericCancelButton" hidden$="[[!isGenericCancel_(isAutoEnroll_, isForced_)]]" - on-tap="cancel" inverse$="[[!canRetryAfterError_]]" + on-click="cancel" inverse$="[[!canRetryAfterError_]]" text-key="[[getCancelButtonLabel_(locale, isAutoEnroll_)]]"> </oobe-text-button> <!-- TRY AGAIN BUTTON - --> <oobe-text-button inverse id="errorRetryButton" hidden$="[[!canRetryAfterError_]]" - on-tap="doRetry_" class="focus-on-show" + on-click="doRetry_" class="focus-on-show" text-key="oauthEnrollRetry"> </oobe-text-button> </div> @@ -123,7 +123,7 @@ <!-- BOTTOM BUTTONS: ATTRIBUTE ERROR --> <div for-step="attribute-prompt-error"> <oobe-text-button inverse id="attributeErrorButton" - on-tap="onEnrollmentFinished_" class="focus-on-show" + on-click="onEnrollmentFinished_" class="focus-on-show" text-key="oauthEnrollDone"> </oobe-text-button> </div> @@ -151,7 +151,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button inverse id="successDoneButton" - text-key="oauthEnrollDone" on-tap="onEnrollmentFinished_" + text-key="oauthEnrollDone" on-click="onEnrollmentFinished_" class="focus-on-show"></oobe-text-button> </div> </oobe-dialog> @@ -185,11 +185,11 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="attributesSkip" - text-key="oauthEnrollSkip" on-tap="skipAttributes_"> + text-key="oauthEnrollSkip" on-click="skipAttributes_"> </oobe-text-button> <div class="flex"></div> <oobe-next-button id="attributesSubmit" - on-tap="submitAttributes_"></oobe-next-button> + on-click="submitAttributes_"></oobe-next-button> </div> </oobe-dialog> </div>
diff --git a/chrome/browser/resources/chromeos/login/family_link_notice.html b/chrome/browser/resources/chromeos/login/family_link_notice.html index b409f53..a9e7e20 100644 --- a/chrome/browser/resources/chromeos/login/family_link_notice.html +++ b/chrome/browser/resources/chromeos/login/family_link_notice.html
@@ -26,7 +26,7 @@ <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-next-button id="continueButton" text-key="familyLinkContinueButton" class="focus-on-show" - inverse on-tap="onContinueButtonPressed_"></oobe-next-button> + inverse on-click="onContinueButtonPressed_"></oobe-next-button> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/fingerprint_setup.html b/chrome/browser/resources/chromeos/login/fingerprint_setup.html index 3d68429..2d878c0 100644 --- a/chrome/browser/resources/chromeos/login/fingerprint_setup.html +++ b/chrome/browser/resources/chromeos/login/fingerprint_setup.html
@@ -28,10 +28,10 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="skipStart" - text-key="skipFingerprintSetup" on-tap="onSkip_"> + text-key="skipFingerprintSetup" on-click="onSkip_"> </oobe-text-button> <oobe-next-button id="next" - on-tap="onNext_" class="focus-on-show" + on-click="onNext_" class="focus-on-show" text-key="fingerprintSetupNext" inverse></oobe-next-button> </div> </oobe-dialog> @@ -58,7 +58,7 @@ <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="setupLater" text-key="fingerprintSetupLater" - on-tap="onSetupLater_" class="focus-on-show"> + on-click="onSetupLater_" class="focus-on-show"> </oobe-text-button> </div> </oobe-dialog> @@ -89,7 +89,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="skipProgress" - on-tap="onSkip_" class="focus-on-show" + on-click="onSkip_" class="focus-on-show" text-key="skipFingerprintSetup" hidden="[[complete_]]"> </oobe-text-button> @@ -97,12 +97,12 @@ text-key="fingerprintSetupAddAnother" hidden="[[!isAnotherButtonVisible_(percentComplete_, canAddFinger)]]" - on-tap="onAddAnother_"> + on-click="onAddAnother_"> </oobe-text-button> <oobe-text-button id="done" hidden="[[!complete_]]" text-key="fingerprintSetupDone" - on-tap="onDone_" class="focus-on-show" inverse> + on-click="onDone_" class="focus-on-show" inverse> </oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/gaia_password_changed.html b/chrome/browser/resources/chromeos/login/gaia_password_changed.html index eadd7ea..44be34f 100644 --- a/chrome/browser/resources/chromeos/login/gaia_password_changed.html +++ b/chrome/browser/resources/chromeos/login/gaia_password_changed.html
@@ -43,10 +43,10 @@ </gaia-button> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button id="cancel" on-tap="onCancel_" text-key="cancel" + <oobe-text-button id="cancel" on-click="onCancel_" text-key="cancel" border> </oobe-text-button> - <oobe-next-button id="next" on-tap="submit_" inverse + <oobe-next-button id="next" on-click="submit_" inverse text-key="nextButtonText"> </oobe-next-button> </div> @@ -59,12 +59,12 @@ </hd-iron-icon> <h1 slot="title">[[email]]</h1> <div slot="bottom-buttons" class="flex layout horizontal"> - <oobe-text-button id="tryAgain" on-tap="onTryAgainClicked_" + <oobe-text-button id="tryAgain" on-click="onTryAgainClicked_" text-key="passwordChangedTryAgain"> </oobe-text-button> <div class="flex"> </div> - <oobe-text-button id="proceedAnyway" on-tap="onProceedClicked_" + <oobe-text-button id="proceedAnyway" on-click="onProceedClicked_" text-key="proceedAnywayButton" inverse> </oobe-text-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/gesture_navigation.html b/chrome/browser/resources/chromeos/login/gesture_navigation.html index 81b4edf..28f9c70e 100644 --- a/chrome/browser/resources/chromeos/login/gesture_navigation.html +++ b/chrome/browser/resources/chromeos/login/gesture_navigation.html
@@ -37,7 +37,7 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal end-justified"> - <oobe-text-button inverse on-tap="onNext_" + <oobe-text-button inverse on-click="onNext_" id="gesture-intro-next-button" class="focus-on-show" text-key="gestureNavigationIntroNextButton"> </oobe-text-button> @@ -58,9 +58,9 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal justified"> - <oobe-back-button on-tap="onBack_" + <oobe-back-button on-click="onBack_" id="gesture-home-back-button"></oobe-back-button> - <oobe-next-button on-tap="onNext_" class="focus-on-show" + <oobe-next-button on-click="onNext_" class="focus-on-show" id="gesture-home-next-button"></oobe-next-button> </div> </oobe-dialog> @@ -79,9 +79,9 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal justified"> - <oobe-back-button on-tap="onBack_" + <oobe-back-button on-click="onBack_" id="gesture-overview-back-button"></oobe-back-button> - <oobe-next-button on-tap="onNext_" class="focus-on-show" + <oobe-next-button on-click="onNext_" class="focus-on-show" id="gesture-overview-next-button"></oobe-next-button> </div> </oobe-dialog> @@ -100,9 +100,9 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal justified"> - <oobe-back-button on-tap="onBack_" + <oobe-back-button on-click="onBack_" id="gesture-back-back-button"></oobe-back-button> - <oobe-next-button on-tap="onNext_" class="focus-on-show" + <oobe-next-button on-click="onNext_" class="focus-on-show" id="gesture-back-next-button"></oobe-next-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/marketing_opt_in.html b/chrome/browser/resources/chromeos/login/marketing_opt_in.html index 62d3256..7c1daa9 100644 --- a/chrome/browser/resources/chromeos/login/marketing_opt_in.html +++ b/chrome/browser/resources/chromeos/login/marketing_opt_in.html
@@ -68,13 +68,13 @@ <oobe-welcome-secondary-button hidden="[[!isA11ySettingsButtonVisible_]]" id="marketing-opt-in-accessibility-button" - on-tap="onToggleAccessibilityPage_" + on-click="onToggleAccessibilityPage_" icon1x="marketing-opt-in-32:accessibility" icon2x="marketing-opt-in-64:accessibility" text-key="marketingOptInA11yButtonLabel"> </oobe-welcome-secondary-button> </div> - <oobe-text-button on-tap="onGetStarted_" class="focus-on-show" + <oobe-text-button on-click="onGetStarted_" class="focus-on-show" inverse text-key="marketingOptInScreenAllSet" id="marketing-opt-in-next-button"> </oobe-text-button> @@ -104,9 +104,9 @@ </oobe-a11y-option> </div> <div slot="bottom-buttons" class="layout horizontal justified"> - <oobe-back-button on-tap="onToggleAccessibilityPage_" + <oobe-back-button on-click="onToggleAccessibilityPage_" id="final-accessibility-back-button"></oobe-back-button> - <oobe-text-button on-tap="onGetStarted_" class="focus-on-show" + <oobe-text-button on-click="onGetStarted_" class="focus-on-show" id="final-accessibility-next-button" inverse text-key="finalA11yPageDoneButtonTitle"> </oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/login/navigation_bar.html b/chrome/browser/resources/chromeos/login/navigation_bar.html index 1d82618..274a54c 100644 --- a/chrome/browser/resources/chromeos/login/navigation_bar.html +++ b/chrome/browser/resources/chromeos/login/navigation_bar.html
@@ -42,17 +42,17 @@ <link rel="stylesheet" href="navigation_bar.css"> <div class="fit layout horizontal center"> <gaia-icon-button id="backButton" icon="navigation-bar:arrow-back" - hidden="[[!backVisible]]" disabled="[[disabled]]" on-tap="onBack_" + hidden="[[!backVisible]]" disabled="[[disabled]]" on-click="onBack_" aria-label$="[[i18nDynamic(locale, 'backButton')]]"> </gaia-icon-button> <div class="flex"></div> <gaia-icon-button id="refreshButton" icon="navigation-bar:refresh" hidden="[[!refreshVisible]]" disabled="[[disabled]]" - on-tap="onRefresh_" + on-click="onRefresh_" aria-label$="[[i18nDynamic(locale, 'closeButton')]]"> </gaia-icon-button> <gaia-icon-button id="closeButton" icon="cr:close" - hidden="[[!closeVisible]]" disabled="[[disabled]]" on-tap="onClose_" + hidden="[[!closeVisible]]" disabled="[[disabled]]" on-click="onClose_" aria-label$="[[i18nDynamic(locale, 'closeButton')]]"> </gaia-icon-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/offline_ad_login.html b/chrome/browser/resources/chromeos/login/offline_ad_login.html index 120d3c4..376e7cb 100644 --- a/chrome/browser/resources/chromeos/login/offline_ad_login.html +++ b/chrome/browser/resources/chromeos/login/offline_ad_login.html
@@ -64,10 +64,10 @@ </cr-input> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button id="skipButton" on-tap="onSkipClicked_" + <oobe-text-button id="skipButton" on-click="onSkipClicked_" text-key="adUnlockPasswordSkip"></oobe-text-button> <oobe-next-button id="unlockButton" - on-tap="onUnlockPasswordEntered_"></oobe-next-button> + on-click="onUnlockPasswordEntered_"></oobe-next-button> </div> </oobe-dialog> <oobe-dialog id="credsStep" hidden="[[unlockPasswordStep]]" @@ -140,7 +140,7 @@ <oobe-back-button id="backButton" on-click="onBackButton_" hidden="[[isDomainJoin]]"></oobe-back-button> <div class="flex"></div> - <oobe-next-button id="nextButton" on-tap="onSubmit_" + <oobe-next-button id="nextButton" on-click="onSubmit_" disabled="[[disabled]]"></oobe-next-button> </div> </oobe-dialog> @@ -184,9 +184,9 @@ </div> <div slot="button-container"> <oobe-text-button text-key="adJoinCancel" - on-tap="onMoreOptionsCancelTap_" autofocus></oobe-text-button> + on-click="onMoreOptionsCancelTap_" autofocus></oobe-text-button> <oobe-text-button id="moreOptionsSave" text-key="adJoinSave" - on-tap="onMoreOptionsConfirmTap_" inverse></oobe-text-button> + on-click="onMoreOptionsConfirmTap_" inverse></oobe-text-button> </div> </cr-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/offline_gaia.html b/chrome/browser/resources/chromeos/login/offline_gaia.html index fdcf8e92..dafa92b 100644 --- a/chrome/browser/resources/chromeos/login/offline_gaia.html +++ b/chrome/browser/resources/chromeos/login/offline_gaia.html
@@ -96,9 +96,9 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal justified"> - <oobe-back-button on-tap="onBackButtonClicked_"></oobe-back-button> + <oobe-back-button on-click="onBackButtonClicked_"></oobe-back-button> <oobe-next-button id="next-button" - on-tap="onNextButtonClicked_"></oobe-next-button> + on-click="onNextButtonClicked_"></oobe-next-button> </div> </oobe-dialog> <cr-dialog id="forgotPasswordDlg" @@ -107,7 +107,7 @@ [[i18nDynamic(locale, 'offlineLoginForgotPasswordDlg')]] </div> <div slot="button-container"> - <cr-button autofocus on-tap="onForgotPasswordCloseTap_" + <cr-button autofocus on-click="onForgotPasswordCloseTap_" class="action-button"> [[i18nDynamic(locale, 'offlineLoginCloseBtn')]] </cr-button>
diff --git a/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html b/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html index 20b3221..72ecb53a 100644 --- a/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html +++ b/chrome/browser/resources/chromeos/login/oobe_adb_sideloading_screen.html
@@ -22,7 +22,7 @@ <div slot="subtitle"> <div> [[i18nDynamic(locale, 'enableAdbSideloadingSetupMessage')]] - <a href="#" on-tap="onLearnMoreTap_" class="oobe-local-link"> + <a href="#" on-click="onLearnMoreTap_" class="oobe-local-link"> [[i18nDynamic(locale, 'enableAdbSideloadingLearnMore')]] </a> </div> @@ -36,10 +36,10 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-text-button border on-tap="onCancelTap_" + <oobe-text-button border on-click="onCancelTap_" text-key="enableAdbSideloadingCancelButton" id="enable-adb-sideloading-cancel-button"></oobe-text-button> - <oobe-text-button inverse on-tap="onEnableTap_" class="focus-on-show" + <oobe-text-button inverse on-click="onEnableTap_" class="focus-on-show" text-key="enableAdbSideloadingConfirmButton" id="enable-adb-sideloading-ok-button"></oobe-text-button> </div> @@ -55,7 +55,7 @@ </hd-iron-icon> <div slot="subtitle"> [[i18nDynamic(locale, 'enableAdbSideloadingErrorMessage')]] - <a href="#" on-tap="onLearnMoreTap_" class="oobe-local-link"> + <a href="#" on-click="onLearnMoreTap_" class="oobe-local-link"> [[i18nDynamic(locale, 'enableAdbSideloadingLearnMore')]] </a> </div> @@ -68,7 +68,7 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> - <oobe-text-button inverse on-tap="onCancelTap_" class="focus-on-show" + <oobe-text-button inverse on-click="onCancelTap_" class="focus-on-show" text-key="enableAdbSideloadingOkButton"></oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html b/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html index e0091faf..7d757a4 100644 --- a/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html +++ b/chrome/browser/resources/chromeos/login/oobe_enable_kiosk.html
@@ -30,11 +30,11 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal end-justified"> <oobe-text-button id="enable" hidden="[[!eq_(state_, 'confirm')]]" - inverse on-tap="onEnableButton_" text-key="kioskEnableButton"> + inverse on-click="onEnableButton_" text-key="kioskEnableButton"> </oobe-text-button> <oobe-text-button id="close" class="focus-on-show" inverse text-key="[[primaryButtonTextKey_(state_)]]" - on-tap="closeDialog_"></oobe-text-button> + on-click="closeDialog_"></oobe-text-button> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_eula.html b/chrome/browser/resources/chromeos/login/oobe_eula.html index fbe64752..34c4433 100644 --- a/chrome/browser/resources/chromeos/login/oobe_eula.html +++ b/chrome/browser/resources/chromeos/login/oobe_eula.html
@@ -36,13 +36,13 @@ on-contentload="onFrameLoad_"> </webview> <div id="footer-more" class="layout vertical"> - <a href="#" id="additionalTerms" on-tap="onAdditionalTermsClicked_" + <a href="#" id="additionalTerms" on-click="onAdditionalTermsClicked_" class="oobe-local-link"> [[i18nDynamic(locale, 'oobeEulaAditionalTerms')]] </a> <a id="securitySettings" href="#" class="oobe-local-link" - on-tap="onSecuritySettingsClicked_"> + on-click="onSecuritySettingsClicked_"> [[i18nDynamic(locale, 'eulaSystemSecuritySettings')]] </a> <div id="logging" class="layout horizontal"> @@ -54,7 +54,7 @@ [[i18nDynamic(locale, 'checkboxLogging')]] </span> <a id="learnMore" href="#" - on-tap="onUsageStatsHelpLinkClicked_" + on-click="onUsageStatsHelpLinkClicked_" class="oobe-local-link"> [[i18nDynamic(locale, 'learnMore')]] </a> @@ -68,7 +68,7 @@ on-click="onEulaBackButtonPressed_"></oobe-back-button> <div class="flex"> </div> - <oobe-text-button id="acceptButton" inverse on-tap="eulaAccepted_" + <oobe-text-button id="acceptButton" inverse on-click="eulaAccepted_" class="focus-on-show" disabled="[[acceptButtonDisabled]]" text-key="oobeEulaAcceptAndContinueButtonText"> @@ -91,7 +91,7 @@ <oobe-text-button id="settings-close-button" inverse class="focus-on-show" text-key="eulaSystemSecuritySettingsOkButton" - on-tap="onSecuritySettingsCloseClicked_"></oobe-text-button> + on-click="onSecuritySettingsCloseClicked_"></oobe-text-button> </div> </oobe-dialog> <cr-dialog id="additionalToS" ignore-popstate
diff --git a/chrome/browser/resources/chromeos/login/oobe_hid_detection.html b/chrome/browser/resources/chromeos/login/oobe_hid_detection.html index c522279..3ae515cb 100644 --- a/chrome/browser/resources/chromeos/login/oobe_hid_detection.html +++ b/chrome/browser/resources/chromeos/login/oobe_hid_detection.html
@@ -72,7 +72,7 @@ </div> <div class="layout vertical hid-selection-entry"> <div id="hid-keyboard-row" class="flex layout horizontal center" - on-tap="openPinDialog_"> + on-click="openPinDialog_"> <hd-iron-icon id="keyboard-icon" alt="" icon1x="oobe-hid-detection-20:keyboard" icon2x="oobe-hid-detection-40:keyboard"> @@ -87,7 +87,7 @@ </div> </div> <div slot="bottom-buttons" class="flex layout horizontal end-justified"> - <oobe-text-button inverse on-tap="onHIDContinueTap_" + <oobe-text-button inverse on-click="onHIDContinueTap_" text-key="hidDetectionContinue" id="hid-continue-button" disabled="[[!continueButtonEnabled]]"></oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/login/oobe_network.html b/chrome/browser/resources/chromeos/login/oobe_network.html index 8155a70..257e41c6 100644 --- a/chrome/browser/resources/chromeos/login/oobe_network.html +++ b/chrome/browser/resources/chromeos/login/oobe_network.html
@@ -25,7 +25,7 @@ <div slot="bottom-buttons" class="layout horizontal justified"> <oobe-back-button on-click="onBackClicked_"></oobe-back-button> <oobe-next-button id="nextButton" disabled="[[!isConnected_]]" - on-tap="onNextClicked_"></oobe-next-button> + on-click="onNextClicked_"></oobe-next-button> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_reset.html b/chrome/browser/resources/chromeos/login/oobe_reset.html index 5d4b001..a4fca4d 100644 --- a/chrome/browser/resources/chromeos/login/oobe_reset.html +++ b/chrome/browser/resources/chromeos/login/oobe_reset.html
@@ -33,7 +33,7 @@ <a id="powerwash-help-link-md" href="#" class="oobe-local-link" hidden="[[inRevertState_]]" - on-tap="onLearnMoreTap_">[[i18nDynamic(locale, 'learnMore')]] + on-click="onLearnMoreTap_">[[i18nDynamic(locale, 'learnMore')]] </a> </if> <!-- Spinner - Shown when the revert process is ongoing --> @@ -69,7 +69,7 @@ <if expr="_google_chrome"> <a href="#" class="oobe-local-link" - on-tap="onTPMFirmwareUpdateLearnMore_" + on-click="onTPMFirmwareUpdateLearnMore_" >[[i18nDynamic(locale, 'learnMore')]]</a> </if> </div> @@ -79,15 +79,15 @@ <div slot="bottom-buttons" class="flex layout horizontal"> <div class="flex"></div> <!-- Cancel button, only disabled when reverting --> - <oobe-text-button border on-tap="onCancelTap_" text-key="cancelButton" + <oobe-text-button border on-click="onCancelTap_" text-key="cancelButton" id="resetCancel" disabled="[[inRevertState_]]"></oobe-text-button> <!-- Restart button --> - <oobe-text-button inverse on-tap="onRestartTap_" class="focus-on-show" + <oobe-text-button inverse on-click="onRestartTap_" class="focus-on-show" id="restart" text-key="resetButtonRestart" hidden="[[!inRestartRequiredState_]]"> </oobe-text-button> <!-- Powerwash button (depends on powerwash mode) --> - <oobe-text-button inverse on-tap="onPowerwashTap_" class="focus-on-show" + <oobe-text-button inverse on-click="onPowerwashTap_" class="focus-on-show" id="powerwash" hidden="[[!inPowerwashState_]]" text-key="[[powerwashButtonTextKey_]]" disabled="[[powerwashButtonDisabled_]]"> @@ -100,9 +100,9 @@ <div slot="title">[[confirmationDialogTitle_]]</div> <div slot="content">[[confirmationDialogText_]]</div> <div slot="buttons"> - <oobe-text-button id="cancelButton" border on-tap="onDialogCancelTap_" + <oobe-text-button id="cancelButton" border on-click="onDialogCancelTap_" text-key="cancel"></oobe-text-button> - <oobe-text-button inverse on-tap="onDialogContinueTap_" + <oobe-text-button inverse on-click="onDialogContinueTap_" id="confirmPowerwash" text-key="confirmResetButton"></oobe-text-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_supervision_transition.html b/chrome/browser/resources/chromeos/login/oobe_supervision_transition.html index f0d2fb58..1b6a2f68 100644 --- a/chrome/browser/resources/chromeos/login/oobe_supervision_transition.html +++ b/chrome/browser/resources/chromeos/login/oobe_supervision_transition.html
@@ -34,7 +34,7 @@ aria-hidden="true"> </iron-icon> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button id="accept-button" on-tap="onAcceptAndContinue_" + <oobe-text-button id="accept-button" on-click="onAcceptAndContinue_" text-key="supervisionTransitionButton" inverse></oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/oobe_terms_of_service.html b/chrome/browser/resources/chromeos/login/oobe_terms_of_service.html index f73edca..25691df 100644 --- a/chrome/browser/resources/chromeos/login/oobe_terms_of_service.html +++ b/chrome/browser/resources/chromeos/login/oobe_terms_of_service.html
@@ -24,11 +24,11 @@ <div slot="bottom-buttons" class="flex layout horizontal"> <oobe-back-button id="errorBackButton" disabled="[[backButtonDisabled_]]" - on-tap="onTosBackButtonPressed_"></oobe-back-button> + on-click="onTosBackButtonPressed_"></oobe-back-button> <oobe-text-button id="retryButton" inverse text-key="termsOfServiceRetryButton" disabled="[[retryButtonDisabled_]]" - on-tap="onTosRetryButtonPressed_"></oobe-text-button> + on-click="onTosRetryButtonPressed_"></oobe-text-button> </div> </oobe-dialog> @@ -64,11 +64,11 @@ </div> <div slot="bottom-buttons" class="flex layout horizontal end-justified"> <oobe-back-button id="backButton" disabled="[[backButtonDisabled_]]" - on-tap="onTosBackButtonPressed_"></oobe-back-button> + on-click="onTosBackButtonPressed_"></oobe-back-button> <oobe-text-button id="acceptButton" inverse text-key="termsOfServiceAcceptButton" disabled="[[acceptButtonDisabled_]]" - on-tap="onTermsOfServiceAccepted_"></oobe-text-button> + on-click="onTermsOfServiceAccepted_"></oobe-text-button> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_update.html b/chrome/browser/resources/chromeos/login/oobe_update.html index b9633aa..7472ae30 100644 --- a/chrome/browser/resources/chromeos/login/oobe_update.html +++ b/chrome/browser/resources/chromeos/login/oobe_update.html
@@ -46,7 +46,7 @@ <oobe-back-button id="cellular-permission-back" inverse on-click="onBackClicked_"></oobe-back-button> <oobe-next-button id="cellular-permission-next" inverse - on-tap="onNextClicked_"></oobe-next-button> + on-click="onNextClicked_"></oobe-next-button> </div> </oobe-dialog> <div hidden="[[!betterUpdateScreenFeatureEnabled_]]">
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome.html b/chrome/browser/resources/chromeos/login/oobe_welcome.html index 12e5fc6..1091f21 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome.html +++ b/chrome/browser/resources/chromeos/login/oobe_welcome.html
@@ -105,7 +105,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="ok-button-language" text-key="oobeOKButtonText" - inverse on-tap="closeLanguageSection_"></oobe-text-button> + inverse on-click="closeLanguageSection_"></oobe-text-button> </div> </oobe-dialog> <oobe-dialog id="accessibilityScreen" role="dialog" hidden has-buttons @@ -221,7 +221,7 @@ <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="ok-button-accessibility" text-key="oobeOKButtonText" inverse - on-tap="closeAccessibilitySection_"></oobe-text-button> + on-click="closeAccessibilitySection_"></oobe-text-button> </div> </oobe-dialog> <oobe-dialog id="timezoneScreen" role="dialog" hidden has-buttons @@ -246,7 +246,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="ok-button-timezone" text-key="oobeOKButtonText" - inverse on-tap="closeTimezoneSection_"></oobe-text-button> + inverse on-click="closeTimezoneSection_"></oobe-text-button> </div> </oobe-dialog> <oobe-dialog id="oobeAdvancedOptionsScreen" role="dialog" hidden has-buttons @@ -258,7 +258,7 @@ <div slot="footer" class="layout vertical"> <div class="flex layout vertical center-justified advanced-options-entry"> - <button on-tap="onCFMBootstrappingClicked_"> + <button on-click="onCFMBootstrappingClicked_"> <div class="advanced-option-title"> [[i18nDynamic(locale, 'advancedOptionsCFMSetupTitle')]] </div> @@ -269,7 +269,7 @@ </div> <div class="flex layout vertical center-justified advanced-options-entry"> - <button on-tap="onDeviceRequisitionClicked_"> + <button on-click="onDeviceRequisitionClicked_"> <div class="advanced-option-title"> [[i18nDynamic(locale, 'advancedOptionsDeviceRequisitionTitle')]] </div> @@ -282,7 +282,7 @@ <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="ok-button-advanced-options" text-key="oobeOKButtonText" inverse - on-tap="closeAdvancedOptionsSection_"></oobe-text-button> + on-click="closeAdvancedOptionsSection_"></oobe-text-button> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html index ef70ab0..b2acfbb2 100644 --- a/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html +++ b/chrome/browser/resources/chromeos/login/oobe_welcome_dialog.html
@@ -116,7 +116,7 @@ </video> </if> <div id="enableDebuggingDiv" hidden="[[!debuggingLinkVisible]]"> - <a href="#" on-tap="onDebuggingLinkClicked_" id="enableDebuggingLink" + <a href="#" on-click="onDebuggingLinkClicked_" id="enableDebuggingLink" class="oobe-local-link"> [[i18nDynamic(locale, 'debuggingFeaturesLink')]] </a> @@ -126,7 +126,7 @@ <oobe-welcome-secondary-button id="languageSelectionButton" icon1x="oobe-welcome-dialog-20:language" icon2x="oobe-welcome-dialog-40:language" - on-tap="onLanguageClicked_" + on-click="onLanguageClicked_" label-for-aria="[[i18nDynamic(locale, 'languageButtonLabel', currentLanguage)]]"> <div slot="text">[[currentLanguage]]</div> @@ -135,16 +135,16 @@ text-key="accessibilityLink" icon1x="oobe-welcome-dialog-20:accessibility" icon2x="oobe-welcome-dialog-40:accessibility" - on-tap="onAccessibilityClicked_"></oobe-welcome-secondary-button> + on-click="onAccessibilityClicked_"></oobe-welcome-secondary-button> <oobe-welcome-secondary-button id="timezoneSettingsButton" text-key="timezoneButtonText" icon1x="oobe-welcome-32:timezone" icon2x="oobe-welcome-64:timezone" - on-tap="onTimezoneClicked_" + on-click="onTimezoneClicked_" hidden="[[!timezoneButtonVisible]]"></oobe-welcome-secondary-button> <div class="flex"></div> <oobe-next-button id="welcomeNextButton" - inverse on-tap="onNextClicked_" text-key="welcomeNextButtonText"> + inverse on-click="onNextClicked_" text-key="welcomeNextButtonText"> </oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/packaged_license_screen.html b/chrome/browser/resources/chromeos/login/packaged_license_screen.html index 1e40905..a88f065 100644 --- a/chrome/browser/resources/chromeos/login/packaged_license_screen.html +++ b/chrome/browser/resources/chromeos/login/packaged_license_screen.html
@@ -28,10 +28,10 @@ <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="dont-enroll-button" text-key="oobePackagedLicenseDontEnroll" - on-tap="onDontEnrollButtonPressed_"></oobe-text-button> + on-click="onDontEnrollButtonPressed_"></oobe-text-button> <oobe-text-button id="enroll-button" text-key="oobePackagedLicenseEnroll" class="focus-on-show" - inverse on-tap="onEnrollButtonPressed_"></oobe-text-button> + inverse on-click="onEnrollButtonPressed_"></oobe-text-button> </div> </oobe-dialog> </template>
diff --git a/chrome/browser/resources/chromeos/login/recommend_apps.html b/chrome/browser/resources/chromeos/login/recommend_apps.html index fe0488d..e58ca1e 100644 --- a/chrome/browser/resources/chromeos/login/recommend_apps.html +++ b/chrome/browser/resources/chromeos/login/recommend_apps.html
@@ -31,9 +31,9 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="skipButton" - text-key="recommendAppsSkip" on-tap="onSkip_" border> + text-key="recommendAppsSkip" on-click="onSkip_" border> </oobe-text-button> - <oobe-next-button id="installButton" on-tap="onInstall_" inverse + <oobe-next-button id="installButton" on-click="onInstall_" inverse text-key="recommendAppsInstall" disabled="[[!canProceed_(appsSelected_)]]"> </oobe-next-button>
diff --git a/chrome/browser/resources/chromeos/login/saml_confirm_password.html b/chrome/browser/resources/chromeos/login/saml_confirm_password.html index 0c7a0e5b..de5fe49a 100644 --- a/chrome/browser/resources/chromeos/login/saml_confirm_password.html +++ b/chrome/browser/resources/chromeos/login/saml_confirm_password.html
@@ -53,10 +53,10 @@ </cr-input> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button id="cancel" on-tap="onCancel_" text-key="cancel" + <oobe-text-button id="cancel" on-click="onCancel_" text-key="cancel" border> </oobe-text-button> - <oobe-next-button id="next" on-tap="submit_" inverse + <oobe-next-button id="next" on-click="submit_" inverse text-key="nextButtonText"> </oobe-next-button> </div>
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.js b/chrome/browser/resources/chromeos/login/screen_error_message.js index 56ac7a6..572fa64 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.js +++ b/chrome/browser/resources/chromeos/login/screen_error_message.js
@@ -114,32 +114,33 @@ $('error-message-back-button') .addEventListener('click', this.cancel.bind(this)); - $('error-message-md-reboot-button').addEventListener('tap', function(e) { - self.send(login.Screen.CALLBACK_USER_ACTED, USER_ACTION_REBOOT); - e.stopPropagation(); - }); + $('error-message-md-reboot-button') + .addEventListener('click', function(e) { + self.send(login.Screen.CALLBACK_USER_ACTED, USER_ACTION_REBOOT); + e.stopPropagation(); + }); $('error-message-md-diagnose-button') - .addEventListener('tap', function(e) { + .addEventListener('click', function(e) { self.send(login.Screen.CALLBACK_USER_ACTED, USER_ACTION_DIAGNOSE); e.stopPropagation(); }); $('error-message-md-configure-certs-button') - .addEventListener('tap', function(e) { + .addEventListener('click', function(e) { self.send( login.Screen.CALLBACK_USER_ACTED, USER_ACTION_CONFIGURE_CERTS); e.stopPropagation(); }); $('error-message-md-continue-button') - .addEventListener('tap', function(e) { + .addEventListener('click', function(e) { chrome.send('continueAppLaunch'); e.stopPropagation(); }); - $('error-message-md-ok-button').addEventListener('tap', function(e) { + $('error-message-md-ok-button').addEventListener('click', function(e) { chrome.send('login.ResetScreen.userActed', ['cancel-reset']); e.stopPropagation(); }); $('error-message-md-powerwash-button') - .addEventListener('tap', function(e) { + .addEventListener('click', function(e) { self.send( login.Screen.CALLBACK_USER_ACTED, USER_ACTION_LOCAL_STATE_POWERWASH);
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html index e1e9224..75ef3f70 100644 --- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.html +++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.html
@@ -50,14 +50,14 @@ </div> <oobe-text-button id="secondary-action-button" label-for-aria="[[secondaryActionButtonLabel_]]" - on-tap="onSecondaryActionButtonClicked_" + on-click="onSecondaryActionButtonClicked_" hidden="[[!secondaryActionButtonLabel_]]" disabled="[[!secondaryActionButtonEnabled_]]"> <div slot="text">[[secondaryActionButtonLabel_]]</div> </oobe-text-button> <oobe-text-button id="primary-action-button" label-for-aria="[[primaryActionButtonLabel_]]" - on-tap="onPrimaryActionButtonClicked_" + on-click="onPrimaryActionButtonClicked_" hidden="[[!primaryActionButtonLabel_]]" disabled="[[!primaryActionButtonEnabled_]]" inverse> @@ -84,18 +84,18 @@ [[i18nDynamic(locale, 'samlInterstitialMessage', samlInterstitialDomain_)]] <p> - <a href="#" class="oobe-local-link" on-tap="onSamlPageChangeAccount_" + <a href="#" class="oobe-local-link" on-click="onSamlPageChangeAccount_" id="interstitial-change-account"> [[i18nDynamic(locale, 'samlInterstitialChangeAccountLink')]] </a> </p> </div> <div slot="bottom-buttons" class="flex layout horizontal"> - <oobe-back-button id="interstitial-back" on-tap="onBackButtonClicked_"> + <oobe-back-button id="interstitial-back" on-click="onBackButtonClicked_"> </oobe-back-button> <div class="flex"> </div> - <oobe-next-button on-tap="onSamlInterstitialNext_" + <oobe-next-button on-click="onSamlInterstitialNext_" id="interstitial-next" class="focus-on-show"></oobe-next-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/screen_tpm_error.html b/chrome/browser/resources/chromeos/login/screen_tpm_error.html index fa05148..a35a76f 100644 --- a/chrome/browser/resources/chromeos/login/screen_tpm_error.html +++ b/chrome/browser/resources/chromeos/login/screen_tpm_error.html
@@ -15,7 +15,7 @@ </iron-icon> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="restartButton" inverse - text-key="errorTpmFailureRebootButton" on-tap="onRestartTap_"> + text-key="errorTpmFailureRebootButton" on-click="onRestartTap_"> </oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html b/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html index 0485d21..38e1e76 100644 --- a/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html +++ b/chrome/browser/resources/chromeos/login/screen_wrong_hwid.html
@@ -16,7 +16,7 @@ </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button id="skipButton" inverse - text-key="wrongHWIDScreenSkipLink" on-tap="onSkip_"> + text-key="wrongHWIDScreenSkipLink" on-click="onSkip_"> </oobe-text-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/security_token_pin.html b/chrome/browser/resources/chromeos/login/security_token_pin.html index 4e05462..49c9855 100644 --- a/chrome/browser/resources/chromeos/login/security_token_pin.html +++ b/chrome/browser/resources/chromeos/login/security_token_pin.html
@@ -43,8 +43,8 @@ </div> </div> <div slot="bottom-buttons" class="layout horizontal justified"> - <oobe-back-button id="back" on-tap="onBackClicked_"></oobe-back-button> - <oobe-next-button id="submit" on-tap="onSubmit_" + <oobe-back-button id="back" on-click="onBackClicked_"></oobe-back-button> + <oobe-next-button id="submit" on-click="onSubmit_" disabled="[[!canSubmit_]]"></oobe-next-button> </div> </oobe-dialog>
diff --git a/chrome/browser/resources/chromeos/login/sync_consent.html b/chrome/browser/resources/chromeos/login/sync_consent.html index f0debe7f..ed3c9546 100644 --- a/chrome/browser/resources/chromeos/login/sync_consent.html +++ b/chrome/browser/resources/chromeos/login/sync_consent.html
@@ -63,7 +63,7 @@ <div slot="bottom-buttons" class="layout horizontal end-justified"> <oobe-text-button class="focus-on-show" inverse id="settingsSaveAndContinueButton" - on-tap="onSettingsSaveAndContinue_" + on-click="onSettingsSaveAndContinue_" label-for-aria="[[i18nDynamic(locale, 'syncConsentAcceptAndContinue')]]"> <div slot="text" consent-description consent-confirmation> @@ -136,14 +136,14 @@ </div> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button id="declineButton" on-tap="onDeclineTap_" + <oobe-text-button id="declineButton" on-click="onDeclineTap_" label-for-aria="[[i18nDynamic(locale, 'syncConsentScreenDecline')]]"> <div slot="text" consent-description consent-confirmation> [[i18nDynamic(locale, 'syncConsentScreenDecline')]] </div> </oobe-text-button> - <oobe-text-button id="acceptButton" on-tap="onAcceptTap_" + <oobe-text-button id="acceptButton" on-click="onAcceptTap_" class="focus-on-show" inverse label-for-aria="[[i18nDynamic(locale, 'syncConsentScreenAccept')]]">
diff --git a/chrome/browser/resources/chromeos/login/update_required_card.html b/chrome/browser/resources/chromeos/login/update_required_card.html index 2582c42..fd9df1d 100644 --- a/chrome/browser/resources/chromeos/login/update_required_card.html +++ b/chrome/browser/resources/chromeos/login/update_required_card.html
@@ -31,7 +31,7 @@ images/2x/updating_2x.svg 2x"> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button inverse on-tap="onUpdateClicked_" + <oobe-text-button inverse on-click="onUpdateClicked_" class="focus-on-show" text-key="updateButtonCaption"> </oobe-text-button> </div> @@ -45,10 +45,10 @@ icon1x="oobe-32:enterprise" icon2x="oobe-64:enterprise"> </hd-iron-icon> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button inverse on-tap="onSelectNetworkClicked_" + <oobe-text-button inverse on-click="onSelectNetworkClicked_" class="focus-on-show" text-key="selectNetworkButtonCaption"> </oobe-text-button> - <oobe-text-button inverse on-tap="onUpdateClicked_" + <oobe-text-button inverse on-click="onUpdateClicked_" id="update-button" text-key="updateButtonCaption"> </oobe-text-button> </div> @@ -83,7 +83,7 @@ images/2x/updating_2x.svg 2x"> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button inverse on-tap="onCellularPermissionAccepted_" + <oobe-text-button inverse on-click="onCellularPermissionAccepted_" class="focus-on-show" text-key="AcceptUpdateOverCellularButton" id="cellular-permission-accept-button"> </oobe-text-button> @@ -106,7 +106,7 @@ images/2x/updating_2x.svg 2x"> </div> <div slot="bottom-buttons" class="layout horizontal end-justified"> - <oobe-text-button inverse on-tap="onSelectNetworkClicked_" + <oobe-text-button inverse on-click="onSelectNetworkClicked_" id="select-network-button" text-key="selectNetworkButtonCaption" class="focus-on-show"> </oobe-text-button>
diff --git a/chrome/browser/resources/chromeos/login/user_creation.html b/chrome/browser/resources/chromeos/login/user_creation.html index 8d894986..bb1705327 100644 --- a/chrome/browser/resources/chromeos/login/user_creation.html +++ b/chrome/browser/resources/chromeos/login/user_creation.html
@@ -98,12 +98,12 @@ </div> </div> <div slot="bottom-buttons" class="layout horizontal"> - <oobe-back-button id="backButton" on-tap="onBackClicked_" + <oobe-back-button id="backButton" on-click="onBackClicked_" hidden="[[!isBackButtonVisible_]]"> </oobe-back-button> <div class="flex"></div> <oobe-next-button id="nextButton" class="focus-on-show" - on-tap="onNextClicked_"> + on-click="onNextClicked_"> </oobe-next-button> </div> </oobe-dialog> @@ -116,7 +116,7 @@ <div slot="subtitle"> <div> [[i18nDynamic(locale, 'childSignInSubtitle')]] - <a href="#" class="oobe-local-link" on-tap="onLearnMoreClicked_"> + <a href="#" class="oobe-local-link" on-click="onLearnMoreClicked_"> [[i18nDynamic(locale, 'childSignInLearnMore')]] </a> </div> @@ -153,9 +153,9 @@ </div> </div> <div slot="bottom-buttons" class="layout horizontal justified"> - <oobe-back-button id="childBackButton" on-tap="onBackClicked_"> + <oobe-back-button id="childBackButton" on-click="onBackClicked_"> </oobe-back-button> - <oobe-next-button id="childNextButton" on-tap="onNextClicked_" + <oobe-next-button id="childNextButton" on-click="onNextClicked_" disabled="[[!selectedSignInMethod]]"> </oobe-next-button> </div>
diff --git a/chrome/browser/resources/chromeos/password_change/confirm_password_change.html b/chrome/browser/resources/chromeos/password_change/confirm_password_change.html index 92fb4aaa..cc559d4 100644 --- a/chrome/browser/resources/chromeos/password_change/confirm_password_change.html +++ b/chrome/browser/resources/chromeos/password_change/confirm_password_change.html
@@ -100,7 +100,7 @@ </div> <div slot="button-container"> - <cr-button class="action-button" on-tap="onSaveTap_"> + <cr-button class="action-button" on-click="onSaveTap_"> [[i18n('save')]] </cr-button> </div>
diff --git a/chrome/browser/resources/chromeos/password_change/password_change.html b/chrome/browser/resources/chromeos/password_change/password_change.html index 53c753f1..d35cbf1 100644 --- a/chrome/browser/resources/chromeos/password_change/password_change.html +++ b/chrome/browser/resources/chromeos/password_change/password_change.html
@@ -23,7 +23,7 @@ <cr-dialog id="dialog" exportparts="dialog"> <div slot="title"> [[i18n('hostedHeader')]] - <cr-icon-button iron-icon="cr:close" on-tap="onCloseTap_"> + <cr-icon-button iron-icon="cr:close" on-click="onCloseTap_"> </cr-icon-button> </div>
diff --git a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html index 9702996..0860d6a 100644 --- a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html +++ b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification.html
@@ -66,7 +66,7 @@ <div slot="body">[[i18n('body')]]</div> <div slot="button-container"> - <cr-button class="action-button" on-tap="onButtonTap_"> + <cr-button class="action-button" on-click="onButtonTap_"> [[i18n('button')]] </cr-button> </div> @@ -79,4 +79,4 @@ <urgent-password-expiry-notification id="main-element"> </urgent-password-expiry-notification> </body> -</html> \ No newline at end of file +</html>
diff --git a/chrome/browser/resources/inline_login/inline_login_app.html b/chrome/browser/resources/inline_login/inline_login_app.html index a8f5331c..7e86592e 100644 --- a/chrome/browser/resources/inline_login/inline_login_app.html +++ b/chrome/browser/resources/inline_login/inline_login_app.html
@@ -63,7 +63,7 @@ <div class="buttons" hidden$="[[loading_]]"> <cr-button class="back-button" aria-label="$i18n{accessibleBackButtonLabel}" - on-tap="handleGoBack_"> + on-click="handleGoBack_"> <iron-icon icon="[[getBackButtonIcon_()]]"></iron-icon> $i18n{accessibleBackButtonLabel} </cr-button>
diff --git a/chrome/browser/resources/print_preview/BUILD.gn b/chrome/browser/resources/print_preview/BUILD.gn index 1289f1a..872b96f 100644 --- a/chrome/browser/resources/print_preview/BUILD.gn +++ b/chrome/browser/resources/print_preview/BUILD.gn
@@ -13,11 +13,14 @@ preprocess_gen_manifest = "preprocessed_gen_manifest.json" if (optimize_webui) { + build_manifest = "build_manifest.json" + optimize_webui("build") { host = "print" input = rebase_path("$target_gen_dir/$preprocess_folder", root_build_dir) js_out_files = [ "print_preview.rollup.js" ] js_module_in_files = [ "print_preview.js" ] + out_manifest = "$target_gen_dir/$build_manifest" deps = [ ":preprocess", @@ -29,8 +32,15 @@ "pdf/pdf_scripting_api.js", ] } -} else { - generate_grd("build_grd") { +} + +generate_grd("build_grd") { + input_files = [ "print_preview.html" ] + input_files_base_dir = rebase_path(".", "//") + if (optimize_webui) { + deps = [ ":build" ] + manifest_files = [ "$target_gen_dir/$build_manifest" ] + } else { deps = [ ":preprocess", ":preprocess_generated", @@ -39,9 +49,9 @@ "$target_gen_dir/$preprocess_manifest", "$target_gen_dir/$preprocess_gen_manifest", ] - grd_prefix = "print_preview" - out_grd = "$target_gen_dir/${grd_prefix}_resources.grd" } + grd_prefix = "print_preview" + out_grd = "$target_gen_dir/${grd_prefix}_resources.grd" } preprocess_grit("preprocess") { @@ -49,7 +59,6 @@ out_folder = "$target_gen_dir/$preprocess_folder" out_manifest = "$target_gen_dir/$preprocess_manifest" in_files = [ - "print_preview.html", "cloud_print_interface.js", "cloud_print_interface_impl.js", "dark_mode_behavior.js",
diff --git a/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd b/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd deleted file mode 100644 index 1e02e1b..0000000 --- a/chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd +++ /dev/null
@@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<grit latest_public_release="0" current_release="1" output_all_resource_defines="false"> - <outputs> - <output filename="grit/print_preview_resources.h" type="rc_header"> - <emit emit_type='prepend'></emit> - </output> - <output filename="grit/print_preview_resources_map.cc" - type="resource_map_source" /> - <output filename="grit/print_preview_resources_map.h" - type="resource_map_header" /> - <output filename="print_preview_resources.pak" type="data_package" /> - </outputs> - <release seq="1"> - <includes> - <include name="IDR_PRINT_PREVIEW_PRINT_PREVIEW_HTML" - file="print_preview.html" - type="chrome_html" /> - <include name="IDR_PRINT_PREVIEW_PRINT_PREVIEW_ROLLUP_JS" - file="${root_gen_dir}\chrome\browser\resources\print_preview\print_preview.rollup.js" - use_base_dir="false" - type="BINDATA" /> - </includes> - </release> -</grit>
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html index 9ccd38e9..4e67cb4 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html +++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.html
@@ -159,7 +159,7 @@ <h2>$i18n{accountListHeader}</h2> </div> <cr-button disabled="[[!isSecondaryGoogleAccountSigninAllowed_]]" - id="add-account-button" on-tap="addAccount_" + id="add-account-button" on-click="addAccount_" deep-link-focus-id$="[[Setting.kAddAccount]]"> <div id="add-account-icon"></div> [[getAddAccountLabel_(isChildUser_,
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html index 0758667c..22de87c 100644 --- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html +++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.html
@@ -32,11 +32,13 @@ value="{{pendingPrinter_.printerName}}" on-input="onPrinterInfoChange_" label="$i18n{printerName}" + aria-label="$i18n{printerName}" maxlength=64> </cr-input> </div> <div class="settings-box two-line"> <cr-input label="$i18n{printerAddress}" + aria-label="$i18n{printerAddress}" id="printerAddress" on-input="onPrinterInfoChange_" value="{{pendingPrinter_.printerAddress}}" @@ -93,6 +95,7 @@ </div> <div class="settings-box two-line"> <cr-input id="printerQueue" label="$i18n{printerQueue}" + aria-label="$i18n{printerQueue}" value="{{pendingPrinter_.printerQueue}}" on-input="onPrinterInfoChange_" maxlength=64 @@ -103,6 +106,7 @@ </div> <div class="settings-box two-line"> <cr-input label="$i18n{printerURI}" readonly + aria-label="$i18n{printerURI}" value="[[getPrinterURI_(pendingPrinter_)]]" disabled="[[!isInputFieldEnabled_(networkProtocolActive_, pendingPrinter_.printServerUri)]]"> @@ -114,6 +118,7 @@ <cr-searchable-drop-down items="[[manufacturerList]]" id="printerPPDManufacturer" label="$i18n{printerManufacturer}" + aria-label="$i18n{printerManufacturer}" value="{{pendingPrinter_.ppdManufacturer}}" readonly="[[!isOnline_]]" invalid="{{isManufacturerInvalid_}}">
diff --git a/chrome/browser/resources/settings/site_settings/chooser_exception_list.js b/chrome/browser/resources/settings/site_settings/chooser_exception_list.js index 5c0de420..89328e6 100644 --- a/chrome/browser/resources/settings/site_settings/chooser_exception_list.js +++ b/chrome/browser/resources/settings/site_settings/chooser_exception_list.js
@@ -165,12 +165,12 @@ this.$.tooltip.hide(); target.removeEventListener('mouseleave', hide); target.removeEventListener('blur', hide); - target.removeEventListener('tap', hide); + target.removeEventListener('click', hide); this.$.tooltip.removeEventListener('mouseenter', hide); }; target.addEventListener('mouseleave', hide); target.addEventListener('blur', hide); - target.addEventListener('tap', hide); + target.addEventListener('click', hide); this.$.tooltip.addEventListener('mouseenter', hide); this.$.tooltip.show(); },
diff --git a/chrome/browser/resources/settings/site_settings/site_list.js b/chrome/browser/resources/settings/site_settings/site_list.js index 6a5f1e0..f8c3265 100644 --- a/chrome/browser/resources/settings/site_settings/site_list.js +++ b/chrome/browser/resources/settings/site_settings/site_list.js
@@ -332,12 +332,12 @@ this.$.tooltip.hide(); target.removeEventListener('mouseleave', hide); target.removeEventListener('blur', hide); - target.removeEventListener('tap', hide); + target.removeEventListener('click', hide); this.$.tooltip.removeEventListener('mouseenter', hide); }; target.addEventListener('mouseleave', hide); target.addEventListener('blur', hide); - target.addEventListener('tap', hide); + target.addEventListener('click', hide); this.$.tooltip.addEventListener('mouseenter', hide); this.$.tooltip.show(); },
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js index 4d2c4e9b..78dc450 100644 --- a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js +++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js
@@ -329,12 +329,12 @@ /** @type {{hide: Function}} */ (tooltip).hide(); target.removeEventListener('mouseleave', hide); target.removeEventListener('blur', hide); - target.removeEventListener('tap', hide); + target.removeEventListener('click', hide); tooltip.removeEventListener('mouseenter', hide); }; target.addEventListener('mouseleave', hide); target.addEventListener('blur', hide); - target.addEventListener('tap', hide); + target.addEventListener('click', hide); tooltip.addEventListener('mouseenter', hide); tooltip.show();
diff --git a/chrome/browser/resources/user_manager/user_manager_tutorial.html b/chrome/browser/resources/user_manager/user_manager_tutorial.html index e09abd67..2c5f6639 100644 --- a/chrome/browser/resources/user_manager/user_manager_tutorial.html +++ b/chrome/browser/resources/user_manager/user_manager_tutorial.html
@@ -257,14 +257,14 @@ <template is="dom-if" if="[[!isStepHidden_(currentStep_, 'notYou')]]"> <div class="tutorial-slide" id="notYou"> <iron-icon id="dismiss" icon="cr:close" - on-tap="onDissmissTap_"> + on-click="onDissmissTap_"> </iron-icon> <div class="slide-buttons"> <div class="slide-text"> $i18n{slideCompleteUserNotFound} </div> <div id="slide-add-user"> - <a id="addUser" is="action-link" on-tap="onAddUserTap_"> + <a id="addUser" is="action-link" on-click="onAddUserTap_"> $i18n{slideCompleteAddUser} </a> </div>
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java index a227793..92902c7 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/clipboard/ClipboardImageFileProvider.java
@@ -6,7 +6,6 @@ import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.CLIPBOARD_SHARED_URI; -import android.content.Context; import android.net.Uri; import android.text.TextUtils; @@ -24,9 +23,8 @@ public class ClipboardImageFileProvider implements Clipboard.ImageFileProvider { @Override public void storeImageAndGenerateUri( - Context context, byte[] imageData, String fileExtension, Callback<Uri> callback) { - ShareImageFileUtils.generateTemporaryUriFromData( - context, imageData, fileExtension, callback); + byte[] imageData, String fileExtension, Callback<Uri> callback) { + ShareImageFileUtils.generateTemporaryUriFromData(imageData, fileExtension, callback); } @Override
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java index 4fe42f7a..662b9f4 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediator.java
@@ -111,12 +111,12 @@ params, new ChromeShareExtras.Builder().build(), System.currentTimeMillis()); }; - generateTemporaryUriFromBitmap(mContext, title, bitmap, callback); + generateTemporaryUriFromBitmap(title, bitmap, callback); mCloseDialogRunnable.run(); } protected void generateTemporaryUriFromBitmap( - Context context, String fileName, Bitmap bitmap, Callback<Uri> callback) { - ShareImageFileUtils.generateTemporaryUriFromBitmap(context, fileName, bitmap, callback); + String fileName, Bitmap bitmap, Callback<Uri> callback) { + ShareImageFileUtils.generateTemporaryUriFromBitmap(fileName, bitmap, callback); } }
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java index 7750e9f..ac4198b 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetMediatorUnitTest.java
@@ -78,7 +78,7 @@ } @Override protected void generateTemporaryUriFromBitmap( - Context context, String fileName, Bitmap bitmap, Callback<Uri> callback) { + String fileName, Bitmap bitmap, Callback<Uri> callback) { mGenerateTemporaryUriFromBitmapCalled = true; }
diff --git a/chrome/browser/ssl/insecure_form/insecure_form_controller_client.cc b/chrome/browser/ssl/insecure_form/insecure_form_controller_client.cc index dda03486..0aeb81eb 100644 --- a/chrome/browser/ssl/insecure_form/insecure_form_controller_client.cc +++ b/chrome/browser/ssl/insecure_form/insecure_form_controller_client.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/interstitials/chrome_settings_page_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/webui_url_constants.h" +#include "components/security_interstitials/content/insecure_form_tab_storage.h" #include "components/security_interstitials/content/settings_page_helper.h" #include "content/public/browser/web_contents.h" @@ -40,9 +41,12 @@ } void InsecureFormControllerClient::Proceed() { - // TODO(crbug.com/1093955): The simple reload logic means the interstitial is - // bypassed with any reload (e.g. F5), ideally this shouldn't be the case. - + // Set the is_proceeding flag on the tab storage so reload doesn't trigger + // another interstitial. + security_interstitials::InsecureFormTabStorage* tab_storage = + security_interstitials::InsecureFormTabStorage::GetOrCreate( + web_contents_); + tab_storage->SetIsProceeding(true); // We don't check for repost on the proceed reload since the interstitial // explains this will submit the form. web_contents_->GetController().Reload(content::ReloadType::NORMAL, false);
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc index 4d3e151..555bbad9 100644 --- a/chrome/browser/ssl/ssl_browsertest.cc +++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -6261,6 +6261,44 @@ security_interstitials::InsecureFormBlockingPage::kTypeForTesting); } +// Checks reloading the interstitial is not treated as proceeding. +IN_PROC_BROWSER_TEST_F(SSLUITestWithInsecureFormsWarningEnabled, + TestReloadInsecureFormSubmissionWarningIsNotProceed) { + ASSERT_TRUE(embedded_test_server()->Start()); + ASSERT_TRUE(https_server_.Start()); + + std::string replacement_path = GetFilePathWithHostAndPortReplacement( + "/ssl/page_displays_insecure_form.html", + embedded_test_server()->host_port_pair()); + + // Navigate to an insecure form, make sure we get a warning. + ui_test_utils::NavigateToURL(browser(), + https_server_.GetURL(replacement_path)); + WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); + content::TestNavigationObserver nav_observer(tab, 1); + ASSERT_TRUE(content::ExecuteScript(tab, "submitForm();")); + nav_observer.Wait(); + security_interstitials::SecurityInterstitialTabHelper* helper = + security_interstitials::SecurityInterstitialTabHelper::FromWebContents( + tab); + EXPECT_TRUE(helper->IsDisplayingInterstitial()); + EXPECT_EQ(helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting() + ->GetTypeForTesting(), + security_interstitials::InsecureFormBlockingPage::kTypeForTesting); + // Reload the interstitial. + content::TestNavigationObserver reload_observer(tab, 1); + tab->GetController().Reload(content::ReloadType::NORMAL, false); + reload_observer.Wait(); + // Check we get another interstitial. + helper = + security_interstitials::SecurityInterstitialTabHelper::FromWebContents( + tab); + EXPECT_TRUE(helper->IsDisplayingInterstitial()); + EXPECT_EQ(helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting() + ->GetTypeForTesting(), + security_interstitials::InsecureFormBlockingPage::kTypeForTesting); +} + // Check proceed works correctly on insecure form warning. IN_PROC_BROWSER_TEST_F(SSLUITestWithInsecureFormsWarningEnabled, ProceedThroughInsecureFormWarning) { @@ -6270,7 +6308,7 @@ std::string replacement_path = GetFilePathWithHostAndPortReplacement( "/ssl/page_displays_insecure_form.html", embedded_test_server()->host_port_pair()); - GURL form_target_url("http://does-not-exist.test/ssl/google_files/logo.gif?"); + GURL form_target_url("http://does-not-exist.test/ssl/google_files/logo.gif"); ui_test_utils::NavigateToURL(browser(), https_server_.GetURL(replacement_path)); @@ -6358,7 +6396,7 @@ "/ssl/page_displays_insecure_form.html", embedded_test_server()->host_port_pair()); GURL form_site_url = https_server.GetURL(replacement_path); - GURL form_target_url("http://does-not-exist.test/ssl/google_files/logo.gif?"); + GURL form_target_url("http://does-not-exist.test/ssl/google_files/logo.gif"); // Navigate to site with insecure form and submit it. ui_test_utils::NavigateToURL(browser(), form_site_url);
diff --git a/chrome/browser/sync/test/integration/device_info_helper.cc b/chrome/browser/sync/test/integration/device_info_helper.cc index 03ad84f..a76d6d1b 100644 --- a/chrome/browser/sync/test/integration/device_info_helper.cc +++ b/chrome/browser/sync/test/integration/device_info_helper.cc
@@ -16,7 +16,7 @@ } void ServerDeviceInfoMatchChecker::OnCommit( - const std::string& committer_id, + const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) { if (committed_model_types.Has(syncer::DEVICE_INFO)) { CheckExitCondition();
diff --git a/chrome/browser/sync/test/integration/device_info_helper.h b/chrome/browser/sync/test/integration/device_info_helper.h index 35c78cb2..12f2c305 100644 --- a/chrome/browser/sync/test/integration/device_info_helper.h +++ b/chrome/browser/sync/test/integration/device_info_helper.h
@@ -28,7 +28,7 @@ delete; // FakeServer::Observer overrides. - void OnCommit(const std::string& committer_id, + void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) override; // StatusChangeChecker overrides.
diff --git a/chrome/browser/sync/test/integration/dictionary_helper.cc b/chrome/browser/sync/test/integration/dictionary_helper.cc index 8c179cdf..9e41122 100644 --- a/chrome/browser/sync/test/integration/dictionary_helper.cc +++ b/chrome/browser/sync/test/integration/dictionary_helper.cc
@@ -46,11 +46,6 @@ sync_datatype_helper::test()->GetProfile(index))->GetCustomDictionary(); } -SpellcheckCustomDictionary* GetVerifierDictionary() { - return SpellcheckServiceFactory::GetForContext( - sync_datatype_helper::test()->verifier())->GetCustomDictionary(); -} - void LoadDictionary(SpellcheckCustomDictionary* dictionary) { if (dictionary->IsLoaded()) return; @@ -66,53 +61,25 @@ } // namespace +const std::set<std::string>& GetDictionaryWords(int profile_index) { + return GetDictionary(profile_index)->GetWords(); +} void LoadDictionaries() { - for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) + for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { LoadDictionary(GetDictionary(i)); - if (sync_datatype_helper::test()->use_verifier()) - LoadDictionary(GetVerifierDictionary()); + } } size_t GetDictionarySize(int index) { return GetDictionary(index)->GetWords().size(); } -size_t GetVerifierDictionarySize() { - return GetVerifierDictionary()->GetWords().size(); -} - -bool DictionariesMatch() { - const std::set<std::string>& reference = - sync_datatype_helper::test()->use_verifier() - ? GetVerifierDictionary()->GetWords() - : GetDictionary(0)->GetWords(); - for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { - const std::set<std::string>& dictionary = GetDictionary(i)->GetWords(); - if (reference.size() != dictionary.size() || - !std::equal(reference.begin(), reference.end(), dictionary.begin())) { - return false; - } - } - return true; -} - -bool DictionaryMatchesVerifier(int index) { - const std::set<std::string>& expected = GetVerifierDictionary()->GetWords(); - const std::set<std::string>& actual = GetDictionary(index)->GetWords(); - return expected.size() == actual.size() && - std::equal(expected.begin(), expected.end(), actual.begin()); -} - bool AddWord(int index, const std::string& word) { SpellcheckCustomDictionary::Change dictionary_change; dictionary_change.AddWord(word); bool result = DictionarySyncIntegrationTestHelper::ApplyChange( GetDictionary(index), &dictionary_change); - if (sync_datatype_helper::test()->use_verifier()) { - result &= DictionarySyncIntegrationTestHelper::ApplyChange( - GetVerifierDictionary(), &dictionary_change); - } return result; } @@ -129,22 +96,25 @@ dictionary_change.RemoveWord(word); bool result = DictionarySyncIntegrationTestHelper::ApplyChange( GetDictionary(index), &dictionary_change); - if (sync_datatype_helper::test()->use_verifier()) { - result &= DictionarySyncIntegrationTestHelper::ApplyChange( - GetVerifierDictionary(), &dictionary_change); - } return result; } -} // namespace dictionary_helper - -DictionaryMatchChecker::DictionaryMatchChecker() +DictionaryChecker::DictionaryChecker( + const std::vector<std::string>& expected_words) : MultiClientStatusChangeChecker( - sync_datatype_helper::test()->GetSyncServices()) {} + sync_datatype_helper::test()->GetSyncServices()), + expected_words_(expected_words.begin(), expected_words.end()) {} -bool DictionaryMatchChecker::IsExitConditionSatisfied(std::ostream* os) { +DictionaryChecker::~DictionaryChecker() = default; + +bool DictionaryChecker::IsExitConditionSatisfied(std::ostream* os) { *os << "Waiting for matching dictionaries"; - return dictionary_helper::DictionariesMatch(); + for (int i = 0; i < sync_datatype_helper::test()->num_clients(); ++i) { + if (GetDictionaryWords(/*profile_index=*/i) != expected_words_) { + return false; + } + } + return true; } NumDictionaryEntriesChecker::NumDictionaryEntriesChecker(int index, @@ -155,8 +125,10 @@ num_words_(num_words) {} bool NumDictionaryEntriesChecker::IsExitConditionSatisfied(std::ostream* os) { - size_t actual_size = dictionary_helper::GetDictionarySize(index_); + size_t actual_size = GetDictionarySize(index_); *os << "Waiting for client " << index_ << ": " << actual_size << " / " << num_words_ << " words downloaded"; return actual_size == num_words_; } + +} // namespace dictionary_helper
diff --git a/chrome/browser/sync/test/integration/dictionary_helper.h b/chrome/browser/sync/test/integration/dictionary_helper.h index 4b52bd3..ebf3ff0 100644 --- a/chrome/browser/sync/test/integration/dictionary_helper.h +++ b/chrome/browser/sync/test/integration/dictionary_helper.h
@@ -7,6 +7,7 @@ #include <stddef.h> +#include <set> #include <string> #include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h" @@ -14,33 +15,22 @@ namespace dictionary_helper { -// Synchronously loads the dictionaries across all profiles. Also loads the -// dictionary for the verifier if DisableVerifier() hasn't been called. Returns -// only after the dictionaries have finished to load. +// Returns set of words stored in dictionary for given |profile_index|. +const std::set<std::string>& GetDictionaryWords(int profile_index); + +// Synchronously loads the dictionaries across all profiles. Returns only after +// the dictionaries have finished to load. void LoadDictionaries(); // Used to check the size of the dictionary within a particular sync profile. size_t GetDictionarySize(int index); -// Used to check the size of the dictionary within the verifier sync profile. -size_t GetVerifierDictionarySize(); - -// Used to verify that dictionaries match across all profiles. Also checks -// verifier if DisableVerifier() hasn't been called. -bool DictionariesMatch(); - -// Used to verify that the dictionary within a particular sync profile matches -// the dictionary within the verifier sync profile. -bool DictionaryMatchesVerifier(int index); - -// Adds |word| to the dictionary for profile with index |index|. Also adds -// |word| to the verifier if DisableVerifier() hasn't been called. Returns true +// Adds |word| to the dictionary for profile with index |index|. Returns true // if |word| is valid and not a duplicate. Otherwise returns false. bool AddWord(int index, const std::string& word); -// Add |n| words with the given |prefix| to the specified client |index|. Also -// adds to the verifier if not disAbled. Return value is true iff all words are -// not duplicates and valid. +// Add |n| words with the given |prefix| to the specified client |index|. Return +// value is true iff all words are not duplicates and valid. bool AddWords(int index, int n, const std::string& prefix); // Removes |word| from the dictionary for profile with index |index|. Also @@ -48,15 +38,17 @@ // Returns true if |word| was found. Otherwise returns false. bool RemoveWord(int index, const std::string& word); -} // namespace dictionary_helper - -// Checker to block until all services have matching dictionaries. -class DictionaryMatchChecker : public MultiClientStatusChangeChecker { +// Checker to block until all clients have expected dictionaries. +class DictionaryChecker : public MultiClientStatusChangeChecker { public: - DictionaryMatchChecker(); + explicit DictionaryChecker(const std::vector<std::string>& expected_words); + ~DictionaryChecker() override; // StatusChangeChecker implementation. bool IsExitConditionSatisfied(std::ostream* os) override; + + private: + std::set<std::string> expected_words_; }; // Checker to block until the number of dictionary entries to equal to an @@ -64,6 +56,7 @@ class NumDictionaryEntriesChecker : public SingleClientStatusChangeChecker { public: NumDictionaryEntriesChecker(int index, size_t num_words); + ~NumDictionaryEntriesChecker() override = default; // StatusChangeChecker implementation. bool IsExitConditionSatisfied(std::ostream* os) override; @@ -73,4 +66,6 @@ size_t num_words_; }; +} // namespace dictionary_helper + #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_DICTIONARY_HELPER_H_
diff --git a/chrome/browser/sync/test/integration/enable_disable_test.cc b/chrome/browser/sync/test/integration/enable_disable_test.cc index 293f024..51e72ec 100644 --- a/chrome/browser/sync/test/integration/enable_disable_test.cc +++ b/chrome/browser/sync/test/integration/enable_disable_test.cc
@@ -154,13 +154,7 @@ DISALLOW_COPY_AND_ASSIGN(EnableDisableSingleClientTest); }; -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_EnableOneAtATime DISABLED_EnableOneAtATime -#else -#define MAYBE_EnableOneAtATime EnableOneAtATime -#endif -IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, MAYBE_EnableOneAtATime) { +IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, EnableOneAtATime) { // Setup sync with no enabled types. SetupTest(/*all_types_enabled=*/false); @@ -195,13 +189,7 @@ } } -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_DisableOneAtATime DISABLED_DisableOneAtATime -#else -#define MAYBE_DisableOneAtATime DisableOneAtATime -#endif -IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, MAYBE_DisableOneAtATime) { +IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, DisableOneAtATime) { // Setup sync with no disabled types. SetupTest(/*all_types_enabled=*/true); @@ -228,14 +216,8 @@ } } -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_FastEnableDisableOneAtATime DISABLED_FastEnableDisableOneAtATime -#else -#define MAYBE_FastEnableDisableOneAtATime FastEnableDisableOneAtATime -#endif IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, - MAYBE_FastEnableDisableOneAtATime) { + FastEnableDisableOneAtATime) { // Setup sync with no enabled types. SetupTest(/*all_types_enabled=*/false); @@ -266,14 +248,8 @@ } } -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_FastDisableEnableOneAtATime DISABLED_FastDisableEnableOneAtATime -#else -#define MAYBE_FastDisableEnableOneAtATime FastDisableEnableOneAtATime -#endif IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, - MAYBE_FastDisableEnableOneAtATime) { + FastDisableEnableOneAtATime) { // Setup sync with no disabled types. SetupTest(/*all_types_enabled=*/true); @@ -296,16 +272,8 @@ } } -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_FastEnableDisableEnableOneAtATime \ - DISABLED_FastEnableDisableEnableOneAtATime -#else -#define MAYBE_FastEnableDisableEnableOneAtATime \ - FastEnableDisableEnableOneAtATime -#endif IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, - MAYBE_FastEnableDisableEnableOneAtATime) { + FastEnableDisableEnableOneAtATime) { // Setup sync with no enabled types. SetupTest(/*all_types_enabled=*/false); @@ -364,15 +332,7 @@ } } -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_FastEnableDisableEnable DISABLED_FastEnableDisableEnable -#else -#define MAYBE_FastEnableDisableEnable FastEnableDisableEnable -#endif - -IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, - MAYBE_FastEnableDisableEnable) { +IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, FastEnableDisableEnable) { SetupTest(/*all_types_enabled=*/false); // Enable all, and then disable+reenable immediately afterwards, before @@ -424,15 +384,8 @@ EXPECT_EQ(GetNumUpdatesDownloadedInLastCycle(), initial_updates_downloaded); } -// Flakiness spike on Windows, see crbug.com/1111227. -#if defined(OS_WIN) -#define MAYBE_DoesNotRedownloadAfterKeepData \ - DISABLED_DoesNotRedownloadAfterKeepData -#else -#define MAYBE_DoesNotRedownloadAfterKeepData DoesNotRedownloadAfterKeepData -#endif IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, - MAYBE_DoesNotRedownloadAfterKeepData) { + DoesNotRedownloadAfterKeepData) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(bookmarks_helper::GetBookmarkModel(0)->IsBookmarked( GURL(kSyncedBookmarkURL)));
diff --git a/chrome/browser/sync/test/integration/fake_server_invalidation_sender.cc b/chrome/browser/sync/test/integration/fake_server_invalidation_sender.cc index 1bc02e4..f5222b5c 100644 --- a/chrome/browser/sync/test/integration/fake_server_invalidation_sender.cc +++ b/chrome/browser/sync/test/integration/fake_server_invalidation_sender.cc
@@ -27,9 +27,9 @@ FakeServerInvalidationSender::~FakeServerInvalidationSender() {} void FakeServerInvalidationSender::OnCommit( - const std::string& committer_id, + const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) { - if (!self_notify_ && client_id_ == committer_id) { + if (!self_notify_ && client_id_ == committer_invalidator_client_id) { return; } syncer::FCMNetworkHandler* fcm_network_handler =
diff --git a/chrome/browser/sync/test/integration/fake_server_invalidation_sender.h b/chrome/browser/sync/test/integration/fake_server_invalidation_sender.h index 86ba61e..5d95fc3a 100644 --- a/chrome/browser/sync/test/integration/fake_server_invalidation_sender.h +++ b/chrome/browser/sync/test/integration/fake_server_invalidation_sender.h
@@ -29,7 +29,7 @@ ~FakeServerInvalidationSender() override; // FakeServer::Observer implementation. - void OnCommit(const std::string& committer_id, + void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) override; private:
diff --git a/chrome/browser/sync/test/integration/fake_server_match_status_checker.cc b/chrome/browser/sync/test/integration/fake_server_match_status_checker.cc index abba44e..3595e862 100644 --- a/chrome/browser/sync/test/integration/fake_server_match_status_checker.cc +++ b/chrome/browser/sync/test/integration/fake_server_match_status_checker.cc
@@ -20,7 +20,7 @@ } void FakeServerMatchStatusChecker::OnCommit( - const std::string& committer_id, + const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) { CheckExitCondition(); }
diff --git a/chrome/browser/sync/test/integration/fake_server_match_status_checker.h b/chrome/browser/sync/test/integration/fake_server_match_status_checker.h index 7a88ca9..624e205 100644 --- a/chrome/browser/sync/test/integration/fake_server_match_status_checker.h +++ b/chrome/browser/sync/test/integration/fake_server_match_status_checker.h
@@ -23,7 +23,7 @@ ~FakeServerMatchStatusChecker() override; // FakeServer::Observer implementation. - void OnCommit(const std::string& committer_id, + void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) override; protected:
diff --git a/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc index 22432e1..ef5a3ad 100644 --- a/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc +++ b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.cc
@@ -30,7 +30,7 @@ } void FakeServerSyncInvalidationSender::OnCommit( - const std::string& committer_id, + const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) { const std::map<std::string, syncer::ModelTypeSet> token_to_interested_data_types_map = GetTokenToInterestedDataTypesMap();
diff --git a/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h index 448389a..34f0e60 100644 --- a/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h +++ b/chrome/browser/sync/test/integration/fake_server_sync_invalidation_sender.h
@@ -30,7 +30,7 @@ const FakeServerSyncInvalidationSender&) = delete; // FakeServer::Observer implementation. - void OnCommit(const std::string& committer_id, + void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) override; private:
diff --git a/chrome/browser/sync/test/integration/offer_helper.cc b/chrome/browser/sync/test/integration/offer_helper.cc new file mode 100644 index 0000000..0e1e6dc3 --- /dev/null +++ b/chrome/browser/sync/test/integration/offer_helper.cc
@@ -0,0 +1,37 @@ +// Copyright 2020 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. + +#include "chrome/browser/sync/test/integration/offer_helper.h" + +#include "base/strings/string_number_conversions.h" +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/data_model/autofill_offer_data.h" +#include "components/autofill/core/browser/webdata/autofill_sync_bridge_util.h" + +using autofill::AutofillOfferData; +using autofill::SetAutofillOfferSpecificsFromOfferData; +using autofill::test::GetCardLinkedOfferData1; +using sync_pb::AutofillOfferSpecifics; +using sync_pb::SyncEntity; + +namespace offer_helper { + +SyncEntity CreateDefaultSyncCardLinkedOffer() { + return CreateSyncCardLinkedOffer(GetCardLinkedOfferData1()); +} + +SyncEntity CreateSyncCardLinkedOffer(const AutofillOfferData& offer_data) { + SyncEntity entity; + entity.set_name(base::NumberToString(offer_data.offer_id)); + entity.set_id_string(base::NumberToString(offer_data.offer_id)); + entity.set_version(0); // Will be overridden by the fake server. + entity.set_ctime(12345); + entity.set_mtime(12345); + AutofillOfferSpecifics* offer_specifics = + entity.mutable_specifics()->mutable_autofill_offer(); + SetAutofillOfferSpecificsFromOfferData(offer_data, offer_specifics); + return entity; +} + +} // namespace offer_helper
diff --git a/chrome/browser/sync/test/integration/offer_helper.h b/chrome/browser/sync/test/integration/offer_helper.h new file mode 100644 index 0000000..dd8a138 --- /dev/null +++ b/chrome/browser/sync/test/integration/offer_helper.h
@@ -0,0 +1,27 @@ +// Copyright 2020 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 CHROME_BROWSER_SYNC_TEST_INTEGRATION_OFFER_HELPER_H_ +#define CHROME_BROWSER_SYNC_TEST_INTEGRATION_OFFER_HELPER_H_ + +#include <string> + +namespace autofill { +struct AutofillOfferData; +} // namespace autofill + +namespace sync_pb { +class SyncEntity; +} // namespace sync_pb + +namespace offer_helper { + +sync_pb::SyncEntity CreateDefaultSyncCardLinkedOffer(); + +sync_pb::SyncEntity CreateSyncCardLinkedOffer( + const autofill::AutofillOfferData& offer_data); + +} // namespace offer_helper + +#endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_OFFER_HELPER_H_
diff --git a/chrome/browser/sync/test/integration/performance/dictionary_sync_perf_test.cc b/chrome/browser/sync/test/integration/performance/dictionary_sync_perf_test.cc index 3d697fc5..2062b43 100644 --- a/chrome/browser/sync/test/integration/performance/dictionary_sync_perf_test.cc +++ b/chrome/browser/sync/test/integration/performance/dictionary_sync_perf_test.cc
@@ -34,7 +34,7 @@ class DictionarySyncPerfTest : public SyncTest { public: DictionarySyncPerfTest() : SyncTest(TWO_CLIENT) {} - ~DictionarySyncPerfTest() override {} + ~DictionarySyncPerfTest() override = default; private: DISALLOW_COPY_AND_ASSIGN(DictionarySyncPerfTest); @@ -43,7 +43,8 @@ IN_PROC_BROWSER_TEST_F(DictionarySyncPerfTest, P0) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(dictionary_helper::DictionariesMatch()); + ASSERT_TRUE( + dictionary_helper::DictionaryChecker(/*expected_words=*/{}).Wait()); auto reporter = SetUpReporter( base::NumberToString(spellcheck::kMaxSyncableDictionaryWords) + "_words");
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc index ba9de57..fc2b5a1 100644 --- a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc +++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
@@ -32,9 +32,11 @@ DCHECK(marker1.data_type_id() == marker2.data_type_id()); if (syncer::GetModelTypeFromSpecificsFieldNumber(marker1.data_type_id()) == - syncer::AUTOFILL_WALLET_DATA) { - return fake_server::AreWalletDataProgressMarkersEquivalent(marker1, - marker2); + syncer::AUTOFILL_WALLET_DATA || + syncer::GetModelTypeFromSpecificsFieldNumber(marker1.data_type_id()) == + syncer::AUTOFILL_WALLET_OFFER) { + return fake_server::AreFullUpdateTypeDataProgressMarkersEquivalent(marker1, + marker2); } return marker1.SerializeAsString() == marker2.SerializeAsString(); }
diff --git a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc index a3754a2c..517babd 100644 --- a/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc
@@ -58,7 +58,7 @@ fake_server_->RemoveObserver(this); } - void OnCommit(const std::string& committer_id, + void OnCommit(const std::string& committer_invalidator_client_id, ModelTypeSet committed_model_types) override { sync_pb::ClientToServerMessage message; fake_server_->GetLastCommitMessage(&message);
diff --git a/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc b/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc index fbaab94e..c7ac901 100644 --- a/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc
@@ -8,32 +8,32 @@ #include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h" #include "components/sync/driver/profile_sync_service.h" #include "content/public/test/browser_test.h" +#include "testing/gmock/include/gmock/gmock.h" namespace { +using testing::ElementsAre; +using testing::IsEmpty; + class SingleClientDictionarySyncTest : public SyncTest { public: SingleClientDictionarySyncTest() : SyncTest(SINGLE_CLIENT) {} - - ~SingleClientDictionarySyncTest() override {} - - private: - DISALLOW_COPY_AND_ASSIGN(SingleClientDictionarySyncTest); + ~SingleClientDictionarySyncTest() override = default; }; IN_PROC_BROWSER_TEST_F(SingleClientDictionarySyncTest, Sanity) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(dictionary_helper::DictionariesMatch()); + EXPECT_THAT(dictionary_helper::GetDictionaryWords(0), IsEmpty()); - std::string word = "foo"; - ASSERT_TRUE(dictionary_helper::AddWord(0, word)); - ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); - ASSERT_TRUE(dictionary_helper::DictionariesMatch()); + const std::string word = "foo"; + EXPECT_TRUE(dictionary_helper::AddWord(0, word)); + EXPECT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); + EXPECT_THAT(dictionary_helper::GetDictionaryWords(0), ElementsAre(word)); - ASSERT_TRUE(dictionary_helper::RemoveWord(0, word)); - ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); - ASSERT_TRUE(dictionary_helper::DictionariesMatch()); + EXPECT_TRUE(dictionary_helper::RemoveWord(0, word)); + EXPECT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait()); + EXPECT_THAT(dictionary_helper::GetDictionaryWords(0), IsEmpty()); } } // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_offer_sync_test.cc b/chrome/browser/sync/test/integration/single_client_offer_sync_test.cc new file mode 100644 index 0000000..2af7a58 --- /dev/null +++ b/chrome/browser/sync/test/integration/single_client_offer_sync_test.cc
@@ -0,0 +1,287 @@ +// Copyright 2020 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. + +#include "build/build_config.h" +#include "chrome/browser/sync/test/integration/autofill_helper.h" +#include "chrome/browser/sync/test/integration/offer_helper.h" +#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" +#include "chrome/browser/sync/test/integration/sync_integration_test_util.h" +#include "chrome/browser/sync/test/integration/sync_test.h" +#include "chrome/browser/sync/test/integration/wallet_helper.h" +#include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/data_model/autofill_offer_data.h" +#include "components/autofill/core/browser/personal_data_manager.h" +#include "components/autofill/core/browser/personal_data_manager_observer.h" +#include "components/autofill/core/common/autofill_payments_features.h" +#include "components/sync/base/model_type.h" +#include "components/sync/driver/sync_driver_switches.h" +#include "components/sync/driver/sync_service.h" +#include "components/sync/protocol/model_type_state.pb.h" +#include "components/sync/test/fake_server/fake_server.h" +#include "content/public/test/browser_test.h" +#include "testing/gmock/include/gmock/gmock.h" + +using autofill::AutofillOfferData; +using autofill::features::kAutofillEnableOffersInDownstream; +using autofill::test::GetCardLinkedOfferData1; +using autofill::test::GetCardLinkedOfferData2; +using offer_helper::CreateDefaultSyncCardLinkedOffer; +using offer_helper::CreateSyncCardLinkedOffer; +using switches::kSyncAutofillWalletOfferData; +using wallet_helper::GetPersonalDataManager; +using wallet_helper::GetWalletModelTypeState; + +namespace { + +ACTION_P(QuitMessageLoop, loop) { + loop->Quit(); +} + +const syncer::SyncFirstSetupCompleteSource kSetSourceFromTest = + syncer::SyncFirstSetupCompleteSource::BASIC_FLOW; + +} // namespace + +class SingleClientOfferSyncTest : public SyncTest { + public: + SingleClientOfferSyncTest() : SyncTest(SINGLE_CLIENT) { + features_.InitWithFeatures( + /*enabled_features=*/{kSyncAutofillWalletOfferData, + kAutofillEnableOffersInDownstream}, + /*disabled_features=*/{}); + } + + ~SingleClientOfferSyncTest() override = default; + + SingleClientOfferSyncTest(const SingleClientOfferSyncTest&) = delete; + SingleClientOfferSyncTest& operator=(const SingleClientOfferSyncTest&) = + delete; + + protected: + void WaitForOnPersonalDataChanged(autofill::PersonalDataManager* pdm) { + testing::NiceMock<PersonalDataLoadedObserverMock> personal_data_observer; + pdm->AddObserver(&personal_data_observer); + base::RunLoop run_loop; + EXPECT_CALL(personal_data_observer, OnPersonalDataChanged()) + .WillOnce(QuitMessageLoop(&run_loop)); + run_loop.Run(); + pdm->RemoveObserver(&personal_data_observer); + } + + void WaitForNumberOfOffers(size_t expected_count, + autofill::PersonalDataManager* pdm) { + while (pdm->GetCreditCardOffers().size() != expected_count || + pdm->HasPendingQueriesForTesting()) { + WaitForOnPersonalDataChanged(pdm); + } + } + + bool TriggerGetUpdatesAndWait() { + const base::Time now = base::Time::Now(); + // Trigger a sync and wait for the new data to arrive. + TriggerSyncForModelTypes( + 0, syncer::ModelTypeSet(syncer::AUTOFILL_WALLET_OFFER)); + return FullUpdateTypeProgressMarkerChecker(now, GetSyncService(0), + syncer::AUTOFILL_WALLET_OFFER) + .Wait(); + } + + private: + base::test::ScopedFeatureList features_; +}; + +// Ensures that the offer sync type is enabled by default. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, EnabledByDefault) { + ASSERT_TRUE(SetupSync()); + ASSERT_TRUE(GetClient(0)->service()->GetActiveDataTypes().Has( + syncer::AUTOFILL_WALLET_OFFER)); +} + +// Ensures that offer data should get cleared from the database when sync is +// disabled. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, ClearOnDisableSync) { + GetFakeServer()->SetOfferData({CreateDefaultSyncCardLinkedOffer()}); + ASSERT_TRUE(SetupSync()); + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + // Make sure the offer data is in the DB. + ASSERT_EQ(1uL, pdm->GetCreditCardOffers().size()); + + // Disable sync, the offer data should be gone. + GetSyncService(0)->StopAndClear(); + WaitForNumberOfOffers(0, pdm); + EXPECT_EQ(0uL, pdm->GetCreditCardOffers().size()); + + // Turn sync on again, the data should come back. + GetSyncService(0)->GetUserSettings()->SetSyncRequested(true); + // StopAndClear() also clears the "first setup complete" flag, so set it + // again. + GetSyncService(0)->GetUserSettings()->SetFirstSetupComplete( + kSetSourceFromTest); + // Wait until Sync restores the card and it arrives at PDM. + WaitForNumberOfOffers(1, pdm); + EXPECT_EQ(1uL, pdm->GetCreditCardOffers().size()); +} + +// Ensures that offer data should get cleared from the database when sync is +// (temporarily) stopped, e.g. due to the Sync feature toggle in Android +// settings. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, ClearOnStopSync) { + GetFakeServer()->SetOfferData({CreateDefaultSyncCardLinkedOffer()}); + ASSERT_TRUE(SetupSync()); + + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + // Make sure the offer data is in the DB. + ASSERT_EQ(1uL, pdm->GetCreditCardOffers().size()); + + // Stop sync, the offer data should be gone. + GetSyncService(0)->GetUserSettings()->SetSyncRequested(false); + WaitForNumberOfOffers(0, pdm); + EXPECT_EQ(0uL, pdm->GetCreditCardOffers().size()); + + // Turn sync on again, the data should come back. + GetSyncService(0)->GetUserSettings()->SetSyncRequested(true); + // Wait until Sync restores the card and it arrives at PDM. + WaitForNumberOfOffers(1, pdm); + EXPECT_EQ(1uL, pdm->GetCreditCardOffers().size()); +} + +// ChromeOS does not sign out, so the test below does not apply. +#if !defined(OS_CHROMEOS) +// Offer data should get cleared from the database when the user signs out. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, ClearOnSignOut) { + GetFakeServer()->SetOfferData({CreateDefaultSyncCardLinkedOffer()}); + ASSERT_TRUE(SetupSync()); + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + // Make sure the data & metadata is in the DB. + ASSERT_EQ(1uL, pdm->GetCreditCardOffers().size()); + + // Signout, the data & metadata should be gone. + GetClient(0)->SignOutPrimaryAccount(); + WaitForNumberOfOffers(0, pdm); + EXPECT_EQ(0uL, pdm->GetCreditCardOffers().size()); +} +#endif // !defined(OS_CHROMEOS) + +// Offer is not using incremental updates. Make sure existing data gets +// replaced when synced down. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, + NewSyncDataShouldReplaceExistingData) { + AutofillOfferData offer1 = GetCardLinkedOfferData1(); + offer1.offer_id = 999; + GetFakeServer()->SetOfferData({CreateSyncCardLinkedOffer(offer1)}); + ASSERT_TRUE(SetupSync()); + + // Make sure the data is in the DB. + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + std::vector<AutofillOfferData*> offers = pdm->GetCreditCardOffers(); + ASSERT_EQ(1uL, offers.size()); + EXPECT_EQ(999, offers[0]->offer_id); + + // Put some completely new data in the sync server. + AutofillOfferData offer2 = GetCardLinkedOfferData2(); + offer2.offer_id = 888; + GetFakeServer()->SetOfferData({CreateSyncCardLinkedOffer(offer2)}); + WaitForOnPersonalDataChanged(pdm); + + // Make sure only the new data is present. + offers = pdm->GetCreditCardOffers(); + ASSERT_EQ(1uL, offers.size()); + EXPECT_EQ(888, offers[0]->offer_id); +} + +// Offer is not using incremental updates. The server either sends a non-empty +// update with deletion gc directives and with the (possibly empty) full data +// set, or (more often) an empty update. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, EmptyUpdatesAreIgnored) { + AutofillOfferData offer1 = GetCardLinkedOfferData1(); + offer1.offer_id = 999; + GetFakeServer()->SetOfferData({CreateSyncCardLinkedOffer(offer1)}); + ASSERT_TRUE(SetupSync()); + + // Make sure the card is in the DB. + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + std::vector<AutofillOfferData*> offers = pdm->GetCreditCardOffers(); + ASSERT_EQ(1uL, offers.size()); + EXPECT_EQ(999, offers[0]->offer_id); + + // Trigger a sync and wait for the new data to arrive. + sync_pb::ModelTypeState state_before = + GetWalletModelTypeState(syncer::AUTOFILL_WALLET_OFFER, 0); + ASSERT_TRUE(TriggerGetUpdatesAndWait()); + + // Check that the new progress marker is stored for empty updates. This is a + // regression check for crbug.com/924447. + sync_pb::ModelTypeState state_after = + GetWalletModelTypeState(syncer::AUTOFILL_WALLET_OFFER, 0); + EXPECT_NE(state_before.progress_marker().token(), + state_after.progress_marker().token()); + + // Refresh the pdm to make sure we are checking its state after any potential + // changes from sync in the DB propagate into pdm. As we don't expect anything + // to change, we have no better specific condition to wait for. + pdm->Refresh(); + while (pdm->HasPendingQueriesForTesting()) { + WaitForOnPersonalDataChanged(pdm); + } + + // Make sure the same data is present on the client. + offers = pdm->GetCreditCardOffers(); + ASSERT_EQ(1uL, offers.size()); + EXPECT_EQ(999, offers[0]->offer_id); +} + +// If the server sends the same offers with changed data, they should change on +// the client. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, ChangedEntityGetsUpdated) { + AutofillOfferData offer = GetCardLinkedOfferData1(); + offer.offer_id = 999; + offer.eligible_instrument_id.clear(); + offer.eligible_instrument_id.push_back(111111); + GetFakeServer()->SetOfferData({CreateSyncCardLinkedOffer(offer)}); + ASSERT_TRUE(SetupSync()); + + // Make sure the card is in the DB. + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + std::vector<AutofillOfferData*> offers = pdm->GetCreditCardOffers(); + ASSERT_EQ(1uL, offers.size()); + EXPECT_EQ(999, offers[0]->offer_id); + EXPECT_EQ(1U, offers[0]->eligible_instrument_id.size()); + + // Update the data. + offer.eligible_instrument_id.push_back(222222); + GetFakeServer()->SetOfferData({CreateSyncCardLinkedOffer(offer)}); + WaitForOnPersonalDataChanged(pdm); + + // Make sure the data is present on the client. + pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + offers = pdm->GetCreditCardOffers(); + ASSERT_EQ(1uL, offers.size()); + EXPECT_EQ(999, offers[0]->offer_id); + EXPECT_EQ(2U, offers[0]->eligible_instrument_id.size()); +} + +// Offer data should get cleared from the database when the Autofill sync type +// flag is disabled. +IN_PROC_BROWSER_TEST_F(SingleClientOfferSyncTest, ClearOnDisableWalletSync) { + GetFakeServer()->SetOfferData({CreateDefaultSyncCardLinkedOffer()}); + ASSERT_TRUE(SetupSync()); + + autofill::PersonalDataManager* pdm = GetPersonalDataManager(0); + ASSERT_NE(nullptr, pdm); + // Make sure the data is in the DB. + ASSERT_EQ(1uL, pdm->GetCreditCardOffers().size()); + + // Turn off autofill sync, the data should be gone. + ASSERT_TRUE( + GetClient(0)->DisableSyncForType(syncer::UserSelectableType::kAutofill)); + WaitForNumberOfOffers(0, pdm); + EXPECT_EQ(0uL, pdm->GetCreditCardOffers().size()); +}
diff --git a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc index 7b7500415..220c7be 100644 --- a/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc
@@ -63,7 +63,7 @@ using wallet_helper::GetProfileWebDataService; using wallet_helper::GetServerAddressesMetadata; using wallet_helper::GetServerCardsMetadata; -using wallet_helper::GetWalletDataModelTypeState; +using wallet_helper::GetWalletModelTypeState; using wallet_helper::kDefaultBillingAddressID; using wallet_helper::kDefaultCardID; using wallet_helper::kDefaultCreditCardCloudTokenDataID; @@ -110,62 +110,6 @@ DISALLOW_COPY_AND_ASSIGN(AutofillWebDataServiceConsumer); }; -class WaitForWalletUpdateChecker : public StatusChangeChecker, - public syncer::SyncServiceObserver { - public: - WaitForWalletUpdateChecker(base::Time min_required_progress_marker_timestamp, - syncer::SyncService* service) - : min_required_progress_marker_timestamp_( - min_required_progress_marker_timestamp), - service_(service) { - scoped_observer_.Add(service); - } - - bool IsExitConditionSatisfied(std::ostream* os) override { - // GetLastCycleSnapshot() returns by value, so make sure to capture it for - // iterator use. - const syncer::SyncCycleSnapshot snap = - service_->GetLastCycleSnapshotForDebugging(); - const syncer::ProgressMarkerMap& progress_markers = - snap.download_progress_markers(); - auto marker_it = progress_markers.find(syncer::AUTOFILL_WALLET_DATA); - if (marker_it == progress_markers.end()) { - *os << "Waiting for an updated Wallet progress marker timestamp " - << min_required_progress_marker_timestamp_ - << "; actual: no progress marker in last sync cycle"; - return false; - } - - sync_pb::DataTypeProgressMarker progress_marker; - bool success = progress_marker.ParseFromString(marker_it->second); - DCHECK(success); - - const base::Time actual_timestamp = - fake_server::FakeServer::GetWalletProgressMarkerTimestamp( - progress_marker); - - *os << "Waiting for an updated Wallet progress marker timestamp " - << min_required_progress_marker_timestamp_ << "; actual " - << actual_timestamp; - - return actual_timestamp >= min_required_progress_marker_timestamp_; - } - - // syncer::SyncServiceObserver implementation. - void OnSyncCycleCompleted(syncer::SyncService* sync) override { - CheckExitCondition(); - } - - private: - const base::Time min_required_progress_marker_timestamp_; - const syncer::SyncService* const service_; - - ScopedObserver<syncer::SyncService, syncer::SyncServiceObserver> - scoped_observer_{this}; - - DISALLOW_COPY_AND_ASSIGN(WaitForWalletUpdateChecker); -}; - std::vector<std::unique_ptr<CreditCard>> GetServerCards( scoped_refptr<autofill::AutofillWebDataService> service) { AutofillWebDataServiceConsumer<std::vector<std::unique_ptr<CreditCard>>> @@ -264,7 +208,9 @@ // Trigger a sync and wait for the new data to arrive. TriggerSyncForModelTypes( 0, syncer::ModelTypeSet(syncer::AUTOFILL_WALLET_DATA)); - return WaitForWalletUpdateChecker(now, GetSyncService(0)).Wait(); + return FullUpdateTypeProgressMarkerChecker(now, GetSyncService(0), + syncer::AUTOFILL_WALLET_DATA) + .Wait(); } void AdvanceAutofillClockByOneDay() { @@ -670,12 +616,14 @@ EXPECT_EQ("data-1", cloud_token_data[0]->instrument_token); // Trigger a sync and wait for the new data to arrive. - sync_pb::ModelTypeState state_before = GetWalletDataModelTypeState(0); + sync_pb::ModelTypeState state_before = + GetWalletModelTypeState(syncer::AUTOFILL_WALLET_DATA, 0); ASSERT_TRUE(TriggerGetUpdatesAndWait()); // Check that the new progress marker is stored for empty updates. This is a // regression check for crbug.com/924447. - sync_pb::ModelTypeState state_after = GetWalletDataModelTypeState(0); + sync_pb::ModelTypeState state_after = + GetWalletModelTypeState(syncer::AUTOFILL_WALLET_DATA, 0); EXPECT_NE(state_before.progress_marker().token(), state_after.progress_marker().token());
diff --git a/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc b/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc index 76e1371..476f48c 100644 --- a/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc
@@ -16,122 +16,106 @@ namespace { +using dictionary_helper::AddWord; +using dictionary_helper::AddWords; +using dictionary_helper::DictionaryChecker; +using dictionary_helper::GetDictionarySize; +using dictionary_helper::LoadDictionaries; +using dictionary_helper::NumDictionaryEntriesChecker; +using dictionary_helper::RemoveWord; using spellcheck::kMaxSyncableDictionaryWords; class TwoClientDictionarySyncTest : public SyncTest { public: TwoClientDictionarySyncTest() : SyncTest(TWO_CLIENT) {} - - ~TwoClientDictionarySyncTest() override {} + ~TwoClientDictionarySyncTest() override = default; bool TestUsesSelfNotifications() override { return false; } - - private: - DISALLOW_COPY_AND_ASSIGN(TwoClientDictionarySyncTest); }; IN_PROC_BROWSER_TEST_F(TwoClientDictionarySyncTest, E2E_ENABLED(Sanity)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + LoadDictionaries(); + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); - std::vector<std::string> words; - words.push_back("foo"); - words.push_back("bar"); + const std::vector<std::string> words{"foo", "bar"}; ASSERT_EQ(num_clients(), static_cast<int>(words.size())); for (int i = 0; i < num_clients(); ++i) { - ASSERT_TRUE(dictionary_helper::AddWord(i, words[i])); + EXPECT_TRUE(AddWord(i, words[i])); } - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(words.size(), dictionary_helper::GetDictionarySize(0)); + EXPECT_TRUE(DictionaryChecker(words).Wait()); for (int i = 0; i < num_clients(); ++i) { - ASSERT_TRUE(dictionary_helper::RemoveWord(i, words[i])); + EXPECT_TRUE(RemoveWord(i, words[i])); } - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(0UL, dictionary_helper::GetDictionarySize(0)); + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); - DisableVerifier(); - for (int i = 0; i < num_clients(); ++i) - ASSERT_TRUE(dictionary_helper::AddWord(i, words[i])); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(words.size(), dictionary_helper::GetDictionarySize(0)); + for (int i = 0; i < num_clients(); ++i) { + EXPECT_TRUE(AddWord(i, words[i])); + } + EXPECT_TRUE(DictionaryChecker(words).Wait()); } IN_PROC_BROWSER_TEST_F(TwoClientDictionarySyncTest, E2E_ENABLED(SimultaneousAdd)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + LoadDictionaries(); + ASSERT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); - for (int i = 0; i < num_clients(); ++i) - dictionary_helper::AddWord(i, "foo"); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(1UL, dictionary_helper::GetDictionarySize(0)); + const std::string word = "foo"; + for (int i = 0; i < num_clients(); ++i) { + dictionary_helper::AddWord(i, word); + } + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{word}).Wait()); } IN_PROC_BROWSER_TEST_F(TwoClientDictionarySyncTest, E2E_ENABLED(SimultaneousRemove)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + LoadDictionaries(); + ASSERT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); - for (int i = 0; i < num_clients(); ++i) - dictionary_helper::AddWord(i, "foo"); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(1UL, dictionary_helper::GetDictionarySize(0)); + const std::string word = "foo"; + for (int i = 0; i < num_clients(); ++i) { + AddWord(i, word); + } + ASSERT_TRUE(DictionaryChecker(/*expected_words=*/{word}).Wait()); - for (int i = 0; i < num_clients(); ++i) - dictionary_helper::RemoveWord(i, "foo"); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(0UL, dictionary_helper::GetDictionarySize(0)); -} - -IN_PROC_BROWSER_TEST_F(TwoClientDictionarySyncTest, - E2E_ENABLED(AddDifferentToEach)) { - ResetSyncForPrimaryAccount(); - ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - - for (int i = 0; i < num_clients(); ++i) - dictionary_helper::AddWord(i, "foo" + base::NumberToString(i)); - - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(num_clients(), - static_cast<int>(dictionary_helper::GetDictionarySize(0))); + for (int i = 0; i < num_clients(); ++i) { + RemoveWord(i, word); + } + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); } IN_PROC_BROWSER_TEST_F(TwoClientDictionarySyncTest, E2E_ENABLED(RemoveOnAAddOnB)) { ResetSyncForPrimaryAccount(); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + LoadDictionaries(); + ASSERT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); - std::string word = "foo"; + const std::string word = "foo"; // Add on client A, check it appears on B. - ASSERT_TRUE(dictionary_helper::AddWord(0, word)); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + ASSERT_TRUE(AddWord(0, word)); + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{word}).Wait()); // Remove on client A, check it disappears on B. - ASSERT_TRUE(dictionary_helper::RemoveWord(0, word)); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + EXPECT_TRUE(RemoveWord(0, word)); + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); // Add on client B, check it appears on A. - ASSERT_TRUE(dictionary_helper::AddWord(1, word)); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); - ASSERT_EQ(1UL, dictionary_helper::GetDictionarySize(0)); + EXPECT_TRUE(AddWord(1, word)); + EXPECT_TRUE(DictionaryChecker(/*expected_words=*/{word}).Wait()); } // Tests the case where a client has more words added than the // kMaxSyncableDictionaryWords limit. IN_PROC_BROWSER_TEST_F(TwoClientDictionarySyncTest, Limit) { ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - dictionary_helper::LoadDictionaries(); - ASSERT_TRUE(DictionaryMatchChecker().Wait()); + LoadDictionaries(); + ASSERT_TRUE(DictionaryChecker(/*expected_words=*/{}).Wait()); // Disable client #1 before client #0 starts adding anything. GetClient(1)->DisableSyncForAllDatatypes(); @@ -142,8 +126,8 @@ // on the limit. size_t chunk_size = kMaxSyncableDictionaryWords * 2 / 5; - ASSERT_TRUE(dictionary_helper::AddWords(0, chunk_size, "foo-0-")); - ASSERT_EQ(chunk_size, dictionary_helper::GetDictionarySize(0)); + ASSERT_TRUE(AddWords(0, chunk_size, "foo-0-")); + ASSERT_EQ(chunk_size, GetDictionarySize(0)); // We must wait for the server here. This test was originally an n-client test // where n-1 clients waited to have the same state. We cannot do that on 2 @@ -157,8 +141,8 @@ ASSERT_TRUE( ServerCountMatchStatusChecker(syncer::DICTIONARY, chunk_size).Wait()); - ASSERT_TRUE(dictionary_helper::AddWords(1, 2 * chunk_size, "foo-1-")); - ASSERT_EQ(2 * chunk_size, dictionary_helper::GetDictionarySize(1)); + ASSERT_TRUE(AddWords(1, 2 * chunk_size, "foo-1-")); + ASSERT_EQ(2 * chunk_size, GetDictionarySize(1)); // Client #1 should first pull remote changes, apply them, without capping at // any sort of limit. This will cause client #1 to have 3 * chunk_size. When
diff --git a/chrome/browser/sync/test/integration/wallet_helper.cc b/chrome/browser/sync/test/integration/wallet_helper.cc index 612c917..7e9cb9e 100644 --- a/chrome/browser/sync/test/integration/wallet_helper.cc +++ b/chrome/browser/sync/test/integration/wallet_helper.cc
@@ -213,13 +213,13 @@ ->GetServerAddressesMetadata(addresses_metadata); } -void GetWalletDataModelTypeStateOnDBSequence( - AutofillWebDataService* wds, - sync_pb::ModelTypeState* model_type_state) { +void GetModelTypeStateOnDBSequence(syncer::ModelType model_type, + AutofillWebDataService* wds, + sync_pb::ModelTypeState* model_type_state) { DCHECK(wds->GetDBTaskRunner()->RunsTasksInCurrentSequence()); syncer::MetadataBatch metadata_batch; AutofillTable::FromWebDatabase(wds->GetDatabase()) - ->GetAllSyncMetadata(syncer::AUTOFILL_WALLET_DATA, &metadata_batch); + ->GetAllSyncMetadata(model_type, &metadata_batch); *model_type_state = metadata_batch.GetModelTypeState(); } @@ -321,11 +321,14 @@ return addresses_metadata; } -sync_pb::ModelTypeState GetWalletDataModelTypeState(int profile) { +sync_pb::ModelTypeState GetWalletModelTypeState(syncer::ModelType model_type, + int profile) { + DCHECK(model_type == syncer::AUTOFILL_WALLET_DATA || + model_type == syncer::AUTOFILL_WALLET_OFFER); sync_pb::ModelTypeState result; scoped_refptr<AutofillWebDataService> wds = GetProfileWebDataService(profile); wds->GetDBTaskRunner()->PostTask( - FROM_HERE, base::BindOnce(&GetWalletDataModelTypeStateOnDBSequence, + FROM_HERE, base::BindOnce(&GetModelTypeStateOnDBSequence, model_type, base::Unretained(wds.get()), &result)); WaitForCurrentTasksToComplete(wds->GetDBTaskRunner()); return result; @@ -669,3 +672,53 @@ } return true; } + +FullUpdateTypeProgressMarkerChecker::FullUpdateTypeProgressMarkerChecker( + base::Time min_required_progress_marker_timestamp, + syncer::SyncService* service, + syncer::ModelType model_type) + : min_required_progress_marker_timestamp_( + min_required_progress_marker_timestamp), + service_(service), + model_type_(model_type) { + scoped_observer_.Add(service); +} + +FullUpdateTypeProgressMarkerChecker::~FullUpdateTypeProgressMarkerChecker() = + default; + +bool FullUpdateTypeProgressMarkerChecker::IsExitConditionSatisfied( + std::ostream* os) { + // GetLastCycleSnapshot() returns by value, so make sure to capture it for + // iterator use. + const syncer::SyncCycleSnapshot snap = + service_->GetLastCycleSnapshotForDebugging(); + const syncer::ProgressMarkerMap& progress_markers = + snap.download_progress_markers(); + auto marker_it = progress_markers.find(model_type_); + if (marker_it == progress_markers.end()) { + *os << "Waiting for an updated progress marker timestamp " + << min_required_progress_marker_timestamp_ + << "; actual: no progress marker in last sync cycle"; + return false; + } + + sync_pb::DataTypeProgressMarker progress_marker; + bool success = progress_marker.ParseFromString(marker_it->second); + DCHECK(success); + + const base::Time actual_timestamp = + fake_server::FakeServer::GetProgressMarkerTimestamp(progress_marker); + + *os << "Waiting for an updated progress marker timestamp " + << min_required_progress_marker_timestamp_ << "; actual " + << actual_timestamp; + + return actual_timestamp >= min_required_progress_marker_timestamp_; +} + +// syncer::SyncServiceObserver implementation. +void FullUpdateTypeProgressMarkerChecker::OnSyncCycleCompleted( + syncer::SyncService* sync) { + CheckExitCondition(); +}
diff --git a/chrome/browser/sync/test/integration/wallet_helper.h b/chrome/browser/sync/test/integration/wallet_helper.h index 039a48a..1f6b88b 100644 --- a/chrome/browser/sync/test/integration/wallet_helper.h +++ b/chrome/browser/sync/test/integration/wallet_helper.h
@@ -27,6 +27,7 @@ namespace sync_pb { class SyncEntity; +class ModelType; class ModelTypeState; } @@ -79,7 +80,9 @@ std::map<std::string, autofill::AutofillMetadata> GetServerAddressesMetadata( int profile); -sync_pb::ModelTypeState GetWalletDataModelTypeState(int profile); +// Function supports AUTOFILL_WALLET_DATA and AUTOFILL_WALLET_OFFER. +sync_pb::ModelTypeState GetWalletModelTypeState(syncer::ModelType type, + int profile); void UnmaskServerCard(int profile, const autofill::CreditCard& credit_card, @@ -189,4 +192,35 @@ bool checking_exit_condition_in_flight_ = false; }; +// Checker to block until a new progress marker with correct timestamp is +// received. +class FullUpdateTypeProgressMarkerChecker : public StatusChangeChecker, + public syncer::SyncServiceObserver { + public: + FullUpdateTypeProgressMarkerChecker( + base::Time min_required_progress_marker_timestamp, + syncer::SyncService* service, + syncer::ModelType model_type); + ~FullUpdateTypeProgressMarkerChecker() override; + + FullUpdateTypeProgressMarkerChecker( + const FullUpdateTypeProgressMarkerChecker&) = delete; + FullUpdateTypeProgressMarkerChecker& operator=( + const FullUpdateTypeProgressMarkerChecker&) = delete; + + // StatusChangeChecker: + bool IsExitConditionSatisfied(std::ostream* os) override; + + // syncer::SyncServiceObserver: + void OnSyncCycleCompleted(syncer::SyncService* sync) override; + + private: + const base::Time min_required_progress_marker_timestamp_; + const syncer::SyncService* const service_; + const syncer::ModelType model_type_; + + ScopedObserver<syncer::SyncService, syncer::SyncServiceObserver> + scoped_observer_{this}; +}; + #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_WALLET_HELPER_H_
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn index bded4fd..ff1ceba 100644 --- a/chrome/browser/tab/BUILD.gn +++ b/chrome/browser/tab/BUILD.gn
@@ -33,6 +33,7 @@ "java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration.java", "java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataFactory.java", "java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataStorage.java", + "java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java", ] # TabSelectionType, TabLaunchType @@ -46,6 +47,7 @@ "//base:jni_java", "//chrome/browser/android/crypto:java", "//chrome/browser/contextmenu:java", + "//chrome/browser/endpoint_fetcher:java", "//chrome/browser/profiles/android:java", "//chrome/browser/ui/android/native_page:java", "//components/browser_ui/util/android:java", @@ -75,5 +77,8 @@ proto_java_library("critical_persisted_tab_data_proto_java") { proto_path = "java/src/org/chromium/chrome/browser/tab/state/proto" - sources = [ "$proto_path/critical_persisted_tab_data.proto" ] + sources = [ + "$proto_path/critical_persisted_tab_data.proto", + "$proto_path/shopping_persisted_tab_data.proto", + ] }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS index ed381b4..753a71e 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -5,6 +5,7 @@ "+base/android/java/src/org/chromium/base", "+chrome/browser/android/crypto/java", "+chrome/browser/contextmenu/java", + "+chrome/browser/endpoint_fetcher", "+chrome/browser/tab/java", "+chrome/browser/profiles/android/java", "+chrome/browser/ui/android/native_page",
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java index c18fc63d..f99e0fe 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
@@ -16,6 +16,7 @@ import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.TraceEvent; +import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tab.WebContentsState; @@ -138,12 +139,12 @@ PersistedTabData.from(tab, (data, storage, id) -> { return new CriticalPersistedTabData(tab, data, storage, id); }, - () - -> { - if (tab.isInitialized()) { - return CriticalPersistedTabData.build(tab); + new OneshotSupplierImpl<CriticalPersistedTabData>() { + @Override + public void onAvailable(Callback<CriticalPersistedTabData> supplierCallback) { + supplierCallback.onResult( + tab.isInitialized() ? CriticalPersistedTabData.build(tab) : null); } - return null; }, CriticalPersistedTabData.class, callback); }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java index 142b5e0..c22e5b9 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/MockPersistedTabData.java
@@ -39,14 +39,9 @@ * @param callback callback {@link MockPersistedTabData} will be passed back in */ public static void from(Tab tab, Callback<MockPersistedTabData> callback) { - PersistedTabData.from(tab, - (data, storage, id) - -> { return new MockPersistedTabData(tab, data, storage, id); }, - () - -> { - return null; /** Currently unused */ - }, - MockPersistedTabData.class, callback); + PersistedTabData.from(tab, (data, storage, id) -> { + return new MockPersistedTabData(tab, data, storage, id); + }, null, MockPersistedTabData.class, callback); } /**
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java index e7b3a9b7..94e3f2f 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java
@@ -13,6 +13,7 @@ import org.chromium.base.UserData; import org.chromium.base.UserDataHost; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.Supplier; import org.chromium.base.task.PostTask; import org.chromium.chrome.browser.tab.Tab; @@ -95,7 +96,7 @@ * @return {@link PersistedTabData} from storage */ protected static <T extends PersistedTabData> void from(Tab tab, - PersistedTabDataFactory<T> factory, Supplier<T> supplier, Class<T> clazz, + PersistedTabDataFactory<T> factory, OneshotSupplier<T> supplier, Class<T> clazz, Callback<T> callback) { ThreadUtils.assertOnUiThread(); // TODO(crbug.com/1059602) cache callbacks @@ -114,20 +115,25 @@ config.storage.restore(tab.getId(), config.id, (data) -> { T persistedTabData; if (data == null) { - persistedTabData = supplier.get(); + supplier.onAvailable((ptd) -> { onPersistedTabDataResult(ptd, tab, clazz, key); }); } else { persistedTabData = factory.create(data, config.storage, config.id); + onPersistedTabDataResult(persistedTabData, tab, clazz, key); } - if (persistedTabData != null) { - setUserData(tab, clazz, persistedTabData); - } - for (Callback cachedCallback : sCachedCallbacks.get(key)) { - cachedCallback.onResult(persistedTabData); - } - sCachedCallbacks.remove(key); }); } + private static <T extends PersistedTabData> void onPersistedTabDataResult( + T persistedTabData, Tab tab, Class<T> clazz, String key) { + if (persistedTabData != null) { + setUserData(tab, clazz, persistedTabData); + } + for (Callback cachedCallback : sCachedCallbacks.get(key)) { + cachedCallback.onResult(persistedTabData); + } + sCachedCallbacks.remove(key); + } + /** * Acquire {@link PersistedTabData} from a {@link Tab} or create and * associate using provided {@link Supplier}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration.java index 6610caa7..1fa03555 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabDataConfiguration.java
@@ -20,6 +20,8 @@ ENCRYPTED_CRITICAL_PERSISTED_TAB_DATA("ECPTD", new EncryptedFilePersistedTabDataStorage()), MOCK_PERSISTED_TAB_DATA("MPTD", new FilePersistedTabDataStorage()), ENCRYPTED_MOCK_PERSISTED_TAB_DATA("EMPTD", new EncryptedFilePersistedTabDataStorage()), + // TODO(crbug.com/1129626) Move Shopping to Level DB based storage + SHOPPING_PERSISTED_TAB_DATA("SPTD", new FilePersistedTabDataStorage()), // TODO(crbug.com/1113828) investigate separating test from prod test implementations TEST_CONFIG("TC", new MockPersistedTabDataStorage()); @@ -36,6 +38,8 @@ sEncryptedLookup.put(CriticalPersistedTabData.class, ENCRYPTED_CRITICAL_PERSISTED_TAB_DATA); sLookup.put(MockPersistedTabData.class, MOCK_PERSISTED_TAB_DATA); sEncryptedLookup.put(MockPersistedTabData.class, ENCRYPTED_MOCK_PERSISTED_TAB_DATA); + sLookup.put(ShoppingPersistedTabData.class, SHOPPING_PERSISTED_TAB_DATA); + sEncryptedLookup.put(ShoppingPersistedTabData.class, SHOPPING_PERSISTED_TAB_DATA); } public final String id; @@ -65,7 +69,7 @@ } @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - protected static void setUseTestConfig(boolean useTestConfig) { + public static void setUseTestConfig(boolean useTestConfig) { sUseTestConfig = useTestConfig; }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java new file mode 100644 index 0000000..7155205 --- /dev/null +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java
@@ -0,0 +1,164 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tab.state; + +import androidx.annotation.Nullable; + +import com.google.protobuf.InvalidProtocolBufferException; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import org.chromium.base.Callback; +import org.chromium.base.Log; +import org.chromium.base.supplier.OneshotSupplierImpl; +import org.chromium.chrome.browser.endpoint_fetcher.EndpointFetcher; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.proto.ShoppingPersistedTabData.ShoppingPersistedTabDataProto; + +import java.util.Locale; + +/** + * {@link PersistedTabData} for Shopping related websites + */ +public class ShoppingPersistedTabData extends PersistedTabData { + private static final String TAG = "SPTD"; + private static final String ENDPOINT = + "https://task-management-chrome.sandbox.google.com/tabs/representations?url=%s&locale=en:US"; + private static final String[] SCOPES = + new String[] {"https://www.googleapis.com/auth/userinfo.email", + "https://www.googleapis.com/auth/userinfo.profile"}; + private static final long TIMEOUT_MS = 1000L; + private static final String HTTPS_METHOD = "GET"; + private static final String CONTENT_TYPE = "application/json; charset=UTF-8"; + private static final String OAUTH_NAME = "SPTD"; + private static final String EMPTY_POST_DATA = ""; + + private static final String REPRESENTATIONS_KEY = "representations"; + private static final String PRICE_KEY = "price"; + private static final String TYPE_KEY = "type"; + private static final String SHOPPING_ID = "SHOPPING"; + + private String mPriceString; + + protected ShoppingPersistedTabData(Tab tab) { + super(tab, + PersistedTabDataConfiguration.get(ShoppingPersistedTabData.class, tab.isIncognito()) + .storage, + PersistedTabDataConfiguration.get(ShoppingPersistedTabData.class, tab.isIncognito()) + .id); + } + + private ShoppingPersistedTabData( + Tab tab, byte[] data, PersistedTabDataStorage storage, String persistedTabDataId) { + super(tab, data, storage, persistedTabDataId); + } + + /** + * Acquire {@link ShoppingPersistedTabData} for a {@link Tab} + * @param tab {@link Tab} ShoppingPersistedTabData is acquired for + * @param callback {@link Callback} {@link ShoppingPersistedTabData is passed back in} + */ + public static void from(Tab tab, Callback<ShoppingPersistedTabData> callback) { + PersistedTabData.from(tab, + (data, storage, id) + -> { return new ShoppingPersistedTabData(tab, data, storage, id); }, + new OneshotSupplierImpl<ShoppingPersistedTabData>() { + @Override + public void onAvailable(Callback<ShoppingPersistedTabData> supplierCallback) { + EndpointFetcher.fetchUsingOAuth( + (endpointResponse) + -> { + supplierCallback.onResult( + build(tab, endpointResponse.getResponseString())); + }, + Profile.getLastUsedRegularProfile(), OAUTH_NAME, + String.format(Locale.US, ENDPOINT, tab.getUrlString()), + HTTPS_METHOD, CONTENT_TYPE, SCOPES, EMPTY_POST_DATA, TIMEOUT_MS); + } + }, + ShoppingPersistedTabData.class, callback); + } + + private static ShoppingPersistedTabData build(Tab tab, String responseString) { + ShoppingPersistedTabData res = new ShoppingPersistedTabData(tab); + try { + JSONObject jsonObject = new JSONObject(responseString); + JSONArray representations = jsonObject.getJSONArray(REPRESENTATIONS_KEY); + for (int i = 0; i < representations.length(); i++) { + JSONObject representation = representations.getJSONObject(i); + // TODO(crbug.com/1130068) support all currencies + if (SHOPPING_ID.equals(representation.getString(TYPE_KEY))) { + res.setPriceString( + String.format(Locale.US, "$%.2f", representation.getDouble(PRICE_KEY))); + break; + } + } + } catch (JSONException e) { + Log.i(TAG, + String.format(Locale.US, + "There was a problem acquiring " + + "ShoppingPersistedTabData " + + "Details: %s", + e.toString())); + } + return res; + } + + /** + * Set the price string + * @param priceString a string representing the price of the shopping offer + */ + protected void setPriceString(String priceString) { + mPriceString = priceString; + save(); + } + + /** + * @return a price representing the price of the shopping offer + * TODO(crbug.com/1130067) add timeouts to {@link ShoppingPersistedTabData} + * properties so they stay in sync with the actual price. + * Or should we have a push model? + */ + public String getPriceString() { + return mPriceString; + } + + @Override + public byte[] serialize() { + return ShoppingPersistedTabDataProto.newBuilder() + .setPriceString(mPriceString) + .build() + .toByteArray(); + } + + @Override + public boolean deserialize(@Nullable byte[] bytes) { + // TODO(crbug.com/1135573) add in metrics for serialize and deserialize + try { + ShoppingPersistedTabDataProto shoppingPersistedTabDataProto = + ShoppingPersistedTabDataProto.parseFrom(bytes); + mPriceString = shoppingPersistedTabDataProto.getPriceString(); + return true; + } catch (InvalidProtocolBufferException e) { + Log.e(TAG, + String.format(Locale.US, + "There was a problem deserializing " + + "ShoppingPersistedTabData. Details: %s", + e.getMessage())); + } + return false; + } + + @Override + public void destroy() {} + + @Override + public String getUmaTag() { + return "SPTD"; + } +} \ No newline at end of file
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/proto/shopping_persisted_tab_data.proto b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/proto/shopping_persisted_tab_data.proto new file mode 100644 index 0000000..dac3d030 --- /dev/null +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/proto/shopping_persisted_tab_data.proto
@@ -0,0 +1,14 @@ +// Copyright 2020 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. + +syntax = "proto2"; + +package org.chromium.chrome.browser.tab.proto; + +option java_package = "org.chromium.chrome.browser.tab.proto"; + +message ShoppingPersistedTabDataProto { + // String representing the price of the offer + optional string price_string = 1; +}
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 7fe3b00..16ad388 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2545,6 +2545,8 @@ "webui/settings/tts_handler.h", "webui/signin/inline_login_dialog_chromeos.cc", "webui/signin/inline_login_dialog_chromeos.h", + "webui/signin/inline_login_dialog_chromeos_onboarding.cc", + "webui/signin/inline_login_dialog_chromeos_onboarding.h", "webui/signin/inline_login_handler_chromeos.cc", "webui/signin/inline_login_handler_chromeos.h", "webui/signin/inline_login_handler_modal_delegate.cc", @@ -2656,6 +2658,7 @@ "//chromeos/strings", "//chromeos/system", "//chromeos/ui/base", + "//chromeos/ui/frame", "//chromeos/ui/vector_icons", "//components/arc", "//components/assist_ranker",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 0d33e3df..c328c1d 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2165,6 +2165,9 @@ <message name="IDS_NOTIFICATION_WEBAPK_INSTALLED" desc="Indicates that a WebAPK has been successfully added to Home screen."> Added to Home screen </message> + <message name="IDS_IPH_PWA_INSTALL_AVAILABLE_TEXT" desc="The in-product-help message for PWAs that can be installed to the device."> + Install this app + </message> <!-- Page info popup --> <message name="IDS_PAGE_INFO_CONNECTION_OFFLINE" desc="Message to display in the page info bubble when viewing and offline page."> @@ -2896,6 +2899,18 @@ <message name="IDS_MENU_STOP_IMAGE_DESCRIPTIONS" desc="Menu item to stop getting alt text accessibility image labels/descriptions [CHAR-LIMIT=27]"> Stop image descriptions </message> + <message name="IDS_MENU_ADD_TO" desc="Menu item for opening the 'Add to' dialog which can add the page to bookmarks, downloads, home screen, etc. [CHAR-LIMIT=27]"> + Add to… + </message> + <message name="IDS_MENU_ADD_TO_DIALOG_TITLE" desc="Menu item for opening the 'Add to' dialog which can add the page to bookmarks, downloads, home screen, etc."> + Add to: + </message> + <message name="IDS_MENU_ADD_TO_BOOKMARKS" desc="Menu item to save the web page to 'Bookmarks' section. The word 'Bookmarks' should match the translation in TC ID 1792806198663410166."> + Add to Bookmarks + </message> + <message name="IDS_MENU_ADD_TO_DOWNLOADS" desc="Menu item to download the current web page. The word 'Downloads' should match the translation in TC ID 9040361513231775562."> + Add to Downloads + </message> <!-- Bookmarks strings --> <message name="IDS_BOOKMARKS" desc="Title of the bookmarks page, which shows a list of the user's bookmarks. [CHAR-LIMIT=18]"> @@ -3950,6 +3965,11 @@ Phone as a Security Key Support </message> + <message name="IDS_CABLEV2_ACTIVITY_TITLE" + desc="The label of the Activity for using your phone as a security key. A 'security key' in this context is generally a small USB device that is used for logging into websites. This feature allows Chrome on an Android phone to act as a security key. A user may see it in Android permissions prompts (see screenshot)."> + Google <ph name="APP_NAME">%1$s<ex>Chrome</ex></ph> as a Security Key + </message> + <!-- QR Code --> <message name="IDS_QR_CODE_SHARE_ICON_LABEL" desc="Icon label for sharing with QR Code activity."> QR Code
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CABLEV2_ACTIVITY_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CABLEV2_ACTIVITY_TITLE.png.sha1 new file mode 100644 index 0000000..45ed58e --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CABLEV2_ACTIVITY_TITLE.png.sha1
@@ -0,0 +1 @@ +6f795c79ba8bf3030f3f83db163fb08ca8477b47 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PWA_INSTALL_AVAILABLE_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PWA_INSTALL_AVAILABLE_TEXT.png.sha1 new file mode 100644 index 0000000..76a88a6 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_IPH_PWA_INSTALL_AVAILABLE_TEXT.png.sha1
@@ -0,0 +1 @@ +3d9d82db5402d55d2766f542b7f321bfef1cfa60 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO.png.sha1 new file mode 100644 index 0000000..2d2e5221 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO.png.sha1
@@ -0,0 +1 @@ +6407c5452e318470f73e3f9f083a56591dbbf946 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_BOOKMARKS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_BOOKMARKS.png.sha1 new file mode 100644 index 0000000..bc684c3 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_BOOKMARKS.png.sha1
@@ -0,0 +1 @@ +34dfdcb5f9bc4418c211b5ed2764752f4fee129a \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_DIALOG_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_DIALOG_TITLE.png.sha1 new file mode 100644 index 0000000..bc684c3 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@ +34dfdcb5f9bc4418c211b5ed2764752f4fee129a \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_DOWNLOADS.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_DOWNLOADS.png.sha1 new file mode 100644 index 0000000..bc684c3 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_DOWNLOADS.png.sha1
@@ -0,0 +1 @@ +34dfdcb5f9bc4418c211b5ed2764752f4fee129a \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 11396e53..c7bc3b8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -755,7 +755,7 @@ <translation id="6527303717912515753">Del</translation> <translation id="6532866250404780454">Websites, du besøger i Chrome, vises ikke. Alle timere for websites slettes.</translation> <translation id="6534565668554028783">Google var for lang tid om at svare</translation> -<translation id="6539092367496845964">Der opstod en fejl. Prøv igen senere.</translation> +<translation id="6539092367496845964">Noget gik galt. Prøv igen senere.</translation> <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Tjekket for 1 time siden}one{Tjekket for # time siden}other{Tjekket for # timer siden}}</translation> <translation id="6545017243486555795">Ryd alle data</translation> <translation id="6560414384669816528">Søg via Sogou</translation> @@ -866,7 +866,7 @@ <translation id="7328017930301109123">Chrome indlæser sider hurtigere og bruger op til 60 procent mindre data i Lite-tilstand.</translation> <translation id="7333031090786104871">Det forrige website er stadig ved at blive tilføjet</translation> <translation id="7340958967809483333">Indstillinger for Discover</translation> -<translation id="7352651011704765696">Der opstod en fejl</translation> +<translation id="7352651011704765696">Noget gik galt</translation> <translation id="7352939065658542140">VIDEO</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Del 1 valgt element}one{Del # valgt element}other{Del # valgte elementer}}</translation> <translation id="7359002509206457351">Adgang til betalingsmetoder</translation> @@ -1084,7 +1084,7 @@ <translation id="8942627711005830162">Åbn i et andet vindue</translation> <translation id="8951232171465285730">Chrome har sparet dig <ph name="MEGABYTES" /> MB</translation> <translation id="8965591936373831584">afventer</translation> -<translation id="8970887620466824814">Der opstod en fejl.</translation> +<translation id="8970887620466824814">Noget gik galt.</translation> <translation id="8972098258593396643">Vil du downloade til standardmappen?</translation> <translation id="8988028529677883095">Brug telefonen som en sikkerhedsnøgle</translation> <translation id="8990209962746788689">QR-koden kan ikke oprettes</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index db6d08e..93412ef 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -165,6 +165,7 @@ <translation id="2169830938017475061">ഇപ്പോൾ</translation> <translation id="2175927920773552910">QR കോഡ്</translation> <translation id="218608176142494674">പങ്കിടൽ</translation> +<translation id="2195339740518523951">Chrome-ന്റെ ഏറ്റവും ശക്തമായ സുരക്ഷ നേടുക</translation> <translation id="2227444325776770048"><ph name="USER_FULL_NAME" /> എന്ന പേരിൽ തുടരുക</translation> <translation id="2234876718134438132">സമന്വയവും Google സേവനങ്ങളും</translation> <translation id="2239812875700136898">'Discover-നുള്ള ഓപ്ഷനുകൾ' ബട്ടൺ അമർത്തി നിങ്ങളുടെ സ്റ്റോറികൾ നിയന്ത്രിക്കുക</translation> @@ -256,6 +257,7 @@ <translation id="2893180576842394309">തിരയലും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation> <translation id="2898264748040935573">സംഭരിച്ചിരിക്കുന്ന പാസ്വേഡ് എഡിറ്റ് ചെയ്യുക</translation> <translation id="2900528713135656174">ഇവന്റ് സൃഷ്ടിക്കുക</translation> +<translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> എന്നതിനുള്ള നിർദ്ദേശങ്ങൾ കാണിക്കുന്നു</translation> <translation id="2904414404539560095">പൂർണ്ണ ഉയരത്തിൽ ടാബ് പങ്കിടാനാകുന്ന ഉപകരണങ്ങളുടെ ലിസ്റ്റ്.</translation> <translation id="2905036901251765993">സമീപമുള്ള ആളുകളുമായി പങ്കിടുന്നതിനായി, അവരെ ഈ QR കോഡ് സ്കാൻ ചെയ്യാൻ അനുവദിക്കുക</translation> <translation id="2909615210195135082">Google അറിയിപ്പുകൾ പ്ലാറ്റ്ഫോം</translation> @@ -441,6 +443,7 @@ <translation id="4405224443901389797">ഇതിലേക്ക് നീക്കുക…</translation> <translation id="4411535500181276704">ലൈറ്റ് മോഡ്</translation> <translation id="4415276339145661267">നിങ്ങളുടെ Google അക്കൗണ്ട് മാനേജ് ചെയ്യുക</translation> +<translation id="4427306783828095590">ഫിഷിംഗും മാല്വെയറും ബ്ലോക്ക് ചെയ്യുന്നതിന് മെച്ചപ്പെടുത്തിയ പരിരക്ഷ കൂടുതൽ കാര്യങ്ങൾ ചെയ്യുന്നു</translation> <translation id="4440958355523780886">Google നൽകുന്ന ലൈറ്റ് പേജ്. യഥാർത്ഥ പേജ് ലോഡ് ചെയ്യാൻ ടാപ്പ് ചെയ്യുക.</translation> <translation id="4452411734226507615"><ph name="TAB_TITLE" /> ടാബ് അടയ്ക്കുക</translation> <translation id="4452548195519783679"><ph name="FOLDER_NAME" /> ഫോൾഡറിലേക്ക് ബുക്ക്മാർക്ക് ചെയ്തു</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 1e9a33ee..838dce9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -165,6 +165,7 @@ <translation id="2169830938017475061">Teraz</translation> <translation id="2175927920773552910">QR kód</translation> <translation id="218608176142494674">Zdieľanie</translation> +<translation id="2195339740518523951">Získajte najsilnejšie zabezpečenie Chromu</translation> <translation id="2227444325776770048">Pokračovať ako <ph name="USER_FULL_NAME" /></translation> <translation id="2234876718134438132">Synchronizácia a služby Googlu</translation> <translation id="2239812875700136898">Ovládajte svoje príbehy po stlačení tlačidla Možnosti kanála Objaviť</translation> @@ -256,6 +257,7 @@ <translation id="2893180576842394309">Google môže pomocou vašej histórie prispôsobiť Vyhľadávanie a ďalšie služby Googlu</translation> <translation id="2898264748040935573">Úprava uloženého hesla</translation> <translation id="2900528713135656174">Vytvorte udalosť</translation> +<translation id="2901411048554510387">Zobrazujú sa návrhy pre web <ph name="WEBSITE_TITLE" /></translation> <translation id="2904414404539560095">Zoznam zariadení, s ktorými sa má zdieľať karta, je otvorený na plnú výšku.</translation> <translation id="2905036901251765993">Ak chcete zdieľať s ľuďmi nablízku, umožnite im naskenovať tento QR kód</translation> <translation id="2909615210195135082">Google Notifications Platform</translation> @@ -441,6 +443,7 @@ <translation id="4405224443901389797">Presunúť do…</translation> <translation id="4411535500181276704">Zjednodušený režim</translation> <translation id="4415276339145661267">Spravovať účet Google</translation> +<translation id="4427306783828095590">Rozšírená ochrana efektívnejšie blokuje phishing aj malvér</translation> <translation id="4440958355523780886">Zjednodušenú verziu stránky poskytol Google. Klepnutím načítate pôvodnú verziu.</translation> <translation id="4452411734226507615">Zavrieť kartu <ph name="TAB_TITLE" /></translation> <translation id="4452548195519783679">Uložené ako záložka v priečinku <ph name="FOLDER_NAME" /></translation>
diff --git a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc index d5905c2d..7f66935 100644 --- a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc +++ b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
@@ -371,26 +371,11 @@ } // Browser Test for AppListClient that observes search result changes. -class AppListClientSearchResultsBrowserTest - : public extensions::ExtensionBrowserTest { - public: - AppListClientSearchResultsBrowserTest() { - // Zero state changes UI behavior. This test case tests the expected UI - // behavior with zero state being disabled. - // TODO(jennyz): write new test case for zero state, crbug.com/925195. - feature_list_.InitAndDisableFeature( - app_list_features::kEnableZeroStateSuggestions); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; +using AppListClientSearchResultsBrowserTest = extensions::ExtensionBrowserTest; // Test showing search results, and uninstalling one of them while displayed. IN_PROC_BROWSER_TEST_F(AppListClientSearchResultsBrowserTest, UninstallSearchResult) { - ASSERT_FALSE(app_list_features::IsZeroStateSuggestionsEnabled()); - base::FilePath test_extension_path; ASSERT_TRUE( base::PathService::Get(chrome::DIR_TEST_DATA, &test_extension_path));
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc index c44c9b6..b19857e 100644 --- a/chrome/browser/ui/app_list/search/omnibox_provider.cc +++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/app_list/search/omnibox_provider.h" -#include "ash/public/cpp/app_list/app_list_features.h" #include "base/memory/ptr_util.h" #include "base/metrics/histogram_macros.h" #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h" @@ -33,15 +32,10 @@ OmniboxProvider::OmniboxProvider(Profile* profile, AppListControllerDelegate* list_controller) : profile_(profile), - is_zero_state_enabled_( - app_list_features::IsZeroStateSuggestionsEnabled()), list_controller_(list_controller), controller_(std::make_unique<AutocompleteController>( std::make_unique<ChromeAutocompleteProviderClient>(profile), - is_zero_state_enabled_ - ? AutocompleteClassifier::DefaultOmniboxProviders() - : AutocompleteClassifier::DefaultOmniboxProviders() & - ~AutocompleteProvider::TYPE_ZERO_SUGGEST)) { + AutocompleteClassifier::DefaultOmniboxProviders())) { controller_->AddObserver(this); } @@ -51,18 +45,14 @@ controller_->Stop(false); // The new page classification value(CHROMEOS_APP_LIST) is introduced // to differentiate the suggest requests initiated by ChromeOS app_list from - // the ones by Chrome omnibox. Until we fully test the integration with - // suggest server with Zero State feature, we will keep the related change - // out of picture if zero state feature is not enabled. - AutocompleteInput input = AutocompleteInput( - query, - is_zero_state_enabled_ ? metrics::OmniboxEventProto::CHROMEOS_APP_LIST - : metrics::OmniboxEventProto::INVALID_SPEC, - ChromeAutocompleteSchemeClassifier(profile_)); + // the ones by Chrome omnibox. + AutocompleteInput input = + AutocompleteInput(query, metrics::OmniboxEventProto::CHROMEOS_APP_LIST, + ChromeAutocompleteSchemeClassifier(profile_)); // Sets the |from_omnibox_focus| flag to enable ZeroSuggestProvider to process // the requests from app_list. - if (is_zero_state_enabled_ && input.text().empty()) { + if (input.text().empty()) { input.set_focus_type(OmniboxFocusType::ON_FOCUS); is_zero_state_input_ = true; } else {
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.h b/chrome/browser/ui/app_list/search/omnibox_provider.h index 73d9e619..c431e99 100644 --- a/chrome/browser/ui/app_list/search/omnibox_provider.h +++ b/chrome/browser/ui/app_list/search/omnibox_provider.h
@@ -41,7 +41,6 @@ void RecordQueryLatencyHistogram(); Profile* profile_; - bool is_zero_state_enabled_ = false; // True if the input is empty for zero state suggestion. bool is_zero_state_input_ = false; AppListControllerDelegate* list_controller_;
diff --git a/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc b/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc index ed69316..b969f4d 100644 --- a/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc +++ b/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/ash/chrome_new_window_client.h" -#include "base/test/scoped_feature_list.h" #include "chrome/browser/chromeos/arc/arc_web_contents_data.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" @@ -19,7 +18,6 @@ #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" #include "chrome/browser/web_applications/system_web_app_manager.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "chromeos/constants/chromeos_features.h"
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc index dd6f6a3..c2864c0 100644 --- a/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc +++ b/chrome/browser/ui/ash/holding_space/holding_space_client_impl_browsertest.cc
@@ -16,7 +16,6 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/test/bind_test_util.h" -#include "base/test/scoped_feature_list.h" #include "base/unguessable_token.h" #include "chrome/browser/extensions/component_loader.h" #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc index 160b7186..f8b9406 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
@@ -22,7 +22,6 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/web_applications/components/web_app_id.h" -#include "chrome/common/chrome_features.h" #include "components/services/app_service/public/cpp/instance_update.h" #include "components/services/app_service/public/mojom/types.mojom.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc index d9389d11..d787524 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc
@@ -43,7 +43,6 @@ #include "chrome/browser/web_applications/components/app_registrar.h" #include "chrome/browser/web_applications/components/app_registry_controller.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" #include "content/public/browser/context_menu_params.h" #include "ui/display/scoped_display_for_new_windows.h"
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window.cc b/chrome/browser/ui/ash/launcher/arc_app_window.cc index 0a1d661..0213f9d 100644 --- a/chrome/browser/ui/ash/launcher/arc_app_window.cc +++ b/chrome/browser/ui/ash/launcher/arc_app_window.cc
@@ -12,7 +12,6 @@ #include "chrome/browser/ui/app_list/arc/arc_app_icon.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h" #include "chrome/browser/ui/ash/launcher/arc_app_window_delegate.h" -#include "chrome/common/chrome_features.h" #include "components/arc/arc_util.h" #include "components/exo/shell_surface_base.h" #include "components/exo/shell_surface_util.h"
diff --git a/chrome/browser/ui/ash/launcher/browser_status_monitor.cc b/chrome/browser/ui/ash/launcher/browser_status_monitor.cc index 47976ef..a54a4d78 100644 --- a/chrome/browser/ui/ash/launcher/browser_status_monitor.cc +++ b/chrome/browser/ui/ash/launcher/browser_status_monitor.cc
@@ -20,7 +20,6 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/web_applications/components/web_app_helpers.h" -#include "chrome/common/chrome_features.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_handle.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/ash/launcher/shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/shelf_context_menu.cc index 430a4f7..b1438835 100644 --- a/chrome/browser/ui/ash/launcher/shelf_context_menu.cc +++ b/chrome/browser/ui/ash/launcher/shelf_context_menu.cc
@@ -25,7 +25,6 @@ #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h" #include "chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h" #include "chrome/browser/ui/ash/launcher/extension_uninstaller.h" -#include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" #include "components/vector_icons/vector_icons.h" #include "ui/base/models/image_model.h"
diff --git a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc index 68c5b98..2b4e529 100644 --- a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc +++ b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
@@ -32,7 +32,6 @@ #include "base/run_loop.h" #include "base/strings/string_piece.h" #include "base/strings/string_util.h" -#include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/ui/ash/network/network_portal_notification_controller.cc b/chrome/browser/ui/ash/network/network_portal_notification_controller.cc index 2f703d1..e28806d5 100644 --- a/chrome/browser/ui/ash/network/network_portal_notification_controller.cc +++ b/chrome/browser/ui/ash/network/network_portal_notification_controller.cc
@@ -15,10 +15,7 @@ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/metrics/histogram_macros.h" #include "base/strings/string16.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/chromeos/mobile/mobile_activator.h" #include "chrome/browser/chromeos/net/network_portal_web_dialog.h" @@ -33,14 +30,11 @@ #include "chrome/grit/generated_resources.h" #include "chromeos/constants/chromeos_switches.h" #include "chromeos/network/network_state.h" -#include "chromeos/network/network_state_handler.h" #include "chromeos/network/network_type_pattern.h" #include "components/captive_portal/core/captive_portal_detector.h" #include "components/prefs/pref_service.h" #include "components/session_manager/core/session_manager.h" #include "components/user_manager/user_manager.h" -#include "extensions/browser/api/networking_config/networking_config_service.h" -#include "extensions/browser/api/networking_config/networking_config_service_factory.h" #include "third_party/cros_system_api/dbus/service_constants.h" #include "ui/base/l10n/l10n_util.h" #include "ui/message_center/public/cpp/notification.h" @@ -54,57 +48,18 @@ const char kNotifierNetworkPortalDetector[] = "ash.network.portal-detector"; -Profile* GetProfileForPrimaryUser() { - const user_manager::User* primary_user = - user_manager::UserManager::Get()->GetPrimaryUser(); - if (!primary_user) - return nullptr; - return ProfileHelper::Get()->GetProfileByUser(primary_user); -} - void CloseNotification() { SystemNotificationHelper::GetInstance()->Close( NetworkPortalNotificationController::kNotificationId); } -// Note that NetworkingConfigService may change after login as the profile -// switches from the login to the user's profile. -extensions::NetworkingConfigService* GetNetworkingConfigService( - Profile* profile) { - if (!profile) - return nullptr; - return extensions::NetworkingConfigServiceFactory::GetForBrowserContext( - profile); -} - -const extensions::Extension* LookupExtensionForRawSsid( - extensions::NetworkingConfigService* networking_config_service, - const std::vector<uint8_t>& raw_ssid) { - DCHECK(networking_config_service); - Profile* profile = GetProfileForPrimaryUser(); - if (!profile || !networking_config_service) - return nullptr; - std::string extension_id; - std::string hex_ssid = base::HexEncode(raw_ssid.data(), raw_ssid.size()); - extension_id = - networking_config_service->LookupExtensionIdForHexSsid(hex_ssid); - if (extension_id.empty()) - return nullptr; - return extensions::ExtensionRegistry::Get(profile)->GetExtensionById( - extension_id, extensions::ExtensionRegistry::ENABLED); -} - class NetworkPortalNotificationControllerDelegate : public message_center::NotificationDelegate { public: explicit NetworkPortalNotificationControllerDelegate( - const std::string& extension_id, const std::string& guid, base::WeakPtr<NetworkPortalNotificationController> controller) - : extension_id_(extension_id), - guid_(guid), - clicked_(false), - controller_(controller) {} + : guid_(guid), clicked_(false), controller_(controller) {} // Overridden from message_center::NotificationDelegate: void Click(const base::Optional<int>& button_index, @@ -113,10 +68,6 @@ private: ~NetworkPortalNotificationControllerDelegate() override {} - // ID of the extension responsible for network configuration of the network - // that this notification is generated for. Empty if none. - std::string extension_id_; - // GUID of the network this notification is generated for. std::string guid_; @@ -130,27 +81,6 @@ void NetworkPortalNotificationControllerDelegate::Click( const base::Optional<int>& button_index, const base::Optional<base::string16>& reply) { - if (button_index && - *button_index == - NetworkPortalNotificationController::kUseExtensionButtonIndex) { - Profile* profile = GetProfileForPrimaryUser(); - // The user decided to notify the extension to authenticate to the captive - // portal. Notify the NetworkingConfigService, which in turn will notify the - // extension. OnExtensionFinsihedAuthentication will be called back if the - // authentication succeeded. - extensions::NetworkingConfigServiceFactory::GetForBrowserContext(profile) - ->DispatchPortalDetectedEvent( - extension_id_, guid_, - base::BindRepeating(&NetworkPortalNotificationController:: - OnExtensionFinishedAuthentication, - controller_)); - return; - } - - DCHECK(!button_index || - *button_index == - NetworkPortalNotificationController::kOpenPortalButtonIndex); - clicked_ = true; Profile* profile = ProfileManager::GetActiveUserProfile(); @@ -175,26 +105,12 @@ } // namespace // static -const int NetworkPortalNotificationController::kUseExtensionButtonIndex = 0; - -// static -const int NetworkPortalNotificationController::kOpenPortalButtonIndex = 1; - -// static const char NetworkPortalNotificationController::kNotificationId[] = "chrome://net/network_portal_detector"; -// static -const char NetworkPortalNotificationController::kNotificationMetric[] = - "CaptivePortal.Notification.Status"; - NetworkPortalNotificationController::NetworkPortalNotificationController( NetworkPortalDetector* network_portal_detector) : network_portal_detector_(network_portal_detector) { - if (NetworkHandler::IsInitialized()) { // May be false in tests. - NetworkHandler::Get()->network_state_handler()->AddObserver(this, - FROM_HERE); - } if (network_portal_detector_) { // May be null in tests. network_portal_detector_->AddObserver(this); DCHECK(session_manager::SessionManager::Get()); @@ -208,22 +124,6 @@ session_manager::SessionManager::Get()->RemoveObserver(this); network_portal_detector_->RemoveObserver(this); } - if (NetworkHandler::IsInitialized()) { - NetworkHandler::Get()->network_state_handler()->RemoveObserver(this, - FROM_HERE); - } -} - -void NetworkPortalNotificationController::DefaultNetworkChanged( - const NetworkState* network) { - if (!network) - return; - Profile* profile = GetProfileForPrimaryUser(); - extensions::NetworkingConfigService* networking_config_service = - GetNetworkingConfigService(profile); - if (!networking_config_service) - return; - networking_config_service->ResetAuthenticationResult(); } void NetworkPortalNotificationController::OnPortalDetectionCompleted( @@ -256,8 +156,9 @@ return; last_network_guid_ = network->guid(); - SystemNotificationHelper::GetInstance()->Display( - *GetNotification(network, state)); + std::unique_ptr<message_center::Notification> notification = + CreateDefaultCaptivePortalNotification(network); + SystemNotificationHelper::GetInstance()->Display(*notification); } void NetworkPortalNotificationController::OnShutdown() { @@ -294,10 +195,9 @@ std::unique_ptr<message_center::Notification> NetworkPortalNotificationController::CreateDefaultCaptivePortalNotification( const NetworkState* network) { - message_center::RichNotificationData data; auto delegate = base::MakeRefCounted<NetworkPortalNotificationControllerDelegate>( - std::string(), network->guid(), weak_factory_.GetWeakPtr()); + network->guid(), weak_factory_.GetWeakPtr()); message_center::NotifierId notifier_id( message_center::NotifierType::SYSTEM_COMPONENT, kNotifierNetworkPortalDetector); @@ -312,91 +212,13 @@ is_wifi ? IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_WIFI : IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_WIRED, base::UTF8ToUTF16(network->name())), - base::string16(), GURL(), notifier_id, data, std::move(delegate), - kNotificationCaptivePortalIcon, + /*display_source=*/base::string16(), /*origin_url=*/GURL(), + notifier_id, message_center::RichNotificationData(), + std::move(delegate), kNotificationCaptivePortalIcon, message_center::SystemNotificationWarningLevel::WARNING); return notification; } -std::unique_ptr<message_center::Notification> -NetworkPortalNotificationController:: - CreateCaptivePortalNotificationForExtension( - const NetworkState* network, - extensions::NetworkingConfigService* networking_config_service, - const extensions::Extension* extension) { - message_center::RichNotificationData data; - auto delegate = - base::MakeRefCounted<NetworkPortalNotificationControllerDelegate>( - extension->id(), network->guid(), weak_factory_.GetWeakPtr()); - message_center::NotifierId notifier_id( - message_center::NotifierType::SYSTEM_COMPONENT, - kNotifierNetworkPortalDetector); - - extensions::NetworkingConfigService::AuthenticationResult - authentication_result = - networking_config_service->GetAuthenticationResult(); - base::string16 notification_text; - if (authentication_result.authentication_state == - extensions::NetworkingConfigService::NOTRY || - network->guid() != authentication_result.guid) { - notification_text = l10n_util::GetStringFUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_ASK_WIFI, - base::UTF8ToUTF16(network->name())); - data.buttons.push_back( - message_center::ButtonInfo(l10n_util::GetStringFUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_BUTTON_EXTENSION, - base::UTF8ToUTF16(extension->name())))); - data.buttons.push_back(message_center::ButtonInfo(l10n_util::GetStringUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_BUTTON_PORTAL))); - } else { - notification_text = l10n_util::GetStringFUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_FAILED_WIFI, - base::UTF8ToUTF16(network->name())); - data.buttons.push_back( - message_center::ButtonInfo(l10n_util::GetStringFUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_BUTTON_EXTENSION_RETRY, - base::UTF8ToUTF16(extension->name())))); - data.buttons.push_back(message_center::ButtonInfo(l10n_util::GetStringUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_BUTTON_PORTAL))); - } - std::unique_ptr<message_center::Notification> notification = - ash::CreateSystemNotification( - message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, - l10n_util::GetStringUTF16( - IDS_PORTAL_DETECTION_NOTIFICATION_TITLE_WIFI), - notification_text, base::string16() /* display_source */, GURL(), - notifier_id, data, std::move(delegate), - kNotificationCaptivePortalIcon, - message_center::SystemNotificationWarningLevel::WARNING); - return notification; -} - -std::unique_ptr<message_center::Notification> -NetworkPortalNotificationController::GetNotification( - const NetworkState* network, - const NetworkPortalDetector::CaptivePortalState& state) { - Profile* profile = GetProfileForPrimaryUser(); - extensions::NetworkingConfigService* networking_config_service = - GetNetworkingConfigService(profile); - std::string extension_id; - const extensions::Extension* extension = nullptr; - if (networking_config_service) { - extension = LookupExtensionForRawSsid(networking_config_service, - network->raw_ssid()); - } - if (extension) { - return CreateCaptivePortalNotificationForExtension( - network, networking_config_service, extension); - } else { - return CreateDefaultCaptivePortalNotification(network); - } -} - -void NetworkPortalNotificationController::OnExtensionFinishedAuthentication() { - if (network_portal_detector_) - network_portal_detector_->StartPortalDetection(true /* force */); -} - void NetworkPortalNotificationController::SetIgnoreNoNetworkForTesting() { ignore_no_network_for_testing_ = true; }
diff --git a/chrome/browser/ui/ash/network/network_portal_notification_controller.h b/chrome/browser/ui/ash/network/network_portal_notification_controller.h index fa2cff0..1eb2e66a 100644 --- a/chrome/browser/ui/ash/network/network_portal_notification_controller.h +++ b/chrome/browser/ui/ash/network/network_portal_notification_controller.h
@@ -9,16 +9,10 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" -#include "chromeos/network/network_state_handler_observer.h" #include "chromeos/network/portal_detector/network_portal_detector.h" #include "components/session_manager/core/session_manager_observer.h" #include "ui/message_center/public/cpp/notification.h" -namespace extensions { -class Extension; -class NetworkingConfigService; -} // namespace extensions - namespace chromeos { class NetworkState; @@ -28,8 +22,7 @@ // Shows a message center notification when the networking stack detects a // captive portal. class NetworkPortalNotificationController - : public NetworkStateHandlerObserver, - public NetworkPortalDetector::Observer, + : public NetworkPortalDetector::Observer, public session_manager::SessionManagerObserver { public: // The values of these metrics are being used for UMA gathering, so it is @@ -41,13 +34,8 @@ USER_ACTION_METRIC_COUNT }; - static const int kUseExtensionButtonIndex; - static const int kOpenPortalButtonIndex; - static const char kNotificationId[]; - static const char kNotificationMetric[]; - explicit NetworkPortalNotificationController( NetworkPortalDetector* network_portal_dectector); ~NetworkPortalNotificationController() override; @@ -61,10 +49,6 @@ // NULLifies reference to the active dialog. void OnDialogDestroyed(const NetworkPortalWebDialog* dialog); - // Called if an extension has successfully finished authentication to the - // previously detected captive portal. - void OnExtensionFinishedAuthentication(); - // Ignores "No network" errors in browser tests. void SetIgnoreNoNetworkForTesting(); @@ -81,26 +65,12 @@ std::unique_ptr<message_center::Notification> CreateDefaultCaptivePortalNotification(const NetworkState* network); - // Creates an advanced captive portal notification informing the user that a - // captive portal has been detected and an extension has registered to perform - // captive portal authentication for that network. Gives the user the choice - // to either authenticate using that extension or open the captive portal - // login page in the browser. - std::unique_ptr<message_center::Notification> - CreateCaptivePortalNotificationForExtension( - const NetworkState* network, - extensions::NetworkingConfigService* networking_config_service, - const extensions::Extension* extension); - // Constructs a notification to inform the user that a captive portal has been // detected. std::unique_ptr<message_center::Notification> GetNotification( const NetworkState* network, const NetworkPortalDetector::CaptivePortalState& state); - // NetworkStateHandlerObserver: - void DefaultNetworkChanged(const NetworkState* network) override; - // NetworkPortalDetector::Observer: void OnPortalDetectionCompleted( const NetworkState* network,
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 1678df7..e64857a 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1318,11 +1318,9 @@ // Two differences between this and FocusLocationBar(): // (1) This doesn't get recorded in user metrics, since it's called // internally. - // (2) This is called with |select_all| == false, because this is a renderer - // initiated focus (this method is a WebContentsDelegate override). - // We don't select-all for renderer initiated focuses, as the user may - // currently be typing something while the tab finishes loading. We don't - // want to clobber user input by selecting all while the user is typing. + // (2) This is called with |is_user_initiated| == false, because this is a + // renderer initiated focus (this method is a WebContentsDelegate + // override). window_->SetFocusToLocationBar(false); }
diff --git a/chrome/browser/ui/cocoa/touchbar/browser_window_default_touch_bar.mm b/chrome/browser/ui/cocoa/touchbar/browser_window_default_touch_bar.mm index ee0a2fc..9b5e3b0 100644 --- a/chrome/browser/ui/cocoa/touchbar/browser_window_default_touch_bar.mm +++ b/chrome/browser/ui/cocoa/touchbar/browser_window_default_touch_bar.mm
@@ -273,6 +273,9 @@ base::scoped_nsobject<NSButton> _starredButton; } +// Creates and returns a touch bar for tab non-fullscreen mode. +- (NSTouchBar*)createTabTouchBar; + // Creates and returns a touch bar for tab fullscreen mode. - (NSTouchBar*)createTabFullscreenTouchBar; @@ -304,37 +307,7 @@ return [self createTabFullscreenTouchBar]; } - base::scoped_nsobject<NSTouchBar> touchBar([[NSTouchBar alloc] init]); - [touchBar - setCustomizationIdentifier:ui::GetTouchBarId(kBrowserWindowTouchBarId)]; - [touchBar setDelegate:self]; - - NSMutableArray<NSString*>* customIdentifiers = [NSMutableArray array]; - NSMutableArray<NSString*>* defaultIdentifiers = [NSMutableArray array]; - - NSArray<NSString*>* touchBarItems = @[ - kBackTouchId, kForwardTouchId, kReloadOrStopTouchId, kHomeTouchId, - kSearchTouchId, kStarTouchId, kNewTabTouchId - ]; - - for (NSString* item in touchBarItems) { - NSString* itemIdentifier = - ui::GetTouchBarItemId(kBrowserWindowTouchBarId, item); - [customIdentifiers addObject:itemIdentifier]; - - // Don't add the home button if it's not shown in the toolbar. - if (item == kHomeTouchId && !_notificationBridge->show_home_button()) - continue; - - [defaultIdentifiers addObject:itemIdentifier]; - } - - [customIdentifiers addObject:NSTouchBarItemIdentifierFlexibleSpace]; - - [touchBar setDefaultItemIdentifiers:defaultIdentifiers]; - [touchBar setCustomizationAllowedItemIdentifiers:customIdentifiers]; - - return touchBar.autorelease(); + return [self createTabTouchBar]; } - (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar @@ -435,6 +408,9 @@ [touchBarItem setView:[NSTextField labelWithAttributedString:attributedString.get()]]; + [touchBarItem + setCustomizationLabel:l10n_util::GetNSString( + IDS_TOUCH_BAR_URL_CUSTOMIZATION_LABEL)]; } else { return nil; } @@ -442,12 +418,52 @@ return touchBarItem.autorelease(); } +- (NSTouchBar*)createTabTouchBar { + base::scoped_nsobject<NSTouchBar> touchBar([[NSTouchBar alloc] init]); + [touchBar + setCustomizationIdentifier:ui::GetTouchBarId(kBrowserWindowTouchBarId)]; + [touchBar setDelegate:self]; + + NSMutableArray<NSString*>* customIdentifiers = [NSMutableArray array]; + NSMutableArray<NSString*>* defaultIdentifiers = [NSMutableArray array]; + + NSArray<NSString*>* touchBarItems = @[ + kBackTouchId, kForwardTouchId, kReloadOrStopTouchId, kHomeTouchId, + kSearchTouchId, kStarTouchId, kNewTabTouchId + ]; + + for (NSString* item in touchBarItems) { + NSString* itemIdentifier = + ui::GetTouchBarItemId(kBrowserWindowTouchBarId, item); + [customIdentifiers addObject:itemIdentifier]; + + // Don't add the home button if it's not shown in the toolbar. + if (item == kHomeTouchId && !_notificationBridge->show_home_button()) + continue; + + [defaultIdentifiers addObject:itemIdentifier]; + } + + [customIdentifiers addObject:NSTouchBarItemIdentifierFlexibleSpace]; + + [touchBar setDefaultItemIdentifiers:defaultIdentifiers]; + [touchBar setCustomizationAllowedItemIdentifiers:customIdentifiers]; + + return touchBar.autorelease(); +} + - (NSTouchBar*)createTabFullscreenTouchBar { base::scoped_nsobject<NSTouchBar> touchBar([[NSTouchBar alloc] init]); + [touchBar + setCustomizationIdentifier:ui::GetTouchBarId(kTabFullscreenTouchBarId)]; [touchBar setDelegate:self]; - [touchBar setDefaultItemIdentifiers:@[ ui::GetTouchBarItemId( - kTabFullscreenTouchBarId, - kFullscreenOriginLabelTouchId) ]]; + + NSArray<NSString*>* touchBarItems = @[ ui::GetTouchBarItemId( + kTabFullscreenTouchBarId, kFullscreenOriginLabelTouchId) ]; + + [touchBar setDefaultItemIdentifiers:touchBarItems]; + [touchBar setCustomizationAllowedItemIdentifiers:touchBarItems]; + return touchBar.autorelease(); }
diff --git a/chrome/browser/ui/location_bar/location_bar.h b/chrome/browser/ui/location_bar/location_bar.h index d31c1e6..c74aeb7c 100644 --- a/chrome/browser/ui/location_bar/location_bar.h +++ b/chrome/browser/ui/location_bar/location_bar.h
@@ -48,8 +48,6 @@ // Renderer-initiated focuses (like browser startup or NTP finished loading), // should have |is_user_initiated| set to false, so we can avoid disrupting // user actions and avoid requesting on-focus suggestions. - // - // TODO(tommycli): See if there's a more descriptive name for this method. virtual void FocusLocation(bool is_user_initiated) = 0; // Puts the user into keyword mode with their default search provider.
diff --git a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc index af5fd3b..2f326bbf 100644 --- a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc +++ b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
@@ -737,6 +737,22 @@ EXPECT_EQ(old_selected_line, popup_model->selected_line()); } +// Verifies that https://crbug.com/45260 doesn't regress. +IN_PROC_BROWSER_TEST_F(OmniboxViewTest, + RendererInitiatedFocusSelectsAllWhenStartingBlurred) { + ASSERT_NO_FATAL_FAILURE(NavigateExpectUrl(GURL("about:blank"))); + + OmniboxView* omnibox_view = nullptr; + ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view)); + ASSERT_FALSE(omnibox_view->IsSelectAll()); + + // Simulate a renderer-initated focus event. Expect that everything is + // selected now. + browser()->SetFocusToLocationBar(); + EXPECT_TRUE(omnibox_view->IsSelectAll()); +} + +// Verifies that https://crbug.com/924935 doesn't regress. IN_PROC_BROWSER_TEST_F(OmniboxViewTest, RendererInitiatedFocusPreservesUserText) { OmniboxView* omnibox_view = nullptr;
diff --git a/chrome/browser/ui/thumbnails/thumbnail_capture_driver.cc b/chrome/browser/ui/thumbnails/thumbnail_capture_driver.cc index e11237f..7d7264fa 100644 --- a/chrome/browser/ui/thumbnails/thumbnail_capture_driver.cc +++ b/chrome/browser/ui/thumbnails/thumbnail_capture_driver.cc
@@ -54,6 +54,15 @@ } void ThumbnailCaptureDriver::UpdateCaptureState() { + // If there was a final thumbnail but the page has changed, get set up + // for a new capture. + if (page_readiness_ < PageReadiness::kReadyForFinalCapture && + capture_state_ == CaptureState::kHaveFinalCapture) { + client_->StopCapture(); + capture_state_ = CaptureState::kNoCapture; + } + + // If de-scheduled, stop any ongoing capture. if (!scheduled_) { client_->StopCapture(); @@ -114,23 +123,15 @@ return; } - // Capturing is not allowed when a page is visible. Otherwise it - // prevents the tab from properly entering fullscreen. See - // https://crbug.com/1112607 - if (page_visible_) { - scheduler_->SetTabCapturePriority( - this, ThumbnailScheduler::TabCapturePriority::kNone); - return; - } - - // For now don't force-load background pages. This is not ideal. We would - // like to grab frames from background pages to make hover cards and the - // "Mohnstrudel" touch/tablet tabstrip more responsive by pre-loading - // thumbnails from those pages. However, this currently results in a number - // of test failures and a possible violation of an assumption made by the - // renderer. TODO(crbug.com/1073141): Figure out how to force-render - // background tabs. This bug has detailed descriptions of steps we might - // take to make capture more flexible in this area. + // For now don't force-load background pages, or the current page if the + // thumbnail isn't being requested. This is not ideal. We would like to grab + // frames from background pages to make hover cards and the "Mohnstrudel" + // touch/tablet tabstrip more responsive by pre-loading thumbnails from those + // pages. However, this currently results in a number of test failures and a + // possible violation of an assumption made by the renderer. + // TODO(crbug.com/1073141): Figure out how to force-render background tabs. + // This bug has detailed descriptions of steps we might take to make capture + // more flexible in this area. if (!thumbnail_visible_) { scheduler_->SetTabCapturePriority( this, ThumbnailScheduler::TabCapturePriority::kNone);
diff --git a/chrome/browser/ui/thumbnails/thumbnail_capture_driver_unittest.cc b/chrome/browser/ui/thumbnails/thumbnail_capture_driver_unittest.cc index fe28b19..f496af1 100644 --- a/chrome/browser/ui/thumbnails/thumbnail_capture_driver_unittest.cc +++ b/chrome/browser/ui/thumbnails/thumbnail_capture_driver_unittest.cc
@@ -94,33 +94,34 @@ } TEST_F(ThumbnailCaptureDriverTest, - NoCaptureWhenPageIsVisibleAndThumbnailIsRequested) { - EXPECT_CALL(mock_client_, RequestCapture()).Times(0); - EXPECT_CALL(mock_client_, StartCapture()).Times(0); - EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber()); + CaptureWhenPageIsVisibleAndThumbnailIsRequested) { + // StopCapture() can be called unnecessarily at first. + Expectation stop_capture = + EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber()); + // Capture shouldn't start, just requested. + EXPECT_CALL(mock_client_, StartCapture()).Times(0); + + // Simulate the current page having its thumbnail requested. capture_driver_.UpdatePageVisibility(true); capture_driver_.UpdateThumbnailVisibility(true); - EXPECT_EQ(scheduler_.priority(), - ThumbnailScheduler::TabCapturePriority::kNone); - - // Simulate a page loading from start to finish + // Page becomes sufficiently loaded for capture, but no further, and + // the client never reports it's ready to capture. This should trigger + // a RequestCapture() call but nothing more. capture_driver_.UpdatePageReadiness( ThumbnailReadinessTracker::Readiness::kNotReady); - capture_driver_.SetCanCapture(true); - EXPECT_EQ(scheduler_.priority(), - ThumbnailScheduler::TabCapturePriority::kNone); capture_driver_.UpdatePageReadiness( ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture); EXPECT_EQ(scheduler_.priority(), - ThumbnailScheduler::TabCapturePriority::kNone); + ThumbnailScheduler::TabCapturePriority::kLow); - capture_driver_.UpdatePageReadiness( - ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture); - EXPECT_EQ(scheduler_.priority(), - ThumbnailScheduler::TabCapturePriority::kNone); + // Capture should only be requested when the scheduler allows it. + // Additionally ensure the RequestCapture() call is ordered before any + // StopCapture() calls. + EXPECT_CALL(mock_client_, RequestCapture()).Times(1).After(stop_capture); + capture_driver_.SetCapturePermittedByScheduler(true); } TEST_F(ThumbnailCaptureDriverTest, NoCaptureWhenPageAndThumbnailAreNotVisible) { @@ -346,13 +347,13 @@ capture_driver_.SetCapturePermittedByScheduler(false); } -TEST_F(ThumbnailCaptureDriverTest, StopsCaptureIfPageBecomesVisible) { +TEST_F(ThumbnailCaptureDriverTest, CanContinueCaptureIfPageBecomesVisible) { { InSequence s; EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber()); EXPECT_CALL(mock_client_, RequestCapture()); EXPECT_CALL(mock_client_, StartCapture()); - EXPECT_CALL(mock_client_, StopCapture()).Times(AtLeast(1)); + EXPECT_CALL(mock_client_, StopCapture()).Times(0); } capture_driver_.UpdateThumbnailVisibility(true); @@ -367,13 +368,12 @@ capture_driver_.UpdatePageVisibility(true); EXPECT_EQ(scheduler_.priority(), - ThumbnailScheduler::TabCapturePriority::kNone); - capture_driver_.SetCapturePermittedByScheduler(false); + ThumbnailScheduler::TabCapturePriority::kLow); capture_driver_.UpdatePageReadiness( ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture); EXPECT_EQ(scheduler_.priority(), - ThumbnailScheduler::TabCapturePriority::kNone); + ThumbnailScheduler::TabCapturePriority::kHigh); } TEST_F(ThumbnailCaptureDriverTest, ContinuesCaptureWhenPageBecomesFinal) { @@ -526,3 +526,58 @@ EXPECT_EQ(scheduler_.priority(), ThumbnailScheduler::TabCapturePriority::kNone); } + +// Going from kReadyForFinalCapture to a lower readiness should always +// invalidate the current thumbnail. Capture should restart from +// scratch. Regression test for https://crbug.com/1137330 +TEST_F(ThumbnailCaptureDriverTest, InvalidatesThumbnailOnReadinessDecrease) { + { + InSequence s; + EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber()); + EXPECT_CALL(mock_client_, RequestCapture()); + EXPECT_CALL(mock_client_, StartCapture()); + EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber()); + EXPECT_CALL(mock_client_, RequestCapture()); + EXPECT_CALL(mock_client_, StartCapture()); + } + + capture_driver_.UpdateThumbnailVisibility(true); + capture_driver_.UpdatePageVisibility(false); + + capture_driver_.UpdatePageReadiness( + ThumbnailReadinessTracker::Readiness::kNotReady); + capture_driver_.UpdatePageReadiness( + ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture); + capture_driver_.SetCapturePermittedByScheduler(true); + capture_driver_.SetCanCapture(true); + capture_driver_.UpdatePageReadiness( + ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture); + EXPECT_EQ(scheduler_.priority(), + ThumbnailScheduler::TabCapturePriority::kHigh); + + capture_driver_.SetCapturePermittedByScheduler(true); + capture_driver_.GotFrame(); + task_environment_.FastForwardBy(ThumbnailCaptureDriver::kCooldownDelay); + EXPECT_EQ(scheduler_.priority(), + ThumbnailScheduler::TabCapturePriority::kNone); + + // This should result in the thumbnail being invalidated. Subsequent + // loading should trigger capture again. + capture_driver_.UpdatePageReadiness( + ThumbnailReadinessTracker::Readiness::kNotReady); + EXPECT_EQ(scheduler_.priority(), + ThumbnailScheduler::TabCapturePriority::kNone); + + capture_driver_.UpdatePageReadiness( + ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture); + EXPECT_EQ(scheduler_.priority(), + ThumbnailScheduler::TabCapturePriority::kLow); + + capture_driver_.SetCapturePermittedByScheduler(true); + capture_driver_.SetCanCapture(true); + + capture_driver_.UpdatePageReadiness( + ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture); + EXPECT_EQ(scheduler_.priority(), + ThumbnailScheduler::TabCapturePriority::kHigh); +}
diff --git a/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc b/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc index 76d512a..4be7726 100644 --- a/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc +++ b/chrome/browser/ui/thumbnails/thumbnail_tab_helper.cc
@@ -184,7 +184,7 @@ visible_ = new_visible; capture_driver_.UpdatePageVisibility(visible_); - if (!visible_ && page_readiness_ == PageReadiness::kReadyForFinalCapture) + if (!visible_ && page_readiness_ != PageReadiness::kNotReady) thumbnail_tab_helper_->CaptureThumbnailOnTabHidden(); }
diff --git a/chrome/browser/ui/views/accessibility/caption_bubble.cc b/chrome/browser/ui/views/accessibility/caption_bubble.cc index c49719e..0c58005 100644 --- a/chrome/browser/ui/views/accessibility/caption_bubble.cc +++ b/chrome/browser/ui/views/accessibility/caption_bubble.cc
@@ -28,6 +28,7 @@ #include "ui/gfx/geometry/vector2d.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/strings/grit/ui_strings.h" +#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/button/button.h" @@ -417,23 +418,24 @@ // Use the arrow keys to move. if (event->type() == ui::ET_KEY_PRESSED) { gfx::Vector2d offset; - if (event->key_code() == ui::VKEY_UP) { + if (event->key_code() == ui::VKEY_UP) offset.set_y(-kWidgetDisplacementWithArrowKeyDip); - } - if (event->key_code() == ui::VKEY_DOWN) { + if (event->key_code() == ui::VKEY_DOWN) offset.set_y(kWidgetDisplacementWithArrowKeyDip); - } - if (event->key_code() == ui::VKEY_LEFT) { + if (event->key_code() == ui::VKEY_LEFT) offset.set_x(-kWidgetDisplacementWithArrowKeyDip); - } - if (event->key_code() == ui::VKEY_RIGHT) { + if (event->key_code() == ui::VKEY_RIGHT) offset.set_x(kWidgetDisplacementWithArrowKeyDip); - } if (offset != gfx::Vector2d()) { DCHECK(GetWidget()); gfx::Rect bounds = GetWidget()->GetWindowBoundsInScreen(); bounds.Offset(offset); GetWidget()->SetBounds(bounds); + int x = 100 * base::ClampToRange(ratio_in_parent_x_, 0.0, 1.0); + int y = 100 * base::ClampToRange(ratio_in_parent_y_, 0.0, 1.0); + GetViewAccessibility().AnnounceText(l10n_util::GetStringFUTF16( + IDS_LIVE_CAPTION_BUBBLE_MOVE_SCREENREADER_ANNOUNCEMENT, + base::NumberToString16(x), base::NumberToString16(y))); return; } } @@ -577,8 +579,11 @@ // Show the widget if it has text or an error to display. Only show the // widget if it isn't already visible. Always calling Widget::Show() will // mean the widget gets focus each time. - if (!GetWidget()->IsVisible()) + if (!GetWidget()->IsVisible()) { GetWidget()->Show(); + GetViewAccessibility().AnnounceText(l10n_util::GetStringUTF16( + IDS_LIVE_CAPTION_BUBBLE_APPEAR_SCREENREADER_ANNOUNCEMENT)); + } } else if (GetWidget()->IsVisible()) { // No text and no error. Hide it. GetWidget()->Hide();
diff --git a/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc b/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc index 7aa6d51..770273e 100644 --- a/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc +++ b/chrome/browser/ui/views/accessibility/caret_browsing_dialog_delegate.cc
@@ -91,7 +91,7 @@ gfx::Size CaretBrowsingDialogDelegate::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc index 0aef7f5f..05b9da9 100644 --- a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc +++ b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc
@@ -24,7 +24,7 @@ gfx::Size AppDialogView::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(default_width, GetHeightForWidth(default_width)); }
diff --git a/chrome/browser/ui/views/arc_app_dialog_view.cc b/chrome/browser/ui/views/arc_app_dialog_view.cc index d23d472..81e5a86 100644 --- a/chrome/browser/ui/views/arc_app_dialog_view.cc +++ b/chrome/browser/ui/views/arc_app_dialog_view.cc
@@ -196,7 +196,7 @@ gfx::Size ArcAppDialogView::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(default_width, GetHeightForWidth(default_width)); }
diff --git a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc index e65a05cd..68c0b6e 100644 --- a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc +++ b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
@@ -140,7 +140,7 @@ gfx::Size DataRemovalConfirmationDialog::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(default_width, GetHeightForWidth(default_width)); }
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc index 41e9c7b..57bf79c37 100644 --- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc +++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
@@ -212,7 +212,7 @@ // taken into consideration in the frame width size. Because of that, the // dialog width will be snapped to a larger size when Harmony is enabled. const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc index 278c0157..c6f345b 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_bubble_views.cc
@@ -93,7 +93,7 @@ gfx::Size LocalCardMigrationBubbleViews::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc index b59283cd..d2278f5 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views.cc
@@ -96,7 +96,7 @@ gfx::Size SaveCardBubbleViews::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc index ff32bfd..8e752b56 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -294,7 +294,7 @@ : IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_TOOLTIP)); upload_explanation_tooltip->set_bubble_width( ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); upload_explanation_tooltip->set_anchor_point_arrow( views::BubbleBorder::Arrow::TOP_RIGHT); upload_explanation_tooltip->SetID(DialogViewId::UPLOAD_EXPLANATION_TOOLTIP);
diff --git a/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc index b726124..da7c92c 100644 --- a/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc +++ b/chrome/browser/ui/views/autofill/payments/save_upi_offer_bubble_views.cc
@@ -36,7 +36,7 @@ gfx::Size SaveUPIOfferBubbleViews::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc index c3de71a..a4748e5 100644 --- a/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc +++ b/chrome/browser/ui/views/autofill/payments/virtual_card_selection_dialog_view_impl.cc
@@ -67,7 +67,7 @@ gfx::Size VirtualCardSelectionDialogViewImpl::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc index 7e4e678..b7f1a7a 100644 --- a/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc +++ b/chrome/browser/ui/views/autofill/payments/webauthn_dialog_view_impl.cc
@@ -80,7 +80,7 @@ gfx::Size WebauthnDialogViewImpl::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc b/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc index 5a962f1..4f16466 100644 --- a/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc +++ b/chrome/browser/ui/views/chrome_cleaner_dialog_win.cc
@@ -155,7 +155,7 @@ gfx::Size ChromeCleanerDialog::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/chrome_layout_provider.cc b/chrome/browser/ui/views/chrome_layout_provider.cc index 08da8f07c..cd0c6d29 100644 --- a/chrome/browser/ui/views/chrome_layout_provider.cc +++ b/chrome/browser/ui/views/chrome_layout_provider.cc
@@ -17,9 +17,6 @@ // respected (there's 3 * unit / 4 in use to express 12). // The Harmony layout unit. All distances are in terms of this unit. constexpr int kHarmonyLayoutUnit = 16; -constexpr int kSmallSnapPoint = 320; -constexpr int kMediumSnapPoint = 448; -constexpr int kLargeSnapPoint = 512; ChromeLayoutProvider* g_chrome_layout_provider = nullptr; @@ -79,107 +76,63 @@ } int ChromeLayoutProvider::GetDistanceMetric(int metric) const { - DCHECK_GE(metric, views::VIEWS_INSETS_MAX); - switch (metric) { + DCHECK_GE(metric, views::VIEWS_DISTANCE_START); + DCHECK_LT(metric, views::VIEWS_DISTANCE_MAX); + + if (metric < views::VIEWS_DISTANCE_END) + return LayoutProvider::GetDistanceMetric(metric); + + switch (static_cast<ChromeDistanceMetric>(metric)) { case DISTANCE_CONTENT_LIST_VERTICAL_SINGLE: return kHarmonyLayoutUnit / 4; case DISTANCE_CONTENT_LIST_VERTICAL_MULTI: return kHarmonyLayoutUnit / 2; case DISTANCE_CONTROL_LIST_VERTICAL: return kHarmonyLayoutUnit * 3 / 4; - case views::DISTANCE_CLOSE_BUTTON_MARGIN: { - constexpr int kVisibleMargin = kHarmonyLayoutUnit / 2; - // The visible margin is based on the unpadded size, so to get the actual - // margin we need to subtract out the padding. - return kVisibleMargin - kHarmonyLayoutUnit / 4; - } - case views::DISTANCE_CONTROL_VERTICAL_TEXT_PADDING: - return 6; - case views::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL: - return kHarmonyLayoutUnit * 3 / 2; - case views::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT: { - // This is reduced so there is about the same amount of visible - // whitespace, compensating for the text's internal leading. - return GetDistanceMetric( - views::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL) - - 8; - } - case views::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL: - return kHarmonyLayoutUnit; - case views::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT: { - // See the comment in DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT above. - return GetDistanceMetric( - views::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL) - - 8; - } case DISTANCE_DROPDOWN_BUTTON_LABEL_ARROW_SPACING: return 8; case DISTANCE_DROPDOWN_BUTTON_RIGHT_MARGIN: return 12; - case views::DISTANCE_RELATED_BUTTON_HORIZONTAL: - return kHarmonyLayoutUnit / 2; - case views::DISTANCE_RELATED_CONTROL_HORIZONTAL: - return kHarmonyLayoutUnit; case DISTANCE_RELATED_CONTROL_HORIZONTAL_SMALL: return kHarmonyLayoutUnit; - case views::DISTANCE_RELATED_CONTROL_VERTICAL: - return kHarmonyLayoutUnit / 2; case DISTANCE_RELATED_CONTROL_VERTICAL_SMALL: return kHarmonyLayoutUnit / 2; - case views::DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH: case DISTANCE_BUTTON_MINIMUM_WIDTH: - // Minimum label size plus padding. - return 2 * kHarmonyLayoutUnit + - 2 * GetDistanceMetric(views::DISTANCE_BUTTON_HORIZONTAL_PADDING); - case views::DISTANCE_BUTTON_HORIZONTAL_PADDING: - return kHarmonyLayoutUnit; - case views::DISTANCE_BUTTON_MAX_LINKABLE_WIDTH: - return kHarmonyLayoutUnit * 7; - case views::DISTANCE_RELATED_LABEL_HORIZONTAL: - case views::DISTANCE_TABLE_CELL_HORIZONTAL_MARGIN: - return 3 * kHarmonyLayoutUnit / 4; + return GetDistanceMetric(views::DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH); case DISTANCE_RELATED_LABEL_HORIZONTAL_LIST: return kHarmonyLayoutUnit / 2; - case views::DISTANCE_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT: - return kHarmonyLayoutUnit * 12; case DISTANCE_SUBSECTION_HORIZONTAL_INDENT: return 0; case DISTANCE_TOAST_CONTROL_VERTICAL: return 8; case DISTANCE_TOAST_LABEL_VERTICAL: return 12; - case views::DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING: - return kHarmonyLayoutUnit / 2; case DISTANCE_UNRELATED_CONTROL_HORIZONTAL: return kHarmonyLayoutUnit; case DISTANCE_UNRELATED_CONTROL_HORIZONTAL_LARGE: return kHarmonyLayoutUnit; - case views::DISTANCE_UNRELATED_CONTROL_VERTICAL: - return kHarmonyLayoutUnit; case DISTANCE_UNRELATED_CONTROL_VERTICAL_LARGE: return kHarmonyLayoutUnit; case DISTANCE_BUBBLE_HEADER_VECTOR_ICON_SIZE: return 20; - case DISTANCE_BUBBLE_PREFERRED_WIDTH: - return kSmallSnapPoint; - case DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH: case DISTANCE_STANDALONE_BUBBLE_PREFERRED_WIDTH: - return kMediumSnapPoint; + return kMediumDialogWidth; case DISTANCE_LARGE_MODAL_DIALOG_PREFERRED_WIDTH: - return kLargeSnapPoint; + return kLargeDialogWidth; case DISTANCE_BETWEEN_PRIMARY_AND_SECONDARY_LABELS_HORIZONTAL: return 24; case DISTANCE_OMNIBOX_CELL_VERTICAL_PADDING: return 8; case DISTANCE_OMNIBOX_TWO_LINE_CELL_VERTICAL_PADDING: return 4; - default: - return LayoutProvider::GetDistanceMetric(metric); } + NOTREACHED(); + return 0; } int ChromeLayoutProvider::GetSnappedDialogWidth(int min_width) const { - for (int snap_point : {kSmallSnapPoint, kMediumSnapPoint, kLargeSnapPoint}) { + for (int snap_point : + {kSmallDialogWidth, kMediumDialogWidth, kLargeDialogWidth}) { if (min_width <= snap_point) return snap_point; }
diff --git a/chrome/browser/ui/views/chrome_layout_provider.h b/chrome/browser/ui/views/chrome_layout_provider.h index 4ca579f..10ea4a3c 100644 --- a/chrome/browser/ui/views/chrome_layout_provider.h +++ b/chrome/browser/ui/views/chrome_layout_provider.h
@@ -60,17 +60,11 @@ DISTANCE_UNRELATED_CONTROL_HORIZONTAL_LARGE, // Larger vertical spacing between unrelated controls. DISTANCE_UNRELATED_CONTROL_VERTICAL_LARGE, - // Width of modal dialogs unless the content is too wide to make that - // feasible. - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH, // Width of larger modal dialogs that require extra width. DISTANCE_LARGE_MODAL_DIALOG_PREFERRED_WIDTH, // Width and height of a vector icon in a bubble's header (i.e. the one // returned from GetWindowIcon). DISTANCE_BUBBLE_HEADER_VECTOR_ICON_SIZE, - // Width of a bubble unless the content is too wide to make that - // feasible. - DISTANCE_BUBBLE_PREFERRED_WIDTH, // Width of a bubble that appears mid-screen (like a standalone dialog) // instead of being anchored. DISTANCE_STANDALONE_BUBBLE_PREFERRED_WIDTH,
diff --git a/chrome/browser/ui/views/content_setting_bubble_contents.cc b/chrome/browser/ui/views/content_setting_bubble_contents.cc index a0204f7..da42732 100644 --- a/chrome/browser/ui/views/content_setting_bubble_contents.cc +++ b/chrome/browser/ui/views/content_setting_bubble_contents.cc
@@ -411,7 +411,7 @@ gfx::Size ContentSettingBubbleContents::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/critical_notification_bubble_view.cc b/chrome/browser/ui/views/critical_notification_bubble_view.cc index 9a81183..98751e5 100644 --- a/chrome/browser/ui/views/critical_notification_bubble_view.cc +++ b/chrome/browser/ui/views/critical_notification_bubble_view.cc
@@ -124,10 +124,9 @@ views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_SECONDARY); message->SetMultiLine(true); message->SetHorizontalAlignment(gfx::ALIGN_LEFT); - message->SizeToFit( - ChromeLayoutProvider::Get()->GetDistanceMetric( - ChromeDistanceMetric::DISTANCE_BUBBLE_PREFERRED_WIDTH) - - margins().width()); + message->SizeToFit(ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - + margins().width()); AddChildView(std::move(message)); refresh_timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), this,
diff --git a/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc b/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc index e0230cc..edc02a1 100644 --- a/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_app_restart_view.cc
@@ -44,7 +44,7 @@ gfx::Size CrostiniAppRestartView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/crostini/crostini_force_close_view.cc b/chrome/browser/ui/views/crostini/crostini_force_close_view.cc index 6c68393..2b1488004f 100644 --- a/chrome/browser/ui/views/crostini/crostini_force_close_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_force_close_view.cc
@@ -55,7 +55,7 @@ gfx::Size CrostiniForceCloseView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc b/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc index 0115627..65363c6 100644 --- a/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc +++ b/chrome/browser/ui/views/crostini/crostini_package_install_failure_view.cc
@@ -34,7 +34,7 @@ gfx::Size CrostiniPackageInstallFailureView::CalculatePreferredSize() const { const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(dialog_width, GetHeightForWidth(dialog_width)); }
diff --git a/chrome/browser/ui/views/download/download_danger_prompt_views.cc b/chrome/browser/ui/views/download/download_danger_prompt_views.cc index 4ece90d3..88fd35c5 100644 --- a/chrome/browser/ui/views/download/download_danger_prompt_views.cc +++ b/chrome/browser/ui/views/download/download_danger_prompt_views.cc
@@ -184,7 +184,7 @@ gfx::Size DownloadDangerPromptViews::CalculatePreferredSize() const { int preferred_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(preferred_width, GetHeightForWidth(preferred_width)); }
diff --git a/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc b/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc index e3b8e97..629bc52e 100644 --- a/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc +++ b/chrome/browser/ui/views/download/download_in_progress_dialog_view.cc
@@ -87,7 +87,7 @@ gfx::Size DownloadInProgressDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/extensions/extension_install_blocked_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_blocked_dialog_view.cc index 2b97a6c..d0d2f579 100644 --- a/chrome/browser/ui/views/extensions/extension_install_blocked_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_blocked_dialog_view.cc
@@ -84,7 +84,7 @@ gfx::Size ExtensionInstallBlockedDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc index 081b19d..f418a4c3 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -267,7 +267,7 @@ gfx::Size ExtensionInstallDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc index 0d508efa..2debb24 100644 --- a/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/extension_uninstall_dialog_view.cc
@@ -283,10 +283,11 @@ } gfx::Size ExtensionUninstallDialogDelegateView::CalculatePreferredSize() const { - const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - is_bubble_ ? DISTANCE_BUBBLE_PREFERRED_WIDTH - : DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - - margins().width(); + const int width = + ChromeLayoutProvider::Get()->GetDistanceMetric( + is_bubble_ ? views::DISTANCE_BUBBLE_PREFERRED_WIDTH + : views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view.cc b/chrome/browser/ui/views/extensions/extensions_menu_view.cc index f9fcc3f..23f0948 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view.cc
@@ -109,7 +109,7 @@ gfx::Size ExtensionsMenuView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc index 76d6416..301a5a2 100644 --- a/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/print_job_confirmation_dialog_view.cc
@@ -148,8 +148,8 @@ gfx::Size PrintJobConfirmationDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - dialog_is_bubble_ ? DISTANCE_BUBBLE_PREFERRED_WIDTH - : DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + dialog_is_bubble_ ? views::DISTANCE_BUBBLE_PREFERRED_WIDTH + : views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/extensions/settings_overridden_dialog_view.cc b/chrome/browser/ui/views/extensions/settings_overridden_dialog_view.cc index 98829775..c33f2d197 100644 --- a/chrome/browser/ui/views/extensions/settings_overridden_dialog_view.cc +++ b/chrome/browser/ui/views/extensions/settings_overridden_dialog_view.cc
@@ -96,7 +96,7 @@ gfx::Size SettingsOverriddenDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/folder_upload_confirmation_view.cc b/chrome/browser/ui/views/folder_upload_confirmation_view.cc index 30fcd2e0..fcc2153c 100644 --- a/chrome/browser/ui/views/folder_upload_confirmation_view.cc +++ b/chrome/browser/ui/views/folder_upload_confirmation_view.cc
@@ -87,7 +87,7 @@ gfx::Size FolderUploadConfirmationView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/frame/browser_frame_header_ash.cc b/chrome/browser/ui/views/frame/browser_frame_header_ash.cc index 8ee5569a..e762460 100644 --- a/chrome/browser/ui/views/frame/browser_frame_header_ash.cc +++ b/chrome/browser/ui/views/frame/browser_frame_header_ash.cc
@@ -5,13 +5,13 @@ #include "chrome/browser/ui/views/frame/browser_frame_header_ash.h" #include "ash/public/cpp/ash_constants.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/frame_utils.h" #include "ash/public/cpp/tablet_mode.h" #include "base/check.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/base/window_state_type.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkPaint.h" @@ -112,7 +112,7 @@ views::Widget* target_widget, views::View* view, AppearanceProvider* appearance_provider, - ash::FrameCaptionButtonContainerView* caption_button_container) + chromeos::FrameCaptionButtonContainerView* caption_button_container) : FrameHeader(target_widget, view) { DCHECK(appearance_provider); DCHECK(caption_button_container);
diff --git a/chrome/browser/ui/views/frame/browser_frame_header_ash.h b/chrome/browser/ui/views/frame/browser_frame_header_ash.h index 842c76d..f299ea84 100644 --- a/chrome/browser/ui/views/frame/browser_frame_header_ash.h +++ b/chrome/browser/ui/views/frame/browser_frame_header_ash.h
@@ -31,7 +31,7 @@ views::Widget* target_widget, views::View* view, AppearanceProvider* appearance_provider, - ash::FrameCaptionButtonContainerView* caption_button_container); + chromeos::FrameCaptionButtonContainerView* caption_button_container); ~BrowserFrameHeaderAsh() override; // Returns the amount that the frame background is inset from the left edge of
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc index 37cd7ebc..7e7e76c2 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -7,10 +7,8 @@ #include <algorithm> #include "ash/public/cpp/app_types.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/frame_utils.h" -#include "ash/public/cpp/tablet_mode.h" #include "ash/public/cpp/window_properties.h" #include "ash/wm/window_util.h" #include "base/metrics/user_metrics.h" @@ -40,6 +38,7 @@ #include "chromeos/ui/base/chromeos_ui_constants.h" #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/base/window_state_type.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "content/public/browser/web_contents.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/accessibility/ax_enums.mojom.h" @@ -95,7 +94,7 @@ } BrowserNonClientFrameViewAsh::~BrowserNonClientFrameViewAsh() { - ash::TabletMode::Get()->RemoveObserver(this); + chromeos::TabletState::Get()->RemoveObserver(this); ImmersiveModeController* immersive_controller = browser_view()->immersive_mode_controller(); @@ -104,7 +103,8 @@ } void BrowserNonClientFrameViewAsh::Init() { - caption_button_container_ = new ash::FrameCaptionButtonContainerView(frame()); + caption_button_container_ = + new chromeos::FrameCaptionButtonContainerView(frame()); caption_button_container_->UpdateCaptionButtonState(false /*=animate*/); AddChildView(caption_button_container_); @@ -133,7 +133,7 @@ if (browser->profile()->IsOffTheRecord()) window->SetProperty(ash::kBlockedForAssistantSnapshotKey, true); - ash::TabletMode::Get()->AddObserver(this); + chromeos::TabletState::Get()->AddObserver(this); if (frame()->ShouldDrawFrameHeader()) frame_header_ = CreateFrameHeader(); @@ -414,12 +414,19 @@ : BrowserFrameActiveState::kInactive); } -void BrowserNonClientFrameViewAsh::OnTabletModeStarted() { - OnTabletModeToggled(true); -} - -void BrowserNonClientFrameViewAsh::OnTabletModeEnded() { - OnTabletModeToggled(false); +void BrowserNonClientFrameViewAsh::OnTabletStateChanged( + chromeos::TabletState::State state) { + switch (state) { + case chromeos::TabletState::State::kInTabletMode: + OnTabletModeToggled(true); + return; + case chromeos::TabletState::State::kInClamshellMode: + OnTabletModeToggled(false); + return; + case chromeos::TabletState::State::kEnteringTabletMode: + case chromeos::TabletState::State::kExitingTabletMode: + break; + } } void BrowserNonClientFrameViewAsh::OnTabletModeToggled(bool enabled) { @@ -558,7 +565,7 @@ bool BrowserNonClientFrameViewAsh::ShouldShowCaptionButtonsWhenNotInOverview() const { return UsePackagedAppHeaderStyle(browser_view()->browser()) || - !ash::TabletMode::Get()->InTabletMode(); + !chromeos::TabletState::Get()->InTabletMode(); } int BrowserNonClientFrameViewAsh::GetToolbarLeftInset() const {
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h index f21b1fd3..a9cca17 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -7,7 +7,6 @@ #include <memory> -#include "ash/public/cpp/tablet_mode_observer.h" #include "base/gtest_prod_util.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" @@ -16,6 +15,7 @@ #include "chrome/browser/ui/views/frame/browser_non_client_frame_view.h" #include "chrome/browser/ui/views/frame/immersive_mode_controller.h" #include "chrome/browser/ui/views/tab_icon_view_model.h" +#include "chromeos/ui/base/tablet_state.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" @@ -26,15 +26,15 @@ class ProfileIndicatorIcon; class TabIconView; -namespace ash { +namespace chromeos { class FrameCaptionButtonContainerView; -} // namespace ash +} // namespace chromeos // Provides the BrowserNonClientFrameView for Chrome OS. class BrowserNonClientFrameViewAsh : public BrowserNonClientFrameView, public BrowserFrameHeaderAsh::AppearanceProvider, - public ash::TabletModeObserver, + public chromeos::TabletState::Observer, public TabIconViewModel, public aura::WindowObserver, public ImmersiveModeController::Observer { @@ -81,9 +81,8 @@ int GetFrameHeaderImageYInset() override; gfx::ImageSkia GetFrameHeaderOverlayImage(bool active) override; - // ash::TabletModeObserver: - void OnTabletModeStarted() override; - void OnTabletModeEnded() override; + // chromeos::TabletState::Observer: + void OnTabletStateChanged(chromeos::TabletState::State) override; void OnTabletModeToggled(bool enabled); @@ -202,7 +201,8 @@ aura::Window* GetFrameWindow(); // View which contains the window controls. - ash::FrameCaptionButtonContainerView* caption_button_container_ = nullptr; + chromeos::FrameCaptionButtonContainerView* caption_button_container_ = + nullptr; // For popups, the window icon. TabIconView* window_icon_ = nullptr;
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc index 8475d73..814bb0b0d 100644 --- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
@@ -5,7 +5,6 @@ #include <string> #include "ash/public/cpp/ash_switches.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/frame_header.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h" @@ -74,6 +73,7 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/ui/base/chromeos_ui_constants.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "components/account_id/account_id.h" #include "components/autofill/core/common/password_form.h" #include "components/keep_alive_registry/keep_alive_types.h" @@ -462,7 +462,7 @@ static_cast<BrowserNonClientFrameViewAsh*>( widget->non_client_view()->frame_view()); - ash::FrameCaptionButtonContainerView::TestApi test( + chromeos::FrameCaptionButtonContainerView::TestApi test( frame_view->caption_button_container_); EXPECT_TRUE(test.size_button()->icon_definition_for_test()); } @@ -1242,7 +1242,7 @@ IN_PROC_BROWSER_TEST_P(WebAppNonClientFrameViewAshTest, ActiveStateOfButtonMatchesWidget) { SetUpWebApp(); - ash::FrameCaptionButtonContainerView::TestApi test( + chromeos::FrameCaptionButtonContainerView::TestApi test( GetFrameViewAsh(browser_view_)->caption_button_container_); EXPECT_TRUE(test.size_button()->paint_as_active()); EXPECT_TRUE(GetPaintingAsActive());
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 1b79877..2d18963b 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1412,7 +1412,7 @@ return GetLocationBarView(); } -void BrowserView::SetFocusToLocationBar(bool select_all) { +void BrowserView::SetFocusToLocationBar(bool is_user_initiated) { // On Windows, changing focus to the location bar causes the browser window to // become active. This can steal focus if the user has another window open // already. On Chrome OS, changing focus makes a view believe it has a focus @@ -1424,7 +1424,7 @@ #endif LocationBarView* location_bar = GetLocationBarView(); - location_bar->FocusLocation(select_all); + location_bar->FocusLocation(is_user_initiated); if (!location_bar->omnibox_view()->HasFocus()) { // If none of location bar got focus, then clear focus. views::FocusManager* focus_manager = GetFocusManager();
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index b0014a6..0f35ef7 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -388,7 +388,7 @@ autofill::AutofillBubbleHandler* GetAutofillBubbleHandler() override; void ExecutePageActionIconForTesting(PageActionIconType type) override; LocationBar* GetLocationBar() const override; - void SetFocusToLocationBar(bool select_all) override; + void SetFocusToLocationBar(bool is_user_initiated) override; void UpdateReloadStopState(bool is_loading, bool force) override; void UpdateToolbar(content::WebContents* contents) override; void UpdateCustomTabBarVisibility(bool visible, bool animate) override;
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc index 7ae902e..6a3e4574 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_ash_browsertest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller_test_api.h" #include "ash/public/cpp/test/shell_test_api.h" #include "base/macros.h" @@ -26,6 +25,7 @@ #include "chrome/common/web_application_info.h" #include "chrome/test/base/ui_test_utils.h" #include "chrome/test/permissions/permission_request_manager_test_api.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "content/public/test/browser_test.h" #include "content/public/test/content_mock_cert_verifier.h" #include "net/cert/mock_cert_verifier.h" @@ -272,9 +272,9 @@ BrowserNonClientFrameViewAsh* frame_view = static_cast<BrowserNonClientFrameViewAsh*>( browser_view->GetWidget()->non_client_view()->frame_view()); - ash::FrameCaptionButtonContainerView* caption_button_container = + chromeos::FrameCaptionButtonContainerView* caption_button_container = frame_view->caption_button_container_; - ash::FrameCaptionButtonContainerView::TestApi frame_test_api( + chromeos::FrameCaptionButtonContainerView::TestApi frame_test_api( caption_button_container); EXPECT_TRUE(frame_test_api.size_button()->GetVisible());
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc index 6e7d588..08df8c4 100644 --- a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc
@@ -124,7 +124,7 @@ // Otherwise, use a standard size for bubble dialogs. const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH); return gfx::Size(width, 1); }
diff --git a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc index 8ce01dc..9bf71829 100644 --- a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc +++ b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
@@ -78,7 +78,7 @@ gfx::Size ImportLockDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc index d05e075..493ef920 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -39,7 +39,7 @@ l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_HELP)); explanation_tooltip->set_bubble_width( ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); explanation_tooltip->set_anchor_point_arrow( views::BubbleBorder::Arrow::TOP_RIGHT); return explanation_tooltip;
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index c5859e3..07dd951 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -385,7 +385,20 @@ if (omnibox_already_focused) omnibox_view()->model()->ClearKeyword(); - if (is_user_initiated) + // If the user initiated the focus, then we always select-all, even if the + // omnibox is already focused. This can happen if the user pressed Ctrl+L + // while already typing in the omnibox. + // + // For renderer initiated focuses (like NTP or about:blank page load finish): + // - If the omnibox was not already focused, select-all. This handles the + // about:blank homepage case, where the location bar has initial focus. + // It annoys users if the URL is not pre-selected. https://crbug.com/45260. + // - If the omnibox is already focused, DO NOT select-all. This can happen + // if the user starts typing before the NTP finishes loading. If the NTP + // finishes loading and then does a renderer-initiated focus, performing + // a select-all here would surprisingly overwrite the user's first few + // typed characters. https://crbug.com/924935. + if (is_user_initiated || !omnibox_already_focused) omnibox_view_->SelectAll(true); }
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_view.cc index 8240178..9f713da 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
@@ -156,7 +156,7 @@ gfx::Size CastDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc index 8d4fe202..5ad486c 100644 --- a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc
@@ -74,7 +74,7 @@ gfx::Size CloudServicesDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc index a336cc66..72af70e 100644 --- a/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/media_remoting_dialog_view.cc
@@ -76,7 +76,7 @@ gfx::Size MediaRemotingDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc index 9ed4365..22ee96d 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_permission_view.cc
@@ -140,7 +140,7 @@ gfx::Size NativeFileSystemPermissionView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc index df9b07b3..7535771 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_restricted_directory_dialog_view.cc
@@ -55,7 +55,7 @@ gfx::Size NativeFileSystemRestrictedDirectoryDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc index a4b5846c..c1068bf1 100644 --- a/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc +++ b/chrome/browser/ui/views/native_file_system/native_file_system_usage_bubble_view.cc
@@ -466,7 +466,7 @@ gfx::Size NativeFileSystemUsageBubbleView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view.cc index 0705a8b..ef42644 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view.cc
@@ -428,7 +428,7 @@ return gfx::Size(); const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc index 0e22ad9..84e2b053 100644 --- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc +++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc
@@ -147,9 +147,9 @@ text_label->SetMultiLine(true); text_label->SetLineHeight(20); text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); - text_label->SizeToFit( - layout_provider->GetDistanceMetric(DISTANCE_BUBBLE_PREFERRED_WIDTH) - - insets.left() - insets.right()); + text_label->SizeToFit(layout_provider->GetDistanceMetric( + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - + insets.left() - insets.right()); bottom_layout->AddView(std::move(text_label)); // Add buttons. @@ -195,12 +195,12 @@ bottom_layout->StartRowWithPadding(views::GridLayout::kFixedSize, kColumnId, views::GridLayout::kFixedSize, spacing); - bottom_layout->AddView( - std::move(button_view), 1, 1, views::GridLayout::LEADING, - views::GridLayout::LEADING, - layout_provider->GetDistanceMetric(DISTANCE_BUBBLE_PREFERRED_WIDTH) - - insets.left() - insets.right(), - 0); + bottom_layout->AddView(std::move(button_view), 1, 1, + views::GridLayout::LEADING, views::GridLayout::LEADING, + layout_provider->GetDistanceMetric( + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - + insets.left() - insets.right(), + 0); bubble_layout->StartRow(views::GridLayout::kFixedSize, kColumnId); bubble_layout->AddView(std::move(bottom_view));
diff --git a/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc b/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc index 3e161fc..5d744af 100644 --- a/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.cc
@@ -73,7 +73,7 @@ gfx::Size AutoSigninFirstRunDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc index 0e7202a..3b3fce8d 100644 --- a/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/credential_leak_dialog_view.cc
@@ -44,7 +44,7 @@ password_manager::GetLeakDetectionTooltip()); explanation_tooltip->set_bubble_width( ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); explanation_tooltip->set_anchor_point_arrow( views::BubbleBorder::Arrow::TOP_RIGHT); return explanation_tooltip; @@ -112,7 +112,7 @@ gfx::Size CredentialLeakDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc b/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc index 288d9f5..8fd3ce1 100644 --- a/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc +++ b/chrome/browser/ui/views/passwords/move_to_account_store_bubble_view.cc
@@ -22,8 +22,11 @@ #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/favicon_size.h" +#include "ui/gfx/image/canvas_image_source.h" +#include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/gfx/text_constants.h" +#include "ui/gfx/vector_icon_types.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/color_tracking_icon_view.h" #include "ui/views/controls/label.h" @@ -34,54 +37,33 @@ namespace { -// The space between the right/bottom edge of the badge and the -// right/bottom edge of the main icon. -constexpr int kBadgeSpacing = 4; -constexpr int kBadgeBorderWidth = 2; constexpr int kImageSize = BadgedProfilePhoto::kImageSize; -// Width and Height of the badged icon. -constexpr int kBadgedProfilePhotoSize = kImageSize + kBadgeSpacing; -// An images view with an empty space for the badge. -class ImageViewWithPlaceForBadge : public views::ImageView { - // views::ImageView - void OnPaint(gfx::Canvas* canvas) override { - const int kBadgeIconSize = gfx::kFaviconSize; - // Remove the part of the ImageView that contains the badge. - SkPath mask; - mask.addCircle( - /*x=*/GetMirroredXInView(kBadgedProfilePhotoSize - kBadgeIconSize / 2), - /*y=*/kBadgedProfilePhotoSize - kBadgeIconSize / 2, - /*radius=*/kBadgeIconSize / 2 + kBadgeBorderWidth); - mask.toggleInverseFillType(); - canvas->ClipPath(mask, true); - ImageView::OnPaint(canvas); - } -}; - -// An image view that shows a vector icon and tracks changes in the theme. -class VectorIconView : public ImageViewWithPlaceForBadge { +// An image source that represent a filled circle of the given size and color. +class CircleImageSource : public gfx::CanvasImageSource { public: - explicit VectorIconView(const gfx::VectorIcon& icon, int size) - : icon_(icon), size_(size) {} + CircleImageSource(int size, SkColor color) + : gfx::CanvasImageSource(gfx::Size(size, size)), color_(color) {} + ~CircleImageSource() override = default; - // views::ImageView - void OnThemeChanged() override { - ImageView::OnThemeChanged(); - const SkColor color = GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_DefaultIconColor); - SetImage(gfx::CreateVectorIcon(icon_, size_, color)); - SizeToPreferredSize(); - } + void Draw(gfx::Canvas* canvas) override; private: - const gfx::VectorIcon& icon_; - const int size_; + SkColor color_; }; +void CircleImageSource::Draw(gfx::Canvas* canvas) { + float radius = size().width() / 2.0f; + cc::PaintFlags flags; + flags.setStyle(cc::PaintFlags::kFill_Style); + flags.setAntiAlias(true); + flags.setColor(color_); + canvas->DrawCircle(gfx::PointF(radius, radius), radius, flags); +} + // A class represting an image with a badge. By default, the image is the globe // icon. However, badge could be updated via the UpdateBadge() method. -class ImageWithBadge : public views::View { +class ImageWithBadge : public views::ImageView { public: // Constructs a View hierarchy with the a badge positioned in the bottom-right // corner of |main_image|. In RTL mode the badge is positioned in the @@ -90,52 +72,73 @@ explicit ImageWithBadge(const gfx::VectorIcon& main_image); ~ImageWithBadge() override = default; + // views::ImageView: + void OnThemeChanged() override; + void UpdateBadge(const gfx::ImageSkia& badge_image); private: - // Adds a default badge of "globe" icon. - void AddDefaultBadge(); + gfx::ImageSkia GetMainImage(); + gfx::ImageSkia GetBadge(); + void Render(); - views::ImageView* badge_view_; + const gfx::VectorIcon* main_vector_icon_ = nullptr; + base::Optional<gfx::ImageSkia> main_image_skia_; + base::Optional<gfx::ImageSkia> badge_image_skia_; }; -ImageWithBadge::ImageWithBadge(const gfx::ImageSkia& main_image) { - SetCanProcessEventsWithinSubtree(false); - auto main_view = std::make_unique<ImageViewWithPlaceForBadge>(); - main_view->SetImage(main_image); - main_view->SizeToPreferredSize(); - AddChildView(std::move(main_view)); - AddDefaultBadge(); -} +ImageWithBadge::ImageWithBadge(const gfx::ImageSkia& main_image) + : main_image_skia_(main_image) {} -ImageWithBadge::ImageWithBadge(const gfx::VectorIcon& main_image) { - SetCanProcessEventsWithinSubtree(false); - auto main_view = std::make_unique<VectorIconView>(main_image, kImageSize); - main_view->SizeToPreferredSize(); - AddChildView(std::move(main_view)); - AddDefaultBadge(); -} +ImageWithBadge::ImageWithBadge(const gfx::VectorIcon& main_image) + : main_vector_icon_(&main_image) {} -void ImageWithBadge::AddDefaultBadge() { - const int kBadgeIconSize = gfx::kFaviconSize; - // Use a Globe icon as the default badge. - auto badge_view = - std::make_unique<VectorIconView>(kGlobeIcon, kBadgeIconSize); - badge_view->SetPosition(gfx::Point(kBadgedProfilePhotoSize - kBadgeIconSize, - kBadgedProfilePhotoSize - kBadgeIconSize)); - badge_view->SizeToPreferredSize(); - badge_view_ = AddChildView(std::move(badge_view)); - - SetPreferredSize(gfx::Size(kBadgedProfilePhotoSize, kBadgedProfilePhotoSize)); +void ImageWithBadge::OnThemeChanged() { + ImageView::OnThemeChanged(); + Render(); } void ImageWithBadge::UpdateBadge(const gfx::ImageSkia& badge_image) { + badge_image_skia_ = badge_image; + Render(); +} + +gfx::ImageSkia ImageWithBadge::GetMainImage() { + if (main_image_skia_) + return main_image_skia_.value(); + DCHECK(main_vector_icon_); + const SkColor color = GetNativeTheme()->GetSystemColor( + ui::NativeTheme::kColorId_DefaultIconColor); + return gfx::CreateVectorIcon(*main_vector_icon_, kImageSize, color); +} + +gfx::ImageSkia ImageWithBadge::GetBadge() { + if (badge_image_skia_) + return badge_image_skia_.value(); + // If there is no badge set, fallback to the default globe icon. + const SkColor color = GetNativeTheme()->GetSystemColor( + ui::NativeTheme::kColorId_DefaultIconColor); + return gfx::CreateVectorIcon(kGlobeIcon, gfx::kFaviconSize, color); +} + +void ImageWithBadge::Render() { gfx::Image rounded_badge = profiles::GetSizedAvatarIcon( - gfx::Image(badge_image), + gfx::Image(GetBadge()), /*is_rectangle=*/true, /*width=*/gfx::kFaviconSize, /*height=*/gfx::kFaviconSize, profiles::SHAPE_CIRCLE); - badge_view_->SetImage(rounded_badge.ToImageSkia()); - badge_view_->SizeToPreferredSize(); + + gfx::ImageSkia badge_background = + gfx::CanvasImageSource::MakeImageSkia<CircleImageSource>( + gfx::kFaviconSize, GetNativeTheme()->GetSystemColor( + ui::NativeTheme::kColorId_BubbleBackground)); + + gfx::ImageSkia rounded_badge_with_background = + gfx::ImageSkiaOperations::CreateSuperimposedImage( + badge_background, *rounded_badge.ToImageSkia()); + + gfx::ImageSkia badged_image = gfx::ImageSkiaOperations::CreateIconWithBadge( + GetMainImage(), rounded_badge_with_background); + SetImage(badged_image); } std::unique_ptr<views::View> CreateHeaderImage(int image_id) { @@ -147,7 +150,7 @@ preferred_size = gfx::ScaleToRoundedSize( preferred_size, static_cast<float>(ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)) / + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)) / preferred_size.width()); image_view->SetImageSize(preferred_size); } @@ -286,7 +289,7 @@ gfx::Size MoveToAccountStoreBubbleView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc index c1b1fac..d3d345b 100644 --- a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc +++ b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc
@@ -86,7 +86,7 @@ gfx::Size PasswordAutoSignInView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc b/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc index a0b4e5d..6d8b940 100644 --- a/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc +++ b/chrome/browser/ui/views/passwords/password_generation_confirmation_view.cc
@@ -73,7 +73,7 @@ gfx::Size PasswordGenerationConfirmationView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/password_items_view.cc b/chrome/browser/ui/views/passwords/password_items_view.cc index 7cc9a4f..09348ab 100644 --- a/chrome/browser/ui/views/passwords/password_items_view.cc +++ b/chrome/browser/ui/views/passwords/password_items_view.cc
@@ -409,7 +409,7 @@ gfx::Size PasswordItemsView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc index 09c47f22..65a05e4 100644 --- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
@@ -128,7 +128,7 @@ gfx::Size PasswordSaveUnsyncedCredentialsLocallyView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc index 7e5762a4..248b2cc 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -234,7 +234,7 @@ if (preferred_size.width()) { float scale = static_cast<float>(ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)) / + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)) / preferred_size.width(); preferred_size = gfx::ScaleToRoundedSize(preferred_size, scale); image_view->SetImageSize(preferred_size); @@ -348,7 +348,7 @@ gfx::Size PasswordSaveUpdateView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc index b97b558..b0b8a88 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_with_account_store_view.cc
@@ -305,7 +305,7 @@ if (preferred_size.width()) { float scale = static_cast<float>(ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)) / + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)) / preferred_size.width(); preferred_size = gfx::ScaleToRoundedSize(preferred_size, scale); image_view->SetImageSize(preferred_size); @@ -568,7 +568,7 @@ gfx::Size PasswordSaveUpdateWithAccountStoreView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/passwords/post_save_compromised_bubble_view.cc b/chrome/browser/ui/views/passwords/post_save_compromised_bubble_view.cc index a96ed262..e879011 100644 --- a/chrome/browser/ui/views/passwords/post_save_compromised_bubble_view.cc +++ b/chrome/browser/ui/views/passwords/post_save_compromised_bubble_view.cc
@@ -65,7 +65,7 @@ gfx::Size PostSaveCompromisedBubbleView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.cc b/chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.cc index 39e3933d..7f9e3ff7 100644 --- a/chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.cc +++ b/chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.cc
@@ -211,7 +211,7 @@ std::unique_ptr<views::View> SecurePaymentConfirmationDialogView::CreateHeaderView() { const int header_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); const gfx::Size header_size(header_width, kHeaderIconHeight); // The container view has no layout, so its preferred size is hardcoded to
diff --git a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc index e6551fc..48e2788 100644 --- a/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc +++ b/chrome/browser/ui/views/permission_bubble/permission_prompt_bubble_view.cc
@@ -246,7 +246,7 @@ gfx::Size PermissionPromptBubbleView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc index 384a466..12c2918e 100644 --- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc +++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.cc
@@ -212,10 +212,6 @@ } bool PluginVmInstallerView::Cancel() { - // We call |Cancel()| if the user hasn't started installation to log to UMA. - if (state_ == State::kConfirmInstall || state_ == State::kInstalling) - plugin_vm_installer_->Cancel(); - return true; } @@ -435,6 +431,9 @@ PluginVmInstallerView::~PluginVmInstallerView() { plugin_vm_installer_->RemoveObserver(); + // We call |Cancel()| if the user hasn't started installation to log to UMA. + if (state_ == State::kConfirmInstall || state_ == State::kInstalling) + plugin_vm_installer_->Cancel(); g_plugin_vm_installer_view = nullptr; } @@ -584,5 +583,8 @@ OnStateUpdated(); plugin_vm_installer_->SetObserver(this); - plugin_vm_installer_->Start(); + base::Optional<plugin_vm::PluginVmInstaller::FailureReason> failure_reason = + plugin_vm_installer_->Start(); + if (failure_reason) + OnError(failure_reason.value()); }
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc index b69dd94a..987098f3 100644 --- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc +++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
@@ -269,7 +269,7 @@ views::ColumnSet* column_set_textfield = layout->AddColumnSet(kTextFieldColumnSetId); int textfield_min_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - insets.left() - insets.right(); column_set_textfield->AddColumn( views::GridLayout::FILL, // Fill text field horizontally. @@ -340,7 +340,7 @@ auto tooltip_icon = std::make_unique<views::TooltipIcon>( l10n_util::GetStringUTF16(IDS_BROWSER_SHARING_QR_CODE_DIALOG_TOOLTIP)); tooltip_icon->set_bubble_width(ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH)); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH)); tooltip_icon->set_anchor_point_arrow( views::BubbleBorder::Arrow::BOTTOM_RIGHT); tooltip_icon_ = layout->AddView(std::move(tooltip_icon));
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc index 901b2904..ce32f02 100644 --- a/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc +++ b/chrome/browser/ui/views/relaunch_notification/relaunch_recommended_bubble_view.cc
@@ -119,7 +119,7 @@ gfx::Size RelaunchRecommendedBubbleView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH) - + views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc b/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc index eb8da15..034d9cb9 100644 --- a/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc +++ b/chrome/browser/ui/views/relaunch_notification/relaunch_required_dialog_view.cc
@@ -80,7 +80,7 @@ gfx::Size RelaunchRequiredDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc index 578fb5cb..5c8ced4 100644 --- a/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc +++ b/chrome/browser/ui/views/send_tab_to_self/send_tab_to_self_bubble_view_impl.cc
@@ -78,7 +78,7 @@ gfx::Size SendTabToSelfBubbleViewImpl::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/settings_reset_prompt_dialog.cc b/chrome/browser/ui/views/settings_reset_prompt_dialog.cc index 765e66a6..7051231d 100644 --- a/chrome/browser/ui/views/settings_reset_prompt_dialog.cc +++ b/chrome/browser/ui/views/settings_reset_prompt_dialog.cc
@@ -115,7 +115,7 @@ gfx::Size SettingsResetPromptDialog::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc index 00a59494..5ecef2e 100644 --- a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc +++ b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
@@ -160,7 +160,7 @@ gfx::Size SharingDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); } @@ -310,7 +310,7 @@ constexpr size_t kMaxDialogButtons = 5; if (dialog_buttons_.size() > kMaxDialogButtons) { const int bubble_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_BUBBLE_PREFERRED_WIDTH); + views::DISTANCE_BUBBLE_PREFERRED_WIDTH); int max_list_height = 0; for (size_t i = 0; i < kMaxDialogButtons; ++i)
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc index 7bf7e99..1c0d643 100644 --- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc +++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
@@ -120,8 +120,7 @@ text_label->SetLineHeight(20); text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); text_label->SizeToFit( - provider->GetDistanceMetric( - ChromeDistanceMetric::DISTANCE_BUBBLE_PREFERRED_WIDTH) - + provider->GetDistanceMetric(views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - margins().width()); AddChildView(std::move(text_label)); }
diff --git a/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog_view.cc b/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog_view.cc index facbdc22..c89a5ae3 100644 --- a/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog_view.cc +++ b/chrome/browser/ui/views/supervised_user/extension_install_blocked_by_parent_dialog_view.cc
@@ -81,7 +81,7 @@ gfx::Size ExtensionInstallBlockedByParentDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc index d66915d..b8d6b346 100644 --- a/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc +++ b/chrome/browser/ui/views/supervised_user/parent_permission_dialog_view.cc
@@ -315,7 +315,7 @@ gfx::Size ParentPermissionDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc index 7ef3a3b..a58d15a1 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_actions_bar_bubble_views.cc
@@ -167,9 +167,9 @@ views::BoxLayout::Orientation::kVertical, gfx::Insets(), provider->GetDistanceMetric(views::DISTANCE_RELATED_CONTROL_VERTICAL))); - int width = provider->GetDistanceMetric( - ChromeDistanceMetric::DISTANCE_BUBBLE_PREFERRED_WIDTH) - - margins().width(); + int width = + provider->GetDistanceMetric(views::DISTANCE_BUBBLE_PREFERRED_WIDTH) - + margins().width(); if (!body_text_string.empty()) { body_text_ = new views::Label(body_text_string);
diff --git a/chrome/browser/ui/views/update_recommended_message_box.cc b/chrome/browser/ui/views/update_recommended_message_box.cc index b5ef119..01fe7b4 100644 --- a/chrome/browser/ui/views/update_recommended_message_box.cc +++ b/chrome/browser/ui/views/update_recommended_message_box.cc
@@ -53,7 +53,7 @@ message_box_view_ = new views::MessageBoxView(update_message); message_box_view_->SetMessageWidth( ChromeLayoutProvider::Get()->GetDistanceMetric( - ChromeDistanceMetric::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH)); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH)); chrome::RecordDialogCreation(chrome::DialogIdentifier::UPDATE_RECOMMENDED); }
diff --git a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc index 42c79d3f..105eb1a8 100644 --- a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc +++ b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
@@ -145,7 +145,7 @@ gfx::Size WebAppUninstallDialogDelegateView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc index 81a7434..ffff849 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -151,7 +151,7 @@ gfx::Size AuthenticatorRequestDialogView::CalculatePreferredSize() const { const int width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc index 77888c70..33d18ed 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
@@ -75,7 +75,7 @@ std::unique_ptr<views::View> AuthenticatorRequestSheetView::CreateIllustrationWithOverlays() { const int illustration_width = ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); + views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); const gfx::Size illustration_size(illustration_width, kIllustrationHeight); // The container view has no layout, so its preferred size is hardcoded to
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 501c78d..14097f4 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -733,6 +733,17 @@ signin_screen_handler_->SetDelegate(nullptr); } +gfx::NativeView OobeUI::GetNativeView() { + return web_ui()->GetWebContents()->GetNativeView(); +} + +gfx::NativeWindow OobeUI::GetTopLevelNativeWindow() { + return web_ui()->GetWebContents()->GetTopLevelNativeWindow(); +} + +gfx::Size OobeUI::GetViewSize() { + return web_ui()->GetWebContents()->GetSize(); +} void OobeUI::AddObserver(Observer* observer) { observer_list_.AddObserver(observer);
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h index 676a0c4a..4fd19989 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -94,6 +94,12 @@ // Resets the delegate set in ShowSigninScreen. void ResetSigninScreenHandlerDelegate(); + gfx::NativeView GetNativeView(); + + gfx::NativeWindow GetTopLevelNativeWindow(); + + gfx::Size GetViewSize(); + // Add and remove observers for screen change events. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer);
diff --git a/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc b/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc index cca6f77..7ab9cbe 100644 --- a/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc +++ b/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.cc
@@ -114,7 +114,7 @@ case session_manager::SessionState::LOGIN_PRIMARY: case session_manager::SessionState::LOCKED: case session_manager::SessionState::LOGIN_SECONDARY: - modal_type_ = ui::MODAL_TYPE_SYSTEM; + set_modal_type(ui::MODAL_TYPE_SYSTEM); break; } GetInstances()->push_back(this);
diff --git a/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h b/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h index 865950b..4a20108d 100644 --- a/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h +++ b/chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h
@@ -104,6 +104,9 @@ // |nullptr| if the dialog has not been created yet. gfx::NativeWindow dialog_window() const { return dialog_window_; } + // A setter for modal type. + void set_modal_type(ui::ModalType modal_type) { modal_type_ = modal_type; } + private: GURL gurl_; base::string16 title_;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc index 9b94726..e75f301 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -466,16 +466,10 @@ content::WebUIDataSource* CreatePrintPreviewUISource(Profile* profile) { content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUIPrintHost); -#if BUILDFLAG(OPTIMIZE_WEBUI) - webui::SetupBundledWebUIDataSource(source, "print_preview.js", - IDR_PRINT_PREVIEW_PRINT_PREVIEW_ROLLUP_JS, - IDR_PRINT_PREVIEW_PRINT_PREVIEW_HTML); -#else webui::SetupWebUIDataSource( source, base::make_span(kPrintPreviewResources, kPrintPreviewResourcesSize), "", IDR_PRINT_PREVIEW_PRINT_PREVIEW_HTML); -#endif AddPrintPreviewStrings(source); SetupPrintPreviewPlugin(source); AddPrintPreviewFlags(source, profile);
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc index c41be39b..b527b83 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc +++ b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
@@ -10,12 +10,14 @@ #include "ash/public/cpp/window_backdrop.h" #include "ash/public/cpp/window_properties.h" #include "base/check_op.h" +#include "base/feature_list.h" #include "base/json/json_writer.h" #include "base/macros.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/supervised_user/supervised_user_features.h" #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h" @@ -42,9 +44,6 @@ constexpr int kSigninDialogWidth = 768; constexpr int kSigninDialogHeight = 640; -constexpr char kAccountAdditionSource[] = - "AccountManager.AccountAdditionSource"; - // Keep in sync with resources/chromeos/account_manager_error.js enum class AccountManagerErrorType { kSecondaryAccountsDisabled = 0, @@ -95,6 +94,10 @@ } // namespace // static +const char InlineLoginDialogChromeOS::kAccountAdditionSource[] = + "AccountManager.AccountAdditionSource"; + +// static void InlineLoginDialogChromeOS::Show(const std::string& email, const Source& source) { base::UmaHistogramEnumeration(kAccountAdditionSource, source); @@ -166,12 +169,19 @@ edu_coexistence_flow_result_ = result; } +InlineLoginDialogChromeOS::InlineLoginDialogChromeOS(const Source& source) + : InlineLoginDialogChromeOS(GetInlineLoginUrl(std::string(), source), + source) {} + InlineLoginDialogChromeOS::InlineLoginDialogChromeOS(const GURL& url, const Source& source) : SystemWebDialogDelegate(url, base::string16() /* title */), delegate_(this), source_(source), - url_(url) {} + url_(url) { + DCHECK(!dialog); + dialog = this; +} InlineLoginDialogChromeOS::~InlineLoginDialogChromeOS() { DCHECK_EQ(this, dialog); @@ -221,7 +231,8 @@ } void InlineLoginDialogChromeOS::OnDialogClosed(const std::string& json_retval) { - if (ProfileManager::GetActiveUserProfile()->IsChild()) { + if (ProfileManager::GetActiveUserProfile()->IsChild() && + !base::FeatureList::IsEnabled(supervised_users::kEduCoexistenceFlowV2)) { DCHECK(edu_coexistence_flow_result_.has_value()); base::UmaHistogramEnumeration("AccountManager.EduCoexistence.FlowResult", edu_coexistence_flow_result_.value());
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h index 73daeba..a4b3e12a 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h +++ b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h
@@ -23,6 +23,8 @@ class InlineLoginDialogChromeOS : public SystemWebDialogDelegate, public web_modal::WebContentsModalDialogHost { public: + static const char kAccountAdditionSource[]; + // The source UX surface used for launching the account addition / // re-authentication dialog. This should be as specific as possible. // These values are persisted to logs. Entries should not be renumbered and @@ -43,8 +45,10 @@ kPrintPreviewDialog = 4, // Account Manager migration welcome screen. kAccountManagerMigrationWelcomeScreen = 5, + // Onboarding. + kOnboarding = 6, - kMaxValue = kAccountManagerMigrationWelcomeScreen + kMaxValue = kOnboarding }; // Represents the last reached step in the flow. @@ -87,6 +91,7 @@ void SetEduCoexistenceFlowResult(EduCoexistenceFlowResult result); protected: + explicit InlineLoginDialogChromeOS(const Source& source); InlineLoginDialogChromeOS(const GURL& url, const Source& source); ~InlineLoginDialogChromeOS() override;
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc new file mode 100644 index 0000000..e4cc491 --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc
@@ -0,0 +1,122 @@ +// Copyright 2020 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. + +#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" + +#include "base/feature_list.h" +#include "base/metrics/histogram_functions.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/supervised_user/supervised_user_features.h" +#include "ui/aura/window.h" +#include "ui/gfx/geometry/size.h" +#include "ui/views/widget/widget.h" + +namespace chromeos { + +InlineLoginDialogChromeOSOnboarding::Delegate::Delegate( + InlineLoginDialogChromeOSOnboarding* dialog) + : dialog_(dialog) { + widget_ = views::Widget::GetWidgetForNativeView(dialog->GetHostView()); + widget_->AddObserver(this); +} + +InlineLoginDialogChromeOSOnboarding::Delegate::~Delegate() { + if (widget_) { + widget_->RemoveObserver(this); + } + + CloseWithoutCallback(); +} + +void InlineLoginDialogChromeOSOnboarding::Delegate::CloseWithoutCallback() { + if (dialog_) { + dialog_->dialog_closed_callback_.Reset(); + dialog_->Close(); + } +} + +void InlineLoginDialogChromeOSOnboarding::Delegate::Close() { + if (dialog_) { + dialog_->Close(); + } +} + +void InlineLoginDialogChromeOSOnboarding::Delegate::UpdateDialogBounds( + const gfx::Rect& new_bounds) { + if (dialog_) { + dialog_->UpdateDialogBounds(new_bounds); + } +} + +void InlineLoginDialogChromeOSOnboarding::Delegate::OnWidgetClosing( + views::Widget* widget) { + if (!dialog_ || widget != widget_) { + return; + } + + widget->RemoveObserver(this); + widget_ = nullptr; + dialog_ = nullptr; +} + +// static +InlineLoginDialogChromeOSOnboarding* InlineLoginDialogChromeOSOnboarding::Show( + const gfx::Size& size, + gfx::NativeWindow window, + base::OnceCallback<void(void)> dialog_closed_callback) { + DCHECK(ProfileManager::GetActiveUserProfile()->IsChild()); + DCHECK(base::FeatureList::IsEnabled(supervised_users::kEduCoexistenceFlowV2)); + + base::UmaHistogramEnumeration( + InlineLoginDialogChromeOS::kAccountAdditionSource, + InlineLoginDialogChromeOS::Source::kOnboarding); + + DCHECK(window); + + auto* dialog = new InlineLoginDialogChromeOSOnboarding( + size, std::move(dialog_closed_callback)); + dialog->ShowSystemDialog(window); + + return dialog; +} + +InlineLoginDialogChromeOSOnboarding::InlineLoginDialogChromeOSOnboarding( + const gfx::Size& size, + base::OnceCallback<void(void)> dialog_closed_callback) + : InlineLoginDialogChromeOS(InlineLoginDialogChromeOS::Source::kOnboarding), + size_(size), + dialog_closed_callback_(std::move(dialog_closed_callback)) { + set_modal_type(ui::MODAL_TYPE_CHILD); +} + +InlineLoginDialogChromeOSOnboarding::~InlineLoginDialogChromeOSOnboarding() = + default; + +void InlineLoginDialogChromeOSOnboarding::UpdateDialogBounds( + const gfx::Rect& bounds) { + size_ = bounds.size(); + dialog_window()->SetBounds(bounds); +} + +void InlineLoginDialogChromeOSOnboarding::GetDialogSize(gfx::Size* size) const { + *size = size_; +} + +void InlineLoginDialogChromeOSOnboarding::AdjustWidgetInitParams( + views::Widget::InitParams* params) { + InlineLoginDialogChromeOS::AdjustWidgetInitParams(params); + params->type = views::Widget::InitParams::Type::TYPE_WINDOW_FRAMELESS; +} + +void InlineLoginDialogChromeOSOnboarding::OnDialogClosed( + const std::string& json_retval) { + if (dialog_closed_callback_) { + std::move(dialog_closed_callback_).Run(); + } + + InlineLoginDialogChromeOS::OnDialogClosed(json_retval); +} + +} // namespace chromeos
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h new file mode 100644 index 0000000..1a69897 --- /dev/null +++ b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h
@@ -0,0 +1,83 @@ +// Copyright 2020 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 CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ + +#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" + +#include "base/callback.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/native_widget_types.h" +#include "ui/views/widget/widget_observer.h" + +namespace views { +class Widget; +} // namespace views + +namespace gfx { +class Rect; +} // namespace gfx + +namespace chromeos { + +// Inherits from InlineLoginDialogChromeOS to handle the special scenario where +// the dialog is shown during onboarding. +class InlineLoginDialogChromeOSOnboarding : public InlineLoginDialogChromeOS { + public: + class Delegate : public views::WidgetObserver { + public: + explicit Delegate(InlineLoginDialogChromeOSOnboarding* dialog); + Delegate(const Delegate&) = delete; + Delegate& operator=(const Delegate&) = delete; + ~Delegate() override; + + // Closes the dialog without making it executing the callback. + void CloseWithoutCallback(); + + void Close(); + + void UpdateDialogBounds(const gfx::Rect& new_bounds); + + InlineLoginDialogChromeOSOnboarding* dialog() { return dialog_; } + + private: + // views::WidgetObserver: + void OnWidgetClosing(views::Widget* widget) override; + + InlineLoginDialogChromeOSOnboarding* dialog_ = nullptr; + views::Widget* widget_ = nullptr; + }; + + static InlineLoginDialogChromeOSOnboarding* Show( + const gfx::Size& size, + gfx::NativeWindow window, + base::OnceCallback<void(void)> dialog_closed_callback); + + private: + InlineLoginDialogChromeOSOnboarding( + const gfx::Size& bounds, + base::OnceCallback<void(void)> dialog_closed_callback); + ~InlineLoginDialogChromeOSOnboarding() override; + + InlineLoginDialogChromeOSOnboarding( + const InlineLoginDialogChromeOSOnboarding&) = delete; + InlineLoginDialogChromeOSOnboarding& operator=( + const InlineLoginDialogChromeOSOnboarding&) = delete; + + void UpdateDialogBounds(const gfx::Rect& bounds); + + void CloseDialog(); + + void GetDialogSize(gfx::Size* size) const override; + void AdjustWidgetInitParams(views::Widget::InitParams* params) override; + void OnDialogClosed(const std::string& json_retval) override; + + gfx::Size size_; + base::OnceCallback<void(void)> dialog_closed_callback_; +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_
diff --git a/chrome/browser/web_applications/test/web_app_test.cc b/chrome/browser/web_applications/test/web_app_test.cc index 855fb63..76241a7 100644 --- a/chrome/browser/web_applications/test/web_app_test.cc +++ b/chrome/browser/web_applications/test/web_app_test.cc
@@ -9,16 +9,6 @@ namespace web_app { -std::string ProviderTypeParamToString( - const ::testing::TestParamInfo<ProviderType>& provider_type) { - switch (provider_type.param) { - case ProviderType::kBookmarkApps: - return "BookmarkApps"; - case ProviderType::kWebApps: - return "WebApps"; - } -} - void TestAcceptDialogCallback( content::WebContents* initiator_web_contents, std::unique_ptr<WebApplicationInfo> web_app_info,
diff --git a/chrome/browser/web_applications/test/web_app_test.h b/chrome/browser/web_applications/test/web_app_test.h index c3f41bc..01d9ca8 100644 --- a/chrome/browser/web_applications/test/web_app_test.h +++ b/chrome/browser/web_applications/test/web_app_test.h
@@ -20,11 +20,6 @@ namespace web_app { -enum class ProviderType { kBookmarkApps, kWebApps }; - -std::string ProviderTypeParamToString( - const ::testing::TestParamInfo<ProviderType>& provider_type); - void TestAcceptDialogCallback( content::WebContents* initiator_web_contents, std::unique_ptr<WebApplicationInfo> web_app_info,
diff --git a/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider.java b/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider.java index 07224af..99ff909 100644 --- a/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider.java +++ b/chrome/browser/webauthn/android/java/src/org/chromium/chrome/browser/webauthn/CableAuthenticatorModuleProvider.java
@@ -37,10 +37,8 @@ "org.chromium.chrome.modules.cablev2_authenticator.NetworkContext"; private static final String INSTANCE_ID_DRIVER_KEY = "org.chromium.chrome.modules.cablev2_authenticator.InstanceIDDriver"; - private static final String SETTINGS_ACTIVITY_CLASS_NAME = - "org.chromium.chrome.modules.cablev2_authenticator.SettingsActivityClassName"; - private static final String WRAPPER_CLASS_NAME = - "org.chromium.chrome.modules.cablev2_authenticator.WrapperClassName"; + private static final String ACTIVITY_CLASS_NAME = + "org.chromium.chrome.modules.cablev2_authenticator.ActivityClassName"; private TextView mStatus; @Override @@ -100,10 +98,8 @@ // top-level Activity in order to handle USB devices. For now, though, // it serves for testing. // TODO(agl): replace with custom top-level Activity. - arguments.putString(SETTINGS_ACTIVITY_CLASS_NAME, - "org.chromium.chrome.browser.settings.SettingsActivity"); - arguments.putString( - WRAPPER_CLASS_NAME, CableAuthenticatorModuleProvider.class.getCanonicalName()); + arguments.putString(ACTIVITY_CLASS_NAME, + "org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity"); fragment.setArguments(arguments); transaction.replace(getId(), fragment); // This fragment is deliberately not added to the back-stack here so
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index fcf16789..4774df4f 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1602503558-6db36755351afd56b86dda41eeed03adf268112f.profdata +chrome-linux-master-1602525418-afe56390c440c08698d6b71f1c497e873e6a051a.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 3db56c1..b60a9e2 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-master-1602503558-f6db874387e2078784a354d0f7c8c59a21bebaa6.profdata +chrome-mac-master-1602525418-295b1a16e5c5eb1a611980e5afdf689a2be9286a.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index bf743e7..d385559 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1602482293-b6c9af61d9b709e1e409c88a2a609d5546a5c2ce.profdata +chrome-win64-master-1602503558-c2e745b5a37c8ee5f138ede7ee7fff767428f64a.profdata
diff --git a/chrome/common/apps/platform_apps/api/media_galleries.idl b/chrome/common/apps/platform_apps/api/media_galleries.idl index ebbb1f35..11be1f7 100644 --- a/chrome/common/apps/platform_apps/api/media_galleries.idl +++ b/chrome/common/apps/platform_apps/api/media_galleries.idl
@@ -34,18 +34,6 @@ mimeTypeOnly }; - [nodefine, inline_doc] enum ScanProgressType { - // The scan started. - start, - // The scan was cancelled. - cancel, - // The scan finished but none of the result have been added, - // addScanResults() has to be called to ask the user for permission. - finish, - // The scan encountered an error and could not proceed. - error - }; - [inline_doc] dictionary GalleryChangeDetails { // Type of change event. GalleryChangeType type; @@ -76,8 +64,6 @@ void ([instanceOf=DOMFileSystem] object[] mediaFileSystems, DOMString selectedFileSystemName); - [nodefine] callback DropPermissionForMediaFileSystemCallback = void (); - [inline_doc] dictionary MediaFileSystemMetadata { // The name of the file system. DOMString name; @@ -100,20 +86,6 @@ boolean isAvailable; }; - [nodefine, inline_doc] dictionary ScanProgressDetails { - // The type of progress event, i.e. start, finish, etc. - ScanProgressType type; - - // The number of Galleries found. - long? galleryCount; - - // Appoximate number of media files found; some file types can be either - // audio or video and are included in both counts. - long? audioCount; - long? imageCount; - long? videoCount; - }; - callback MediaFileSystemsMetadataCallback = void (MediaFileSystemMetadata[] metadata); @@ -168,8 +140,6 @@ }; callback AddGalleryWatchCallback = void (AddGalleryWatchResult result); - [nodefine] callback GetAllGalleryWatchCallback = - void (DOMString[] galleryIds); interface Functions { // Get the media galleries configured in this user agent. If none are @@ -184,41 +154,10 @@ // gesture, the callback will run as though the user canceled. static void addUserSelectedFolder(AddUserFolderCallback callback); - // Give up access to a given media gallery. - [nodefine, deprecated="The user can manually drop access to galleries - via the permissions dialog."] - static void dropPermissionForMediaFileSystem( - DOMString galleryId, - optional DropPermissionForMediaFileSystemCallback callback); - - // Start a scan of the user's hard disks for directories containing media. - // The scan may take a long time so progress and completion is communicated - // by events. No permission is granted as a result of the scan, see - // addScanResults. - [nodefine, deprecated="The mediaGalleries API no longer supports scanning."] - static void startMediaScan(); - - // Cancel any pending media scan. Well behaved apps should provide a way - // for the user to cancel scans they start. - [nodefine, deprecated="The mediaGalleries API no longer supports scanning."] - static void cancelMediaScan(); - - // Show the user the scan results and let them add any or all of them as - // galleries. This should be used after the 'finish' onScanProgress() - // event has happened. All galleries the app has access to are returned, not - // just the newly added galleries. - [nodefine, deprecated="The mediaGalleries API no longer supports scanning."] - static void addScanResults(MediaFileSystemsCallback callback); - // Get metadata about a specific media file system. [nocompile] static MediaFileSystemMetadata getMediaFileSystemMetadata( [instanceOf=DOMFileSystem] object mediaFileSystem); - // Get metadata for all available media galleries. - [nodefine, deprecated="Use getMediaFileSystemMetadata instead."] - static void getAllMediaFileSystemMetadata( - MediaFileSystemsMetadataCallback callback); - // Gets the media-specific metadata for a media file. This should work // for files in media galleries as well as other DOM filesystems. static void getMetadata([instanceOf=Blob] object mediaFile, @@ -232,24 +171,10 @@ // Removes a gallery watch for the gallery with the specified gallery ID. static void removeGalleryWatch(DOMString galleryId); - - // Notifies which galleries are being watched via the given callback. - [nodefine, deprecated="Applications should store their own gallery watches - as they are added."] - static void getAllGalleryWatch(GetAllGalleryWatchCallback callback); - - // Removes all gallery watches. - [nodefine, deprecated="Use removeGalleryWatch instead."] - static void removeAllGalleryWatch(); }; interface Events { // Fired when a media gallery is changed or a gallery watch is dropped. static void onGalleryChanged(GalleryChangeDetails details); - - // The pending media scan has changed state. See details for more - // information. - [nodefine, deprecated="The mediaGalleries API no longer supports scanning."] - static void onScanProgress(ScanProgressDetails details); }; };
diff --git a/chrome/common/extensions/api/idltest.idl b/chrome/common/extensions/api/idltest.idl index 03b21d4b..d0c0966f 100644 --- a/chrome/common/extensions/api/idltest.idl +++ b/chrome/common/extensions/api/idltest.idl
@@ -26,11 +26,6 @@ // |switch| should cause compile errors if it does). But the name should // get defined and made visible from within extensions/apps code. [nocompile] static void nocompileFunc(long switch); - - // This function should not have C++ code autogenerated (the variable name - // |switch| should cause compile errors if it does). The name should also - // never be defined in Javascript and invisible to extensions/apps code. - [nodefine] static void nodefineFunc(long switch); }; };
diff --git a/chrome/common/extensions/docs/static/images/networking_config_badge.png b/chrome/common/extensions/docs/static/images/networking_config_badge.png deleted file mode 100644 index 8bfa5f9..0000000 --- a/chrome/common/extensions/docs/static/images/networking_config_badge.png +++ /dev/null Binary files differ
diff --git a/chrome/common/extensions/docs/static/images/networking_config_notification.png b/chrome/common/extensions/docs/static/images/networking_config_notification.png deleted file mode 100644 index 79e1dcbc..0000000 --- a/chrome/common/extensions/docs/static/images/networking_config_notification.png +++ /dev/null Binary files differ
diff --git a/chrome/common/extensions/docs/templates/articles/networking_config.html b/chrome/common/extensions/docs/templates/articles/networking_config.html new file mode 100644 index 0000000..0a64bd3 --- /dev/null +++ b/chrome/common/extensions/docs/templates/articles/networking_config.html
@@ -0,0 +1,5 @@ +<h1>chrome.networking.config</h1> + +<p> + The <code>chrome.networking.config</code> API is no longer supported. +</p>
diff --git a/chrome/common/extensions/docs/templates/intros/networking_config.html b/chrome/common/extensions/docs/templates/intros/networking_config.html deleted file mode 100644 index 95071a2..0000000 --- a/chrome/common/extensions/docs/templates/intros/networking_config.html +++ /dev/null
@@ -1,83 +0,0 @@ -<h2 id="usage">Implementing a Captive Portal Authenticator</h2> -This API allows an Extension to implement an authenticator for captive portals. -The interaction between Extension, Chrome, and the user will be: -<ol> - <li>Using $(ref:setNetworkFilter), the Extension registers for a list of Wi-Fi - networks that it wants to handle captive portals on.</li> - <li>If one of these networks is detected by Chrome, it will appear in the - network list, badged with an icon to indicate that a captive portal handler is - available. - <p> - <img src="{{static}}/images/networking_config_badge.png" - align="middle" width="301" height="305" alt="Badge icon in tray network list" /> - </li> - <li>If the user selects such a network, but a captive portal is not detected, - Chrome will connect as usual - the Extension will never be involved.</li> - <li>Otherwise, if a captive portal is detected, the user is notified and asked - to authenticate using the registered Extension or whether to visit the captive - portal page. - <p> - <img src="{{static}}/images/networking_config_notification.png" - align="middle" width="367" height="224" alt="Captive portal notification" /> - </li> - <li>If the user selects the Extension, Chrome notifies the Extension through - the $(ref:onCaptivePortalDetected) event.</li> - <li>The Extension should now interact with the user if necessary and - authenticate at the captive portal.</li> - <li>Once the Extension finished the authentication, it notifies the API using - $(ref:finishAuthentication) about its success or failure.</li> -</ol> - -<p> -In the Extension, this can look similar to the following snippet: -</p> - -<pre data-filename="background.js"> -var myNetworks = [ - { Type: 'WiFi', SSID: 'MyHotSpot-1' }, - { Type: 'WiFi', SSID: 'MyHotSpot-2' } -]; - -chrome.networking.config.setNetworkFilter(myNetworks, function() { - if (chrome.runtime.lastError) { - // Handle Error - } -}); - -chrome.networking.config.onCaptivePortalDetected.addListener( - function(networkInfo) { - var guid = networkInfo.GUID; - - // Check at first whether we really care about this network. - // This can look at additional network properties like BSSID that are not - // supported in the filter. - if (isBadNetwork(networkInfo)) { - chrome.networking.config.finishAuthentication(guid, 'unhandled'); - return; - } - checkForMyCaptivePortalServer(function(serverStatus) { - if (serverStatus == 'not-detected') { - chrome.networking.config.finishAuthentication(guid, 'unhandled'); - return; - } - if (serverStatus == 'error') { - chrome.networking.config.finishAuthentication(guid, 'failed'); - return; - } - - // If required, interact with the user, e.g. for registration on first - // usage. Credentials can be cached for subsequent authentications. - ShowUIToRegisterUser(continueAuthentication.bind(null, guid)); - }); -}); - -function continueAuthentication(guid, credentials) { - if (!credentials) { - chrome.networking.config.finishAuthentication(guid, 'failed'); - } - AuthenticateToMyCaptivePortalServer(credentials, function(success) { - chrome.networking.config.finishAuthentication( - guid, success ? 'succeeded' : 'rejected'); - }); -} -</pre>
diff --git a/chrome/common/extensions/docs/templates/public/extensions/networking_config.html b/chrome/common/extensions/docs/templates/public/extensions/networking_config.html index e983624..b6b0708 100644 --- a/chrome/common/extensions/docs/templates/public/extensions/networking_config.html +++ b/chrome/common/extensions/docs/templates/public/extensions/networking_config.html
@@ -1 +1 @@ -{{+partials.standard_extensions_api api:apis.extensions.networking_config intro:intros.networking_config chrome_os_only:true/}} +{{+partials.standard_extensions_article article:articles.networking_config/}}
diff --git a/chrome/common/extensions/permissions/chrome_permission_message_rules.cc b/chrome/common/extensions/permissions/chrome_permission_message_rules.cc index acc4134d..20310ca 100644 --- a/chrome/common/extensions/permissions/chrome_permission_message_rules.cc +++ b/chrome/common/extensions/permissions/chrome_permission_message_rules.cc
@@ -564,9 +564,6 @@ {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_PRIVATE, {APIPermission::kNetworkingPrivate}, {}}, - {IDS_EXTENSION_PROMPT_WARNING_NETWORKING_CONFIG, - {APIPermission::kNetworkingConfig}, - {}}, {IDS_EXTENSION_PROMPT_WARNING_NETWORK_STATE, {APIPermission::kNetworkState}, {}},
diff --git a/chrome/credential_provider/extension/extension_strings.cc b/chrome/credential_provider/extension/extension_strings.cc index 89b4b99..2ed214a3 100644 --- a/chrome/credential_provider/extension/extension_strings.cc +++ b/chrome/credential_provider/extension/extension_strings.cc
@@ -13,7 +13,7 @@ const wchar_t kEnableGCPWExtension[] = L"enable_gcpw_extension"; -const wchar_t kLastPeriodicSyncTimeRegKey[] = L"last_periodic_sync"; +const wchar_t kLastPeriodicSyncTimeRegKey[] = L"extension_last_periodic_sync"; } // namespace extension } // namespace credential_provider
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb index f27c769a..a85b2ae 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ml.xtb
@@ -5,6 +5,7 @@ <translation id="1383286653814676580">Google ക്രെഡൻഷ്യൽ പ്രൊവൈഡർ സൈൻ ഇൻ പേജ് റൺ ചെയ്യാൻ ഉപയോഗിച്ചു.</translation> <translation id="2048923169632968961">നിങ്ങളുടെ Windows പ്രൊഫൈലുമായി ഔദ്യോഗിക അക്കൗണ്ടിന്റെ പാസ്വേഡ് സമന്വയിപ്പിക്കുമ്പോൾ ഒരു പ്രശ്നമുണ്ടായി. നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="2515346402363002066">നിങ്ങളുടെ സെഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> +<translation id="2549902055700841962">നിങ്ങളുടെ ഔദ്യോഗിക അക്കൗണ്ടിലേക്ക് സൈൻ ഇൻ ചെയ്യാനാവുന്നില്ല. നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="2566603360883977759">സൈൻ ഇൻ ചെയ്യാൻ ഈ ഇമെയിൽ അനുവദനീയമല്ല. ഔദ്യോഗികാവശ്യത്തിനോ സ്കൂളിനോ ഉപയോഗിക്കുന്ന അക്കൗണ്ട് മുഖേന വീണ്ടും ശ്രമിക്കുക. എന്നിട്ടും സൈൻ ഇൻ ചെയ്യാനാകുന്നില്ലെങ്കിൽ അഡ്മിനെ ബന്ധപ്പെടുക.</translation> <translation id="2844349213149998955">വ്യക്തിഗത അക്കൗണ്ട് ഉപയോഗിച്ച് ഈ ഉപകരണത്തിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നത് അനുവദനീയമല്ല. ഔദ്യോഗിക അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="3217145568844727893">നിലവിലെ Windows പാസ്വേഡ് നൽകാതെ തുടരുകയാണെങ്കിൽ, ഈ ഉപകരണത്തിലെ ഡാറ്റ ശാശ്വതമായി നഷ്ടപ്പെട്ടേക്കാം.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb index 8e43a245..008957fe 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_sk.xtb
@@ -5,6 +5,7 @@ <translation id="1383286653814676580">Používa sa na spúšťanie prihlasovacej stránky poskytovateľa poverení Google</translation> <translation id="2048923169632968961">Pri synchronizácii hesla pracovného účtu s profilom systému Windows sa vyskytol problém. Kontaktujte správcu.</translation> <translation id="2515346402363002066">Platnosť vašej relácie vypršala. Prihláste sa pomocou pracovného účtu.</translation> +<translation id="2549902055700841962">Nepodarilo sa prihlásiť do pracovného účtu. Kontaktujte správcu.</translation> <translation id="2566603360883977759">Tento e‑mail sa nemôže prihlásiť. Vyskúšajte to znova účtom, ktorý používate v škole či práci. Ak sa stále nemôžete prihlásiť, kontaktujte správcu.</translation> <translation id="2844349213149998955">V tomto zariadení sa nemôžete prihlásiť pomocou osobného účtu. Prihláste sa pomocou pracovného.</translation> <translation id="3217145568844727893">Ak budete pokračovať bez zadania aktuálneho hesla systému Windows, môžete natrvalo prísť o údaje v tomto zariadení.</translation>
diff --git a/chrome/credential_provider/setup/setup_utils.cc b/chrome/credential_provider/setup/setup_utils.cc index b755a66..f5b4d8b 100644 --- a/chrome/credential_provider/setup/setup_utils.cc +++ b/chrome/credential_provider/setup/setup_utils.cc
@@ -63,7 +63,7 @@ HRESULT hr = SetUpdaterClientsAppPathFlag(standalone_install16, 1); if (FAILED(hr)) LOGFN(ERROR) << "SetGlobalFlag failed" << putHR(hr); - } else if (GetUpdaterClientsAppPathFlag(standalone_install16, 0)) { + } else if (GetUpdaterClientsAppPathFlagOrDefault(standalone_install16, 0)) { is_standalone_installation_ = true; } }
diff --git a/chrome/credential_provider/test/gcp_setup_unittests.cc b/chrome/credential_provider/test/gcp_setup_unittests.cc index 2fddb1a..1349fbc 100644 --- a/chrome/credential_provider/test/gcp_setup_unittests.cc +++ b/chrome/credential_provider/test/gcp_setup_unittests.cc
@@ -406,9 +406,31 @@ fake_scoped_lsa_policy_factory()->private_data()[kLsaKeyGaiaUsername]); } -TEST_F(GcpSetupTest, DoInstallOverOldInstall) { +// Tests install over old install for different types of installations. +// 0 - Indicates that initial installation isn't standalone. +// 1 - Indicates that the initial installation is through a standalone +// installer. +class GcpInstallOverOldInstallTest : public GcpSetupTest, + public ::testing::WithParamInterface<int> { + public: + void SetInstallerConfig(bool append_standalone_flag) { + if (append_standalone_flag) { + base::CommandLine command_line(base::CommandLine::NO_PROGRAM); + command_line.AppendSwitch(switches::kStandaloneInstall); + + StandaloneInstallerConfigurator::Get()->ConfigureInstallationType( + command_line); + } + } +}; + +TEST_P(GcpInstallOverOldInstallTest, DoInstallOverOldInstall) { logging::ResetEventSourceForTesting(); + // Set installer config as if --standalone flag was provided as indicated by + // test parameter. + SetInstallerConfig(GetParam()); + // Install using some old version. const base::string16 old_version(L"1.0.0.0"); ASSERT_EQ(S_OK, DoInstall(module_path(), old_version, fakes_for_testing())); @@ -427,6 +449,13 @@ logging::ResetEventSourceForTesting(); + // Don't include standalone flag as it should have already been indicated in + // the registry the first time this is called. + SetInstallerConfig(false); + EXPECT_TRUE( + StandaloneInstallerConfigurator::Get()->IsStandaloneInstallation() == + GetParam()); + // Now install a newer version. ASSERT_EQ(S_OK, DoInstall(module_path(), product_version(), fakes_for_testing())); @@ -447,6 +476,10 @@ fake_scoped_lsa_policy_factory()->private_data()[kLsaKeyGaiaUsername]); } +INSTANTIATE_TEST_SUITE_P(All, + GcpInstallOverOldInstallTest, + ::testing::Values(0, 1)); + TEST_F(GcpSetupTest, DoInstallOverOldLockedInstall) { logging::ResetEventSourceForTesting();
diff --git a/chrome/renderer/extensions/accessibility_private_hooks_delegate.cc b/chrome/renderer/extensions/accessibility_private_hooks_delegate.cc index 25277e5..b92b7c6 100644 --- a/chrome/renderer/extensions/accessibility_private_hooks_delegate.cc +++ b/chrome/renderer/extensions/accessibility_private_hooks_delegate.cc
@@ -63,21 +63,26 @@ const std::string display_locale = gin::V8ToString(script_context->isolate(), parsed_arguments[1]); - std::string locale_result = - base::UTF16ToUTF8(l10n_util::GetDisplayNameForLocale( - locale, display_locale, true /* is_ui */, - true /* disallow_default */)); + bool found_valid_result = false; + std::string locale_result; + if (l10n_util::IsValidLocaleSyntax(locale) && + l10n_util::IsValidLocaleSyntax(display_locale)) { + locale_result = base::UTF16ToUTF8(l10n_util::GetDisplayNameForLocale( + locale, display_locale, true /* is_ui */)); + // Check for valid locales before getting the display name. + // The ICU Locale class returns "und" for undetermined locales, and + // returns the locale string directly if it has no translation. + // Treat these cases as invalid results. + found_valid_result = + locale_result != kUndeterminedLocale && locale_result != locale; + } - RequestResult result(RequestResult::HANDLED); - - // Instead of returning "und", which is what the ICU Locale class returns for - // undetermined locales, we would simply like to return an empty string to - // communicate that we could not determine the display locale. In addition, - // ICU returns the |locale| as |result_locale| if it has no translation for a - // valid locale. Also return an empty string for that case. - if (locale_result == kUndeterminedLocale || locale_result == locale) + // We return an empty string to communicate that we could not determine + // the display locale. + if (!found_valid_result) locale_result = std::string(); + RequestResult result(RequestResult::HANDLED); result.return_value = gin::StringToV8(script_context->isolate(), locale_result); return result;
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent.cc b/chrome/renderer/lite_video/lite_video_hint_agent.cc index 1bd72c5..10d17f1 100644 --- a/chrome/renderer/lite_video/lite_video_hint_agent.cc +++ b/chrome/renderer/lite_video/lite_video_hint_agent.cc
@@ -98,10 +98,14 @@ LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.HintAgent.HasHint", true); } -void LiteVideoHintAgent::StopThrottling() { +void LiteVideoHintAgent::StopThrottlingAndClearHints() { for (auto* throttle : active_throttles_) throttle->ResumeIfThrottled(); kilobytes_buffered_before_throttle_ = 0; + target_downlink_bandwidth_kbps_.reset(); + kilobytes_to_buffer_before_throttle_.reset(); + target_downlink_rtt_latency_.reset(); + max_throttling_delay_.reset(); } } // namespace lite_video
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent.h b/chrome/renderer/lite_video/lite_video_hint_agent.h index 023150bb..cd365d7 100644 --- a/chrome/renderer/lite_video/lite_video_hint_agent.h +++ b/chrome/renderer/lite_video/lite_video_hint_agent.h
@@ -54,9 +54,10 @@ return active_throttles_; } - // Stop throttling and resume the current throttled media requests - // immediately. Throttling could start again for new requests - void StopThrottling(); + // Stop throttling permanently. Resumes the current throttled media requests + // immediately, and clears the hints so that throttling does not happen for + // new requests. + void StopThrottlingAndClearHints(); private: friend class LiteVideoHintAgentTest;
diff --git a/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc b/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc index 297efaaa..a04f91e0 100644 --- a/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc +++ b/chrome/renderer/lite_video/lite_video_hint_agent_browsertest.cc
@@ -122,7 +122,9 @@ const base::HistogramTester& histogram_tester() { return histogram_tester_; } - void StopThrottling() { lite_video_hint_agent_->StopThrottling(); } + void StopThrottlingAndClearHints() { + lite_video_hint_agent_->StopThrottlingAndClearHints(); + } protected: void SetUp() override { @@ -278,7 +280,9 @@ EXPECT_TRUE(GetActiveThrottledResponses().empty()); } -TEST_F(LiteVideoHintAgentTest, StopThrottlingResumesResponsesImmediately) { +// Permanent stop throttling should resume the responses immediately and any not +// allow throttling for new requests. +TEST_F(LiteVideoHintAgentTest, StopThrottlingPermanently) { histogram_tester().ExpectUniqueSample("LiteVideo.HintAgent.HasHint", true, 1); // Initial response is not throttled, and the next two are throttled. @@ -295,10 +299,16 @@ EXPECT_EQ(2U, GetActiveThrottledResponses().size()); // Stop throttling will immediately resume. - StopThrottling(); + StopThrottlingAndClearHints(); EXPECT_FALSE(throttle_info2->is_throttled()); EXPECT_FALSE(throttle_info3->is_throttled()); + // The new responses should not be throttled. + EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( + blink::mojom::RequestContextType::FETCH)); + EXPECT_FALSE(CreateLiteVideoURLLoaderThrottle( + blink::mojom::RequestContextType::FETCH)); + // When the throttle destroys it should get removed from active throttles. throttle_info2.reset(); throttle_info3.reset();
diff --git a/chrome/renderer/prerender/OWNERS b/chrome/renderer/prerender/OWNERS deleted file mode 100644 index c71af0e..0000000 --- a/chrome/renderer/prerender/OWNERS +++ /dev/null
@@ -1,3 +0,0 @@ -file://chrome/browser/prerender/OWNERS - -# COMPONENT: Internals>Preload
diff --git a/chrome/renderer/previews/resource_loading_hints_agent.cc b/chrome/renderer/previews/resource_loading_hints_agent.cc index 39b3e00..2a814ecb 100644 --- a/chrome/renderer/previews/resource_loading_hints_agent.cc +++ b/chrome/renderer/previews/resource_loading_hints_agent.cc
@@ -180,7 +180,7 @@ lite_video::LiteVideoHintAgent::Get(render_frame()); if (lite_video_hint_agent) { LOCAL_HISTOGRAM_BOOLEAN("LiteVideo.HintsAgent.StopThrottling", true); - lite_video_hint_agent->StopThrottling(); + lite_video_hint_agent->StopThrottlingAndClearHints(); } }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 392475d..2b444000 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2087,7 +2087,6 @@ "../browser/extensions/api/force_installed_affiliated_extension_apitest.cc", "../browser/extensions/api/force_installed_affiliated_extension_apitest.h", "../browser/extensions/api/input_ime/input_ime_apitest_chromeos.cc", - "../browser/extensions/api/networking_config_chromeos_apitest_chromeos.cc", "../browser/extensions/api/platform_keys/platform_keys_apitest_nss.cc", "../browser/extensions/api/platform_keys/platform_keys_test_base.cc", "../browser/extensions/api/platform_keys/platform_keys_test_base.h", @@ -2480,6 +2479,7 @@ "../browser/chromeos/login/screens/app_downloading_screen_browsertest.cc", "../browser/chromeos/login/screens/assistant_optin_flow_screen_browsertest.cc", "../browser/chromeos/login/screens/discover_screen_browsertest.cc", + "../browser/chromeos/login/screens/edu_coexistence_login_browsertest.cc", "../browser/chromeos/login/screens/family_link_notice_browsertest.cc", "../browser/chromeos/login/screens/fingerprint_setup_browsertest.cc", "../browser/chromeos/login/screens/gesture_navigation_screen_browsertest.cc", @@ -3107,7 +3107,7 @@ [ "../browser/site_isolation/spellcheck_per_process_browsertest.cc" ] } - if (is_win || is_mac || (is_desktop_linux && !chromeos_is_browser_only)) { + if (is_win || is_mac || (is_linux && !chromeos_is_browser_only)) { sources += [ "../browser/ui/views/profiles/profile_picker_view_browsertest.cc" ] } @@ -6852,6 +6852,8 @@ "../browser/sync/test/integration/migration_waiter.h", "../browser/sync/test/integration/migration_watcher.cc", "../browser/sync/test/integration/migration_watcher.h", + "../browser/sync/test/integration/offer_helper.cc", + "../browser/sync/test/integration/offer_helper.h", "../browser/sync/test/integration/passwords_helper.cc", "../browser/sync/test/integration/passwords_helper.h", "../browser/sync/test/integration/preferences_helper.cc", @@ -6964,6 +6966,7 @@ "../browser/sync/test/integration/single_client_extensions_sync_test.cc", "../browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc", "../browser/sync/test/integration/single_client_nigori_sync_test.cc", + "../browser/sync/test/integration/single_client_offer_sync_test.cc", "../browser/sync/test/integration/single_client_passwords_sync_test.cc", "../browser/sync/test/integration/single_client_polling_sync_test.cc", "../browser/sync/test/integration/single_client_preferences_sync_test.cc",
diff --git a/chrome/test/data/extensions/api_test/accessibility_private/display_locale.js b/chrome/test/data/extensions/api_test/accessibility_private/display_locale.js index 8ab52cabb..a134731 100644 --- a/chrome/test/data/extensions/api_test/accessibility_private/display_locale.js +++ b/chrome/test/data/extensions/api_test/accessibility_private/display_locale.js
@@ -9,6 +9,9 @@ chrome.test.assertEq( 'English', chrome.accessibilityPrivate.getDisplayNameForLocale('en', 'en')); + chrome.test.assertEq( + 'yue (Hong Kong)', + chrome.accessibilityPrivate.getDisplayNameForLocale('yue-HK', 'en')); chrome.test.succeed(); }]; chrome.test.runTests(allTests);
diff --git a/chrome/test/data/extensions/api_test/idltest/nodefine/manifest.json b/chrome/test/data/extensions/api_test/idltest/nodefine/manifest.json deleted file mode 100644 index ee5fb1a0..0000000 --- a/chrome/test/data/extensions/api_test/idltest/nodefine/manifest.json +++ /dev/null
@@ -1,6 +0,0 @@ -{ - "name": "IDLTest API test extension", - "version": "0.5", - "permissions": ["idltest"], - "manifest_version": 2 -}
diff --git a/chrome/test/data/extensions/api_test/idltest/nodefine/nodefine.html b/chrome/test/data/extensions/api_test/idltest/nodefine/nodefine.html deleted file mode 100644 index 9bbd496..0000000 --- a/chrome/test/data/extensions/api_test/idltest/nodefine/nodefine.html +++ /dev/null
@@ -1 +0,0 @@ -<script src="nodefine.js"></script>
diff --git a/chrome/test/data/extensions/api_test/idltest/nodefine/nodefine.js b/chrome/test/data/extensions/api_test/idltest/nodefine/nodefine.js deleted file mode 100644 index 28547d4..0000000 --- a/chrome/test/data/extensions/api_test/idltest/nodefine/nodefine.js +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -chrome.test.runTests([ - - function nodefineFunc() { - chrome.test.assertEq("undefined", typeof(chrome.idltest.nodefineFunc)); - chrome.test.succeed(); - } - -]);
diff --git a/chrome/test/data/extensions/api_test/networking_config/OWNERS b/chrome/test/data/extensions/api_test/networking_config/OWNERS deleted file mode 100644 index 87bd7ef..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -stevenjb@chromium.org -emaxx@chromium.org - -# COMPONENT: OS>Systems>Network
diff --git a/chrome/test/data/extensions/api_test/networking_config/api_availability.html b/chrome/test/data/extensions/api_test/networking_config/api_availability.html deleted file mode 100644 index 537a748..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/api_availability.html +++ /dev/null
@@ -1,6 +0,0 @@ -<!-- - * Copyright 2015 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. ---> -<script src="api_availability.js"></script>
diff --git a/chrome/test/data/extensions/api_test/networking_config/api_availability.js b/chrome/test/data/extensions/api_test/networking_config/api_availability.js deleted file mode 100644 index ca2867bf..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/api_availability.js +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2015 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. - -chrome.test.assertFalse(!chrome.networking.config, - "No networking_config namespace."); -chrome.test.assertFalse(!chrome.networking.config.setNetworkFilter, - "No setNetworkFilter function."); -chrome.test.assertFalse(!chrome.networking.config.finishAuthentication, - "No finishAuthentication function."); -chrome.test.succeed();
diff --git a/chrome/test/data/extensions/api_test/networking_config/full_test.html b/chrome/test/data/extensions/api_test/networking_config/full_test.html deleted file mode 100644 index 4fa7fabe..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/full_test.html +++ /dev/null
@@ -1,7 +0,0 @@ -<!-- - * Copyright 2015 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. ---> -<script src="full_test.js"></script> -
diff --git a/chrome/test/data/extensions/api_test/networking_config/full_test.js b/chrome/test/data/extensions/api_test/networking_config/full_test.js deleted file mode 100644 index 12ab642..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/full_test.js +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2015 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. - -'use strict'; - -var assertEq = chrome.test.assertEq; -var assertTrue = chrome.test.assertTrue; -var fail = chrome.test.fail; -var succeed = chrome.test.succeed; -var callbackPass = chrome.test.callbackPass; - -chrome.networking.config.onCaptivePortalDetected.addListener( - function(networkInfo) { - function onDetectionTest() { - assertTrue(!chrome.runtime.lastError); - var expectedInfo = { - Type: 'WiFi', - GUID: 'wifi1_guid', - SSID: 'wifi1', - HexSSID: '7769666931', - BSSID: '01:02:ab:7f:90:00' - }; - assertEq(expectedInfo, networkInfo); - chrome.networking.config.finishAuthentication( - networkInfo.GUID, 'succeeded', function() { - if (chrome.runtime.lastError) { - fail(chrome.runtime.lastError.message); - } - }); - // This hands control back to C++. - succeed(); - } - - chrome.test.runTests([onDetectionTest]); - }); - -function initialSetupTest() { - // |callbackPass()| will hand control back to the test in C++, which will - // trigger an |onCaptivePortalDetected| event that is handled by the listener - // above. - chrome.networking.config.setNetworkFilter([{Type: 'WiFi', SSID: 'wifi1'}], - callbackPass()); -} - -chrome.test.runTests([initialSetupTest]);
diff --git a/chrome/test/data/extensions/api_test/networking_config/manifest.json b/chrome/test/data/extensions/api_test/networking_config/manifest.json deleted file mode 100644 index b219773..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/manifest.json +++ /dev/null
@@ -1,8 +0,0 @@ -{ - "name": "networking.config browser tests", - "version": "0.1", - "manifest_version": 2, - "permissions": [ - "networking.config" - ] -}
diff --git a/chrome/test/data/extensions/api_test/networking_config/register_networks.html b/chrome/test/data/extensions/api_test/networking_config/register_networks.html deleted file mode 100644 index 7cb5644..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/register_networks.html +++ /dev/null
@@ -1,6 +0,0 @@ -<!-- - * Copyright 2015 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. ---> -<script src="register_networks.js"></script>
diff --git a/chrome/test/data/extensions/api_test/networking_config/register_networks.js b/chrome/test/data/extensions/api_test/networking_config/register_networks.js deleted file mode 100644 index 8436b1c..0000000 --- a/chrome/test/data/extensions/api_test/networking_config/register_networks.js +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2015 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. - -'use strict'; - -var assertEq = chrome.test.assertEq; -var assertTrue = chrome.test.assertTrue; -var assertThrows = chrome.test.assertThrows; -var fail = chrome.test.fail; -var succeed = chrome.test.succeed; -var callbackPass = chrome.test.callbackPass; -var callbackFail = chrome.test.callbackFail; - -var testCases = { - neitherHexSsidNorSsid: - {input: [{Type: 'WiFi'}], error: 'Malformed filter description.'}, - ssid: {input: [{Type: 'WiFi', SSID: 'SSID1'}]}, - hexSsid: {input: [{Type: 'WiFi', HexSSID: '5353494431'}]}, - invalidHexSsid1: { - input: [{Type: 'WiFi', HexSSID: '5'}], - error: - 'Malformed filter description. Failed to register network with SSID ' + - '(hex): 5' - }, - invalidHexSsid2: { - input: [{Type: 'WiFi', HexSSID: 'ABCDEFGH'}], - error: - 'Malformed filter description. Failed to register network with SSID ' + - '(hex): ABCDEFGH' - } -}; - -var runTests = function() { - for (var key in testCases) { - var testCase = testCases[key]; - if (testCase.hasOwnProperty('error')) - var callback = callbackFail(testCase.error); - else - var callback = callbackPass(); - chrome.networking.config.setNetworkFilter(testCase.input, callback); - } -}; - -runTests();
diff --git a/chrome/test/data/extensions/networking_config/background.js b/chrome/test/data/extensions/networking_config/background.js deleted file mode 100644 index e996a392..0000000 --- a/chrome/test/data/extensions/networking_config/background.js +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Register this extension as the network handler for wifi1. -chrome.networking.config.setNetworkFilter([{Type: 'WiFi', SSID: 'wifi1'}], - function() { - chrome.test.sendMessage('done'); - });
diff --git a/chrome/test/data/extensions/networking_config/manifest.json b/chrome/test/data/extensions/networking_config/manifest.json deleted file mode 100644 index 6f5b0dda..0000000 --- a/chrome/test/data/extensions/networking_config/manifest.json +++ /dev/null
@@ -1,11 +0,0 @@ -{ - "name": "NetworkingConfig test extension", - "version": "0.1", - "manifest_version": 2, - "background": { - "scripts": ["background.js"] - }, - "permissions": [ - "networking.config" - ] -}
diff --git a/chrome/test/data/ssl/page_displays_insecure_form.html b/chrome/test/data/ssl/page_displays_insecure_form.html index 6ea456643..f0b639c 100644 --- a/chrome/test/data/ssl/page_displays_insecure_form.html +++ b/chrome/test/data/ssl/page_displays_insecure_form.html
@@ -10,7 +10,7 @@ <body> This page contains an form which targets a non-secure URL, causing insecure content (when this page is loaded over https).<br> -<form id="insecureForm" action="http://does-not-exist.test/ssl/google_files/logo.gif"> +<form id="insecureForm" action="http://does-not-exist.test/ssl/google_files/logo.gif" method="post"> <input type="submit" /> </form>
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js index 09780ffa..830fe4ac 100644 --- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js +++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -247,6 +247,8 @@ firstCapabilities.sources[0].name, scanningApp.selectedSource); assertEquals( firstCapabilities.colorModes[0], scanningApp.selectedColorMode); + assertEquals( + firstCapabilities.resolutions[0], scanningApp.selectedResolution); // Before the scan button is clicked, the settings and scan button // should be enabled, and there should be no scan status. @@ -257,6 +259,9 @@ const colorModeSelect = scanningApp.$$('#colorModeSelect').$$('select'); assertFalse(colorModeSelect.disabled); + const resolutionSelect = + scanningApp.$$('#resolutionSelect').$$('select'); + assertFalse(resolutionSelect.disabled); const scanButton = scanningApp.$$('#scanButton'); assertFalse(scanButton.disabled); const statusText = scanningApp.$$('#statusText'); @@ -269,6 +274,7 @@ assertTrue(scannerSelect.disabled); assertTrue(sourceSelect.disabled); assertTrue(colorModeSelect.disabled); + assertTrue(resolutionSelect.disabled); assertTrue(scanButton.disabled); assertEquals('Scanning...', statusText.textContent.trim()); return fakeScanService_.whenCalled('scan'); @@ -280,6 +286,8 @@ assertFalse(scanningApp.$$('#scannerSelect').$$('select').disabled); assertFalse(scanningApp.$$('#sourceSelect').$$('select').disabled); assertFalse(scanningApp.$$('#colorModeSelect').$$('select').disabled); + assertFalse( + scanningApp.$$('#resolutionSelect').$$('select').disabled); assertFalse(scanningApp.$$('#scanButton').disabled); assertEquals( 'Scan complete! File(s) saved to My files.', @@ -500,3 +508,73 @@ assertFalse(select.disabled); }); }); + +suite('ResolutionSelectTest', () => { + /** @type {!ResolutionSelectElement} */ + let resolutionSelect; + + setup(() => { + resolutionSelect = document.createElement('resolution-select'); + assertTrue(!!resolutionSelect); + document.body.appendChild(resolutionSelect); + }); + + teardown(() => { + resolutionSelect.remove(); + resolutionSelect = null; + }); + + test('initializeResolutionSelect', () => { + // Before options are added, the dropdown should be disabled and empty. + const select = resolutionSelect.$$('select'); + assertTrue(!!select); + assertTrue(select.disabled); + assertEquals(0, select.length); + + const firstResolution = 75; + const secondResolution = 300; + resolutionSelect.resolutions = [firstResolution, secondResolution]; + flush(); + + // Verify that adding more than one resolution results in the dropdown + // becoming enabled with the correct options. + assertFalse(select.disabled); + assertEquals(2, select.length); + assertEquals( + firstResolution.toString() + ' dpi', + select.options[0].textContent.trim()); + assertEquals( + secondResolution.toString() + ' dpi', + select.options[1].textContent.trim()); + assertEquals(firstResolution.toString(), select.value); + + // Selecting a different option should update the selected value. + select.value = secondResolution; + select.dispatchEvent(new CustomEvent('change')); + flush(); + + assertEquals( + secondResolution.toString(), resolutionSelect.selectedResolution); + }); + + test('resolutionSelectDisabled', () => { + const select = resolutionSelect.$$('select'); + assertTrue(!!select); + + let resolutionArr = [75]; + resolutionSelect.resolutions = resolutionArr; + flush(); + + // Verify the dropdown is disabled when there's only one option. + assertEquals(1, select.length); + assertTrue(select.disabled); + + resolutionArr = resolutionArr.concat([150]); + resolutionSelect.resolutions = resolutionArr; + flush(); + + // Verify the dropdown is enabled when there's more than one option. + assertEquals(2, select.length); + assertFalse(select.disabled); + }); +});
diff --git a/chrome/test/data/webui/cr_elements/cr_button_tests.js b/chrome/test/data/webui/cr_elements/cr_button_tests.js index a3cd6c494..9fb7f42 100644 --- a/chrome/test/data/webui/cr_elements/cr_button_tests.js +++ b/chrome/test/data/webui/cr_elements/cr_button_tests.js
@@ -101,12 +101,6 @@ assertNotEquals('none', getComputedStyle(button).display); }); - test('tap event is emitted on click', async () => { - const wait = test_util.eventToPromise('tap', button); - button.click(); - await wait; - }); - test('space up does not click without space down', () => { let clicked = false; button.addEventListener('click', () => {
diff --git a/chrome/test/data/webui/settings/chooser_exception_list_tests.js b/chrome/test/data/webui/settings/chooser_exception_list_tests.js index 9d7cf88..ae3c75e 100644 --- a/chrome/test/data/webui/settings/chooser_exception_list_tests.js +++ b/chrome/test/data/webui/settings/chooser_exception_list_tests.js
@@ -442,7 +442,7 @@ */ const testsParams = [ {text: 'a', el: testElement, eventType: 'mouseleave'}, - {text: 'b', el: testElement, eventType: 'tap'}, + {text: 'b', el: testElement, eventType: 'click'}, {text: 'c', el: testElement, eventType: 'blur'}, {text: 'd', el: tooltip, eventType: 'mouseenter'}, ];
diff --git a/chrome/test/data/webui/settings/site_list_tests.js b/chrome/test/data/webui/settings/site_list_tests.js index c1744ad..334c167 100644 --- a/chrome/test/data/webui/settings/site_list_tests.js +++ b/chrome/test/data/webui/settings/site_list_tests.js
@@ -1054,7 +1054,7 @@ const testsParams = [ ['a', testElement, new MouseEvent('mouseleave')], - ['b', testElement, new MouseEvent('tap')], + ['b', testElement, new MouseEvent('click')], ['c', testElement, new Event('blur')], ['d', tooltip, new MouseEvent('mouseenter')], ];
diff --git a/chrome/tools/build/linux/FILES.cfg b/chrome/tools/build/linux/FILES.cfg index 204419e1..d4daa5a 100644 --- a/chrome/tools/build/linux/FILES.cfg +++ b/chrome/tools/build/linux/FILES.cfg
@@ -154,6 +154,20 @@ 'buildtype': ['official'], 'archive': 'remoting-me2me-host-linux.zip', }, + # Remoting symbols: + { + 'filename': 'remote_assistance_host.debug', + 'arch': ['64bit'], + 'buildtype': ['official'], + 'archive': 'remoting-debug-info.zip', + }, + { + # Include all debug symbols that start with `remoting`. + 'filename': 'remoting*.debug', + 'arch': ['64bit'], + 'buildtype': ['official'], + 'archive': 'remoting-debug-info.zip', + }, # Breakpad symbols: { 'filename': 'chrome.breakpad.x64',
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn index cd3d5dab7..ff6161d 100644 --- a/chromecast/BUILD.gn +++ b/chromecast/BUILD.gn
@@ -623,8 +623,6 @@ } android_assets("cast_shell_apk_assets") { - assert(v8_use_external_startup_data) - sources = [ "$root_out_dir/assets/cast_shell.pak" ] deps = [
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index aa6f071..26ca7761 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -475,6 +475,12 @@ <message name="IDS_SCANNING_APP_COLOR_MODE_DROPDOWN_LABEL" desc="The label for the dropdown that displays available color modes (e.g. color, grayscale, black and white, etc.)."> Color mode </message> + <message name="IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL" desc="The label for the dropdown that displays available resolutions (e.g. 150 dpi, 300 dpi, etc.)."> + Resolution + </message> + <message name="IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT" desc="The text displayed for an option in the resolution dropdown."> + <ph name="RESOLUTION_VALUE">$1<ex>300</ex></ph> dpi + </message> <!-- Diagnostics App --> <!-- TODO(michaelcheco): Update with finalized copies of the strings -->
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL.png.sha1 new file mode 100644 index 0000000..7f591c7 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL.png.sha1
@@ -0,0 +1 @@ +3af4adb42d4fe7ee3152e4e748b2d54494be6ab5 \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT.png.sha1 new file mode 100644 index 0000000..d587fa6e --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT.png.sha1
@@ -0,0 +1 @@ +7fb844b4b0a7728cf735dee1fc8846c36fe4b85b \ No newline at end of file
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb index 7768bfae..650f0c4 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ml"> <translation id="1276998909102132017">ഗാലറി ചിത്രങ്ങൾ</translation> <translation id="1430915738399379752">അച്ചടിക്കുക</translation> +<translation id="1473110567575736769">3 സെക്കൻഡ് ടൈമർ</translation> <translation id="1620510694547887537">ക്യാമറ</translation> <translation id="1627744224761163218">4 x 4</translation> <translation id="1664224225747386870">ഒന്നും റെക്കോർഡ് ചെയ്തില്ല</translation> @@ -30,6 +31,7 @@ <translation id="3517926952904427380">പോർട്രെയ്റ്റ് ഫോട്ടോ എടുക്കാനായില്ല</translation> <translation id="3569311554794739032">"<ph name="FILE" />" നീക്കംചെയ്യണമെന്ന് തീർച്ചയാണോ?</translation> <translation id="3810838688059735925">വീഡിയോ</translation> +<translation id="4000398125663085899">പുതിയ ഫോട്ടോകളും വീഡിയോകളും ഇപ്പോൾ Files ആപ്പ്: എന്റെ ഫയലുകൾ > ക്യാമറ എന്നതിലെ ഒരു ഫോൾഡറിലേക്ക് സംരക്ഷിക്കും</translation> <translation id="4118525110028899586">റെക്കോർഡ് ചെയ്യൽ തൽക്കാലം നിർത്തുക</translation> <translation id="4279490309300973883">മിററിംഗ്</translation> <translation id="4329152592498422850">സമചതുര ഫോട്ടോയെടുക്കൽ മോഡിലേക്ക് മാറുക</translation> @@ -62,6 +64,7 @@ <translation id="6965382102122355670">ശരി</translation> <translation id="698156982839284926">3 സെക്കൻഡ്</translation> <translation id="712848772518857951">നിങ്ങൾക്ക് ശരിക്കും <ph name="COUNT" /> ഇനങ്ങൾ നീക്കംചെയ്യണോ?</translation> +<translation id="7134221860976209830">10 സെക്കൻഡ് ടൈമർ</translation> <translation id="7243947652761655814">വീഡിയോ റെസല്യൂഷൻ</translation> <translation id="7337660886763914220">ഫയൽ സിസ്റ്റം പിശകുകൾ.</translation> <translation id="7557677699350329807">അടുത്ത ക്യാമറയിലേക്ക് മാറുക</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb index b0de788..63ee51a 100644 --- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sk"> <translation id="1276998909102132017">Obrázky galérie</translation> <translation id="1430915738399379752">Tlačiť</translation> +<translation id="1473110567575736769">Trojsekundový časovač</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 × 4</translation> <translation id="1664224225747386870">Nič sa nezaznamenalo</translation> @@ -30,6 +31,7 @@ <translation id="3517926952904427380">Nepodarilo sa nasnímať portrétovú fotku</translation> <translation id="3569311554794739032">Naozaj chcete odstrániť <ph name="FILE" />?</translation> <translation id="3810838688059735925">Video</translation> +<translation id="4000398125663085899">Nové fotky a videá sa budú odteraz ukladať do priečinka v aplikácii Súbory: Moje súbory > Kamera</translation> <translation id="4118525110028899586">Pozastaviť nahrávanie</translation> <translation id="4279490309300973883">Zrkadlenie</translation> <translation id="4329152592498422850">Prepnúť na snímanie štvorcových fotiek</translation> @@ -62,6 +64,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="698156982839284926">3 sekundy</translation> <translation id="712848772518857951">Naozaj chcete odstrániť položky (počet: <ph name="COUNT" />)?</translation> +<translation id="7134221860976209830">Desaťsekundový časovač</translation> <translation id="7243947652761655814">Rozlíšenie videa</translation> <translation id="7337660886763914220">Chyby systému súborov.</translation> <translation id="7557677699350329807">Prepnúť na ďalší fotoaparát</translation>
diff --git a/chromeos/components/diagnostics_ui/backend/BUILD.gn b/chromeos/components/diagnostics_ui/backend/BUILD.gn index 8ec40c6b..4102079 100644 --- a/chromeos/components/diagnostics_ui/backend/BUILD.gn +++ b/chromeos/components/diagnostics_ui/backend/BUILD.gn
@@ -12,6 +12,8 @@ "power_manager_client_conversions.h", "system_data_provider.cc", "system_data_provider.h", + "system_routine_controller.cc", + "system_routine_controller.h", ] deps = [ @@ -30,6 +32,7 @@ sources = [ "power_manager_client_conversions_unittest.cc", "system_data_provider_unittest.cc", + "system_routine_controller_unittest.cc", ] deps = [
diff --git a/chromeos/components/diagnostics_ui/backend/system_routine_controller.cc b/chromeos/components/diagnostics_ui/backend/system_routine_controller.cc new file mode 100644 index 0000000..a2fbb7c --- /dev/null +++ b/chromeos/components/diagnostics_ui/backend/system_routine_controller.cc
@@ -0,0 +1,28 @@ +// Copyright 2020 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. + +#include "chromeos/components/diagnostics_ui/backend/system_routine_controller.h" + +#include "base/bind.h" +#include "chromeos/services/cros_healthd/public/cpp/service_connection.h" + +namespace chromeos { +namespace diagnostics { + +void SystemRoutineController::BindCrosHealthdDiagnosticsServiceIfNeccessary() { + if (!diagnostics_service_ || !diagnostics_service_.is_connected()) { + cros_healthd::ServiceConnection::GetInstance()->GetDiagnosticsService( + diagnostics_service_.BindNewPipeAndPassReceiver()); + diagnostics_service_.set_disconnect_handler(base::BindOnce( + &SystemRoutineController::OnDiagnosticsServiceDisconnected, + base::Unretained(this))); + } +} + +void SystemRoutineController::OnDiagnosticsServiceDisconnected() { + diagnostics_service_.reset(); +} + +} // namespace diagnostics +} // namespace chromeos
diff --git a/chromeos/components/diagnostics_ui/backend/system_routine_controller.h b/chromeos/components/diagnostics_ui/backend/system_routine_controller.h new file mode 100644 index 0000000..3027b8c --- /dev/null +++ b/chromeos/components/diagnostics_ui/backend/system_routine_controller.h
@@ -0,0 +1,34 @@ +// Copyright 2020 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 CHROMEOS_COMPONENTS_DIAGNOSTICS_UI_BACKEND_SYSTEM_ROUTINE_CONTROLLER_H_ +#define CHROMEOS_COMPONENTS_DIAGNOSTICS_UI_BACKEND_SYSTEM_ROUTINE_CONTROLLER_H_ + +#include "chromeos/services/cros_healthd/public/mojom/cros_healthd.mojom.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace chromeos { +namespace diagnostics { + +class SystemRoutineController { + public: + SystemRoutineController(); + ~SystemRoutineController(); + + SystemRoutineController(const SystemRoutineController&) = delete; + SystemRoutineController& operator=(const SystemRoutineController&) = delete; + + private: + void BindCrosHealthdDiagnosticsServiceIfNeccessary(); + + void OnDiagnosticsServiceDisconnected(); + + mojo::Remote<cros_healthd::mojom::CrosHealthdDiagnosticsService> + diagnostics_service_; +}; + +} // namespace diagnostics +} // namespace chromeos + +#endif // CHROMEOS_COMPONENTS_DIAGNOSTICS_UI_BACKEND_SYSTEM_ROUTINE_CONTROLLER_H_
diff --git a/chromeos/components/diagnostics_ui/backend/system_routine_controller_unittest.cc b/chromeos/components/diagnostics_ui/backend/system_routine_controller_unittest.cc new file mode 100644 index 0000000..949d39b --- /dev/null +++ b/chromeos/components/diagnostics_ui/backend/system_routine_controller_unittest.cc
@@ -0,0 +1,18 @@ +// Copyright 2020 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. + +#include "chromeos/components/diagnostics_ui/backend/system_routine_controller.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { +namespace diagnostics { + +class SystemRoutineControllerTest : public testing::Test { + SystemRoutineControllerTest() = default; + ~SystemRoutineControllerTest() override = default; +}; + +} // namespace diagnostics +} // namespace chromeos
diff --git a/chromeos/components/diagnostics_ui/resources/diagnostics_card.html b/chromeos/components/diagnostics_ui/resources/diagnostics_card.html index aee3f4f..8efeecc 100644 --- a/chromeos/components/diagnostics_ui/resources/diagnostics_card.html +++ b/chromeos/components/diagnostics_ui/resources/diagnostics_card.html
@@ -19,6 +19,10 @@ grid-template-columns: 1fr 1fr; } + .routine-container { + @apply --diagnostics-default-font; + } + .spacing { margin: 18px 0px; padding-inline-end: 15px; @@ -42,4 +46,8 @@ <slot name="body"></slot> </div> </div> + + <div id="routines" class="routine-container spacing"> + <slot name="routines"></slot> + </div> </div>
diff --git a/chromeos/components/file_manager/BUILD.gn b/chromeos/components/file_manager/BUILD.gn index 14a08c17..92b78fe 100644 --- a/chromeos/components/file_manager/BUILD.gn +++ b/chromeos/components/file_manager/BUILD.gn
@@ -2,19 +2,20 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//mojo/public/tools/bindings/mojom.gni") - assert(is_chromeos, "File Manager is Chrome OS only") assert(!is_official_build, "File Manager is only built for unofficial builds") -mojom("file_manager_mojom") { - sources = [ "file_manager.mojom" ] +static_library("file_manager_page_handler") { + sources = [ + "file_manager_page_handler.cc", + "file_manager_page_handler.h", + ] + + deps = [ "//chromeos/components/file_manager/mojom" ] } static_library("file_manager_ui") { sources = [ - "file_manager_page_handler.cc", - "file_manager_page_handler.h", "file_manager_ui.cc", "file_manager_ui.h", "url_constants.cc", @@ -22,7 +23,8 @@ ] deps = [ - ":file_manager_mojom", + ":file_manager_page_handler", + "//chromeos/components/file_manager/mojom", "//chromeos/constants", "//chromeos/resources:file_manager_resources", "//content/public/browser",
diff --git a/chromeos/components/file_manager/OWNERS b/chromeos/components/file_manager/OWNERS index 2527425..a7da274c8 100644 --- a/chromeos/components/file_manager/OWNERS +++ b/chromeos/components/file_manager/OWNERS
@@ -1,6 +1,3 @@ file://ui/file_manager/OWNERS -per-file *.mojom=set noparent -per-file *.mojom=file://ipc/SECURITY_OWNERS - # COMPONENT: Platform>Apps>FileManager
diff --git a/chromeos/components/file_manager/file_manager_page_handler.h b/chromeos/components/file_manager/file_manager_page_handler.h index 9cc7f316..8d6a57e0 100644 --- a/chromeos/components/file_manager/file_manager_page_handler.h +++ b/chromeos/components/file_manager/file_manager_page_handler.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "base/timer/timer.h" -#include "chromeos/components/file_manager/file_manager.mojom.h" +#include "chromeos/components/file_manager/mojom/file_manager.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/chromeos/components/file_manager/file_manager_ui.h b/chromeos/components/file_manager/file_manager_ui.h index 5d30f88..fd71622a 100644 --- a/chromeos/components/file_manager/file_manager_ui.h +++ b/chromeos/components/file_manager/file_manager_ui.h
@@ -7,7 +7,7 @@ #include <memory> -#include "chromeos/components/file_manager/file_manager.mojom.h" +#include "chromeos/components/file_manager/mojom/file_manager.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/chromeos/components/file_manager/mojom/BUILD.gn b/chromeos/components/file_manager/mojom/BUILD.gn new file mode 100644 index 0000000..6ef266a --- /dev/null +++ b/chromeos/components/file_manager/mojom/BUILD.gn
@@ -0,0 +1,12 @@ +# Copyright 2020 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. + +import("//mojo/public/tools/bindings/mojom.gni") + +assert(is_chromeos, "File Manager is Chrome OS only") +assert(!is_official_build, "File Manager is only built for unofficial builds") + +mojom("mojom") { + sources = [ "file_manager.mojom" ] +}
diff --git a/chromeos/components/file_manager/mojom/OWNERS b/chromeos/components/file_manager/mojom/OWNERS new file mode 100644 index 0000000..0422034 --- /dev/null +++ b/chromeos/components/file_manager/mojom/OWNERS
@@ -0,0 +1,4 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS + +# COMPONENT: Platform>Apps>FileManager
diff --git a/chromeos/components/file_manager/file_manager.mojom b/chromeos/components/file_manager/mojom/file_manager.mojom similarity index 100% rename from chromeos/components/file_manager/file_manager.mojom rename to chromeos/components/file_manager/mojom/file_manager.mojom
diff --git a/chromeos/components/file_manager/resources/BUILD.gn b/chromeos/components/file_manager/resources/BUILD.gn index 3ccce6d5..94d51a2 100644 --- a/chromeos/components/file_manager/resources/BUILD.gn +++ b/chromeos/components/file_manager/resources/BUILD.gn
@@ -9,7 +9,9 @@ "browser_proxy.js", "main.js", ] - deps = [ "//chromeos/components/file_manager:file_manager_mojom_js_library_for_compile" ] + deps = [ + "//chromeos/components/file_manager/mojom:mojom_js_library_for_compile", + ] } js_type_check("closure_compile") {
diff --git a/chromeos/components/file_manager/resources/file_manager_resources.grd b/chromeos/components/file_manager/resources/file_manager_resources.grd index 69413c6..b1117edd 100644 --- a/chromeos/components/file_manager/resources/file_manager_resources.grd +++ b/chromeos/components/file_manager/resources/file_manager_resources.grd
@@ -22,7 +22,7 @@ <!-- Mojo resources --> <include name="IDR_FILE_MANAGER_MOJO_LITE_JS" - file="$root_gen_dir\chromeos\components\file_manager\file_manager.mojom-lite.js" + file="$root_gen_dir\chromeos\components\file_manager\mojom\file_manager.mojom-lite.js" use_base_dir="false" type="BINDATA" /> </if>
diff --git a/chromeos/components/scanning/resources/BUILD.gn b/chromeos/components/scanning/resources/BUILD.gn index 8612596..0853ab5 100644 --- a/chromeos/components/scanning/resources/BUILD.gn +++ b/chromeos/components/scanning/resources/BUILD.gn
@@ -12,6 +12,7 @@ deps = [ ":color_mode_select", ":mojo_interface_provider", + ":resolution_select", ":scanner_select", ":scanning_app", ":scanning_app_types", @@ -29,6 +30,15 @@ ] } +js_library("resolution_select") { + deps = [ + "//chromeos/components/scanning/mojom:mojom_js_library_for_compile", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:i18n_behavior.m", + "//ui/webui/resources/js:load_time_data.m", + ] +} + js_library("scanner_select") { deps = [ ":scanning_app_types", @@ -43,6 +53,7 @@ deps = [ ":color_mode_select", ":mojo_interface_provider", + ":resolution_select", ":scanner_select", ":scanning_app_types", ":scanning_app_util", @@ -76,6 +87,7 @@ html_to_js("web_components") { js_files = [ "color_mode_select.js", + "resolution_select.js", "scanner_select.js", "scanning_app.js", "source_select.js",
diff --git a/chromeos/components/scanning/resources/resolution_select.html b/chromeos/components/scanning/resources/resolution_select.html new file mode 100644 index 0000000..46accea --- /dev/null +++ b/chromeos/components/scanning/resources/resolution_select.html
@@ -0,0 +1,26 @@ +<style> + #title { + height: 32px; + padding-inline-end: 10px; + } + + #controls { + display: inline-block; + height: 32px; + width: 300px; + } +</style> +<span id="title">[[i18n('resolutionDropdownLabel')]]</span> +<div id="controls"> + <!-- TODO(jschettler): Verify this meets a11y expecations (e.g. ChromeVox + should announce when a new option is focused). --> + <select class="md-select" value="{{selectedResolution::change}}" + disabled="[[disabled_]]"> + <!-- TODO(jschettler): Sort the resolutions. --> + <template is="dom-repeat" items="[[resolutions]]" as="resolution"> + <option value="[[resolution]]"> + [[getResolutionString_(resolution)]] + </option> + </template> + </select> +</div>
diff --git a/chromeos/components/scanning/resources/resolution_select.js b/chromeos/components/scanning/resources/resolution_select.js new file mode 100644 index 0000000..65b79ed --- /dev/null +++ b/chromeos/components/scanning/resources/resolution_select.js
@@ -0,0 +1,74 @@ +// Copyright 2020 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. + +import './scanning.mojom-lite.js'; + +import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import './strings.js'; + +/** @type {number} */ +const NUM_REQUIRED_RESOLUTIONS = 2; + +/** + * @fileoverview + * 'resolution-select' displays the available scan resolutions in a dropdown. + */ +Polymer({ + is: 'resolution-select', + + _template: html`{__html_template__}`, + + behaviors: [I18nBehavior], + + properties: { + /** @type {!Array<number>} */ + resolutions: { + type: Array, + value: () => [], + }, + + /** @type {number|undefined} */ + selectedResolution: { + type: Number, + notify: true, + }, + + /** + * Indicates whether all settings have been disabled by the parent element. + */ + settingsDisabled: Boolean, + + /** + * Controls whether the dropdown is disabled. + * @private + */ + disabled_: { + type: Boolean, + computed: 'computeDisabled_(resolutions.length, settingsDisabled)', + }, + }, + + /** + * @param {number} resolution + * @return {!string} + * @private + */ + getResolutionString_(resolution) { + return loadTimeData.getStringF( + 'resolutionOptionText', resolution.toString()); + }, + + /** + * Disables the dropdown if settings are disabled or the number of available + * resolutions is less than the number of required resolutions. + * @return {boolean} + * @private + */ + computeDisabled_() { + return this.settingsDisabled || + this.resolutions.length < NUM_REQUIRED_RESOLUTIONS; + }, +});
diff --git a/chromeos/components/scanning/resources/scanning_app.html b/chromeos/components/scanning/resources/scanning_app.html index 489969d..93c2c088 100644 --- a/chromeos/components/scanning/resources/scanning_app.html +++ b/chromeos/components/scanning/resources/scanning_app.html
@@ -15,6 +15,12 @@ settings-disabled="[[settingsDisabled_]]" selected-color-mode="{{selectedColorMode}}"></color-mode-select> </div> +<div> + <resolution-select id="resolutionSelect" + resolutions="[[capabilities_.resolutions]]" + settings-disabled="[[settingsDisabled_]]" + selected-resolution="{{selectedResolution}}"></resolution-select> +</div> <!-- TODO(jschettler): Replace button label with finalized i18n string. --> <cr-button id="scanButton" on-click="onScanClick_" disabled$="[[scanButtonDisabled_]]">
diff --git a/chromeos/components/scanning/resources/scanning_app.js b/chromeos/components/scanning/resources/scanning_app.js index 7574329d..b87ff7e6 100644 --- a/chromeos/components/scanning/resources/scanning_app.js +++ b/chromeos/components/scanning/resources/scanning_app.js
@@ -7,6 +7,7 @@ import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js'; import 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js'; import './color_mode_select.js'; +import './resolution_select.js'; import './scanner_select.js'; import './source_select.js'; @@ -55,6 +56,9 @@ /** @type {chromeos.scanning.mojom.ColorMode|undefined} */ selectedColorMode: chromeos.scanning.mojom.ColorMode, + /** @type {number|undefined} */ + selectedResolution: Number, + /** * @type {?string} * @private @@ -107,6 +111,7 @@ // first options in the dropdowns. this.selectedSource = this.capabilities_.sources[0].name; this.selectedColorMode = this.capabilities_.colorModes[0]; + this.selectedResolution = this.capabilities_.resolutions[0]; this.scanButtonDisabled_ = false; }, @@ -156,7 +161,8 @@ /** @private */ onScanClick_() { if (!this.selectedScannerId || !this.selectedSource || - this.selectedColorMode === undefined) { + this.selectedColorMode === undefined || + this.selectedResolution === undefined) { // TODO(jschettler): Replace status text with finalized i18n strings. this.statusText_ = 'Failed to start scan.'; return; @@ -166,12 +172,10 @@ this.settingsDisabled_ = true; this.scanButtonDisabled_ = true; - // TODO(jschettler): Set resolution using the selected value when the - // corresponding dropdowns are added. const settings = { 'sourceName': this.selectedSource, 'colorMode': this.selectedColorMode, - 'resolutionDpi': 100, + 'resolutionDpi': this.selectedResolution, }; this.scanService_ .scan(this.scannerIds_.get(this.selectedScannerId), settings)
diff --git a/chromeos/components/scanning/resources/scanning_app_resources.grd b/chromeos/components/scanning/resources/scanning_app_resources.grd index e3af764..4038642 100644 --- a/chromeos/components/scanning/resources/scanning_app_resources.grd +++ b/chromeos/components/scanning/resources/scanning_app_resources.grd
@@ -22,6 +22,8 @@ <include name="IDR_SCANNING_APP_SOURCE_SELECT_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/source_select.js" use_base_dir="false" compress="gzip" type="BINDATA"/> <include name="IDR_SCANNING_APP_COLOR_MODE_SELECT_HTML" file="color_mode_select.html" compress="gzip" type="BINDATA"/> <include name="IDR_SCANNING_APP_COLOR_MODE_SELECT_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/color_mode_select.js" use_base_dir="false" compress="gzip" type="BINDATA"/> + <include name="IDR_SCANNING_APP_RESOLUTION_SELECT_HTML" file="resolution_select.html" compress="gzip" type="BINDATA"/> + <include name="IDR_SCANNING_APP_RESOLUTION_SELECT_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/resolution_select.js" use_base_dir="false" compress="gzip" type="BINDATA"/> <include name="IDR_SCANNING_APP_THROBBER_CSS_JS" file="${root_gen_dir}/chromeos/components/scanning/resources/throbber_css.js" use_base_dir="false" type="BINDATA"/> <include name="IDR_SCANNING_APP_ICON" file="app_icon_192.png" type="BINDATA" /> </includes>
diff --git a/chromeos/components/scanning/scanning_ui.cc b/chromeos/components/scanning/scanning_ui.cc index fb47db9..5809ebb 100644 --- a/chromeos/components/scanning/scanning_ui.cc +++ b/chromeos/components/scanning/scanning_ui.cc
@@ -52,7 +52,9 @@ {"scannerDropdownLabel", IDS_SCANNING_APP_SCANNER_DROPDOWN_LABEL}, {"noScannersText", IDS_SCANNING_APP_NO_SCANNERS_TEXT}, {"sourceDropdownLabel", IDS_SCANNING_APP_SOURCE_DROPDOWN_LABEL}, - {"colorModeDropdownLabel", IDS_SCANNING_APP_COLOR_MODE_DROPDOWN_LABEL}}; + {"colorModeDropdownLabel", IDS_SCANNING_APP_COLOR_MODE_DROPDOWN_LABEL}, + {"resolutionDropdownLabel", IDS_SCANNING_APP_RESOLUTION_DROPDOWN_LABEL}, + {"resolutionOptionText", IDS_SCANNING_APP_RESOLUTION_OPTION_TEXT}}; for (const auto& str : kLocalizedStrings) html_source->AddLocalizedString(str.name, str.id);
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom index 863f4568..cf99be2 100644 --- a/chromeos/crosapi/mojom/crosapi.mojom +++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -10,6 +10,7 @@ import "chromeos/crosapi/mojom/message_center.mojom"; import "chromeos/crosapi/mojom/screen_manager.mojom"; import "chromeos/crosapi/mojom/select_file.mojom"; +import "mojo/public/mojom/base/token.mojom"; import "services/device/public/mojom/hid.mojom"; // LacrosInfo is a set of parameters passed to ash from lacros-chrome @@ -143,6 +144,14 @@ // user chooses to enroll the device). [MinVersion=4] DeviceMode device_mode@4; + + // Ash sends all known crosapi interfaces and their versions at startup so + // that Lacros can synchronously query version info. Interfaces are identified + // by a UUID, which is manually generated and assigned via the UUID mojom + // qualifier. + // Added in M88. + [MinVersion=5] + map<mojo_base.mojom.Token, uint32>? interface_versions@5; }; // LacrosChromeService defines the APIs that live in lacros-chrome and
diff --git a/chromeos/lacros/lacros_chrome_service_impl.cc b/chromeos/lacros/lacros_chrome_service_impl.cc index 2ad5623..5dab8dc 100644 --- a/chromeos/lacros/lacros_chrome_service_impl.cc +++ b/chromeos/lacros/lacros_chrome_service_impl.cc
@@ -359,6 +359,20 @@ return AshChromeServiceVersion() >= 3; } +int LacrosChromeServiceImpl::GetInterfaceVersion( + base::Token interface_uuid) const { + if (g_disable_all_crosapi_for_tests) + return -1; + if (!init_params_->interface_versions) + return -1; + const base::flat_map<base::Token, uint32_t>& versions = + init_params_->interface_versions.value(); + auto it = versions.find(interface_uuid); + if (it == versions.end()) + return -1; + return it->second; +} + void LacrosChromeServiceImpl::BindScreenManagerReceiver( mojo::PendingReceiver<crosapi::mojom::ScreenManager> pending_receiver) { DCHECK(IsScreenManagerAvailable());
diff --git a/chromeos/lacros/lacros_chrome_service_impl.h b/chromeos/lacros/lacros_chrome_service_impl.h index 516a9c5..d8f48d9 100644 --- a/chromeos/lacros/lacros_chrome_service_impl.h +++ b/chromeos/lacros/lacros_chrome_service_impl.h
@@ -166,6 +166,12 @@ return init_params_.get(); } + // Returns the version for an ash interface with a given UUID. Returns -1 if + // the interface is not found. This is a synchronous version of + // mojo::Remote::QueryVersion. It relies on Ash M88. Features that need to + // work on M87 or older should not use this. + int GetInterfaceVersion(base::Token interface_uuid) const; + private: // LacrosChromeServiceNeverBlockingState is an implementation detail of this // class.
diff --git a/chromeos/network/policy_util.cc b/chromeos/network/policy_util.cc index 5da5d8b..d7358ff 100644 --- a/chromeos/network/policy_util.cc +++ b/chromeos/network/policy_util.cc
@@ -20,6 +20,7 @@ #include "chromeos/network/shill_property_util.h" #include "components/onc/onc_constants.h" #include "third_party/cros_system_api/dbus/service_constants.h" +#include "third_party/cros_system_api/dbus/shill/dbus-constants.h" namespace chromeos { @@ -374,10 +375,20 @@ // Shill's GetProperties doesn't return credentials. Masking credentials // instead of just removing them, allows remembering if a credential is set // or not. + // + // If we're not saving credentials, explicitly set credentials in UIData to + // empty string so the UI will display empty text fields for them the next + // time they're viewed (instead of masked-out-placeholders, which would + // suggest that a credential has been saved). + const bool saving_credentials = + shill_dictionary->FindBoolKey(shill::kSaveCredentialsProperty) + .value_or(true); + const std::string credential_mask = + saving_credentials ? kFakeCredential : std::string(); std::unique_ptr<base::Value> sanitized_user_settings = base::Value::ToUniquePtrValue( onc::MaskCredentialsInOncObject(onc::kNetworkConfigurationSignature, - *user_settings, kFakeCredential)); + *user_settings, credential_mask)); ui_data->SetUserSettingsDictionary(std::move(sanitized_user_settings)); }
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt new file mode 100644 index 0000000..d6463efe --- /dev/null +++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -0,0 +1 @@ +chromeos-chrome-amd64-atom-88-4277.0-1602497703-benchmark-88.0.4288.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt new file mode 100644 index 0000000..480eb24e --- /dev/null +++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -0,0 +1 @@ +chromeos-chrome-amd64-bigcore-88-4277.0-1602498827-benchmark-88.0.4288.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index 20f5bed..89908e5 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-87-4265.0-1601890590-benchmark-87.0.4280.15-r1.orderfile.xz +chromeos-chrome-orderfile-field-87-4265.0-1601890590-benchmark-87.0.4280.16-r1.orderfile.xz
diff --git a/chromeos/resources/BUILD.gn b/chromeos/resources/BUILD.gn index 8e884f51..eff200b0 100644 --- a/chromeos/resources/BUILD.gn +++ b/chromeos/resources/BUILD.gn
@@ -85,7 +85,7 @@ ] deps = [ - "//chromeos/components/file_manager:file_manager_mojom_js", + "//chromeos/components/file_manager/mojom:mojom_js", "//mojo/public/js:bindings_lite", ] }
diff --git a/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.cc b/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.cc index 638a3c8..2702b81 100644 --- a/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.cc +++ b/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.cc
@@ -84,17 +84,36 @@ if (GetCurrentState() == CurrentState::kValidPendingRequest) { AttemptSetWifiSyncHostStateNetworkRequest(false /* is_retry */); } + + if (ShouldEnableOnVerify()) { + ProcessEnableOnVerifyAttempt(); + } } void WifiSyncFeatureManagerImpl::OnHostStatusChange( const HostStatusProvider::HostStatusWithDevice& host_status_with_device) { - if (GetCurrentState() == CurrentState::kNoVerifiedHost) { + if (GetCurrentState() == CurrentState::kNoVerifiedHost && + !ShouldEnableOnVerify()) { ResetPendingWifiSyncHostNetworkRequest(); } + // kHostSetLocallyButWaitingForBackendConfirmation is only possible if the + // setup flow has been completed on the local device. + if (host_status_with_device.host_status() == + mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation && + features::IsWifiSyncAndroidEnabled()) { + SetPendingWifiSyncHostNetworkRequest( + PendingState::kSetPendingEnableOnVerify); + return; + } + + if (ShouldEnableOnVerify()) { + ProcessEnableOnVerifyAttempt(); + } } void WifiSyncFeatureManagerImpl::OnNewDevicesSynced() { - if (GetCurrentState() != CurrentState::kValidPendingRequest) { + if (GetCurrentState() != CurrentState::kValidPendingRequest && + !ShouldEnableOnVerify()) { ResetPendingWifiSyncHostNetworkRequest(); } } @@ -151,7 +170,13 @@ return CurrentState::kNoVerifiedHost; } - if (GetPendingState() == PendingState::kPendingNone) { + PendingState pending_state = GetPendingState(); + + // If the pending request is kSetPendingEnableOnVerify then there is no + // actionable pending equest. The pending request will be changed from + // kSetPendingEnableOnVerify when the host has been verified. + if (pending_state == PendingState::kPendingNone || + pending_state == PendingState::kSetPendingEnableOnVerify) { return CurrentState::kNoPendingRequest; } @@ -161,7 +186,7 @@ ->GetSoftwareFeatureState( multidevice::SoftwareFeature::kWifiSyncHost) == multidevice::SoftwareFeatureState::kEnabled); - bool pending_enabled = (GetPendingState() == PendingState::kPendingEnable); + bool pending_enabled = (pending_state == PendingState::kPendingEnable); if (pending_enabled == enabled_on_host) { return CurrentState::kPendingMatchesBackend; @@ -265,6 +290,33 @@ } } +bool WifiSyncFeatureManagerImpl::ShouldEnableOnVerify() { + return (GetPendingState() == PendingState::kSetPendingEnableOnVerify); +} + +void WifiSyncFeatureManagerImpl::ProcessEnableOnVerifyAttempt() { + mojom::HostStatus host_status = + host_status_provider_->GetHostWithStatus().host_status(); + + // If host is not set. + if (host_status == mojom::HostStatus::kNoEligibleHosts || + host_status == mojom::HostStatus::kEligibleHostExistsButNoHostSet) { + ResetPendingWifiSyncHostNetworkRequest(); + return; + } + + if (host_status != mojom::HostStatus::kHostVerified) { + return; + } + + if (IsWifiSyncEnabled()) { + ResetPendingWifiSyncHostNetworkRequest(); + return; + } + + SetIsWifiSyncEnabled(true); +} + } // namespace multidevice_setup -} // namespace chromeos \ No newline at end of file +} // namespace chromeos
diff --git a/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.h b/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.h index 995b0d4cf2..7acfaa5 100644 --- a/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.h +++ b/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl.h
@@ -102,7 +102,8 @@ enum class PendingState { kPendingNone = 0, kPendingEnable = 1, - kPendingDisable = 2 + kPendingDisable = 2, + kSetPendingEnableOnVerify = 3 }; enum class CurrentState { @@ -120,6 +121,8 @@ void OnSetWifiSyncHostStateNetworkRequestFinished( bool attempted_to_enable, device_sync::mojom::NetworkRequestResult result_code); + bool ShouldEnableOnVerify(); + void ProcessEnableOnVerifyAttempt(); HostStatusProvider* host_status_provider_; PrefService* pref_service_;
diff --git a/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl_unittest.cc b/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl_unittest.cc index 7455f3e..5d5378e 100644 --- a/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl_unittest.cc +++ b/chromeos/services/multidevice_setup/wifi_sync_feature_manager_impl_unittest.cc
@@ -31,7 +31,12 @@ const char kPendingWifiSyncRequestEnabledPrefName[] = "multidevice_setup.pending_set_wifi_sync_enabled_request"; -enum PendingState { PendingNone = 0, PendingEnable = 1, PendingDisable = 2 }; +enum PendingState { + kPendingNone = 0, + kPendingEnable = 1, + kPendingDisable = 2, + kSetPendingEnableOnVerify = 3 +}; const size_t kNumTestDevices = 4; @@ -47,8 +52,6 @@ // testing::Test: void SetUp() override { - SetFeatureFlags(GetParam() /* use_v1_devicesync */); - // Tests are run once to simulate when v1 DeviceSync is enabled and once to // simulate when it is disabled, leaving only v2 DeviceSync operational. In // the former case, only public keys are needed, and in the latter case, @@ -104,7 +107,7 @@ void CreateDelegate( const base::Optional<multidevice::RemoteDeviceRef>& initial_host, - int initial_pending_wifi_sync_request = PendingNone) { + int initial_pending_wifi_sync_request = kPendingNone) { SetHostInDeviceSyncClient(initial_host); test_pref_service_->SetInteger(kPendingWifiSyncRequestEnabledPrefName, initial_pending_wifi_sync_request); @@ -216,6 +219,33 @@ fake_device_sync_client_->NotifyNewDevicesSynced(); } + void SetFeatureFlags(bool use_v1_devicesync, bool enable_wifi_sync) { + std::vector<base::Feature> enabled_features; + std::vector<base::Feature> disabled_features; + + // These flags have no direct effect of on the wifi sync feature manager; + // however, v2 Enrollment and DeviceSync must be enabled before v1 + // DeviceSync can be disabled. + enabled_features.push_back(chromeos::features::kCryptAuthV2Enrollment); + enabled_features.push_back(chromeos::features::kCryptAuthV2DeviceSync); + + if (use_v1_devicesync) { + disabled_features.push_back( + chromeos::features::kDisableCryptAuthV1DeviceSync); + } else { + enabled_features.push_back( + chromeos::features::kDisableCryptAuthV1DeviceSync); + } + + if (enable_wifi_sync) { + enabled_features.push_back(chromeos::features::kWifiSyncAndroid); + } else { + disabled_features.push_back(chromeos::features::kWifiSyncAndroid); + } + + scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); + } + FakeHostStatusProvider* fake_host_status_provider() { return fake_host_status_provider_.get(); } @@ -235,29 +265,7 @@ const multidevice::RemoteDeviceRefList& test_devices() const { return test_devices_; } - private: - void SetFeatureFlags(bool use_v1_devicesync) { - std::vector<base::Feature> enabled_features; - std::vector<base::Feature> disabled_features; - - // These flags have no direct effect of on the host backend delegate; - // however, v2 Enrollment and DeviceSync must be enabled before v1 - // DeviceSync can be disabled. - enabled_features.push_back(chromeos::features::kCryptAuthV2Enrollment); - enabled_features.push_back(chromeos::features::kCryptAuthV2DeviceSync); - - if (use_v1_devicesync) { - disabled_features.push_back( - chromeos::features::kDisableCryptAuthV1DeviceSync); - } else { - enabled_features.push_back( - chromeos::features::kDisableCryptAuthV1DeviceSync); - } - - scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features); - } - multidevice::RemoteDeviceRefList test_devices_; std::unique_ptr<FakeHostStatusProvider> fake_host_status_provider_; @@ -274,6 +282,8 @@ }; TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, Success) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable wifi sync on host device and succeed @@ -318,6 +328,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, NewDevicesSyncedBeforeCallback) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable wifi sync on host device and succeed @@ -346,6 +358,8 @@ } TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, Failure) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable wifi sync on host device and fail @@ -390,6 +404,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, MultipleRequests_FirstFail_ThenSucceed) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable wifi sync on host device and fail @@ -434,6 +450,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, PendingRequest_NoSyncedHostDevice) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable wifi sync on test_device 0 @@ -463,8 +481,10 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, InitialPendingEnableRequest_NoInitialDevice) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(base::nullopt /* initial_host */, - PendingEnable /* initial_pending_wifi_sync_request_enabled */); + kPendingEnable /* initial_pending_wifi_sync_request*/); EXPECT_EQ(0, GetSetHostNetworkRequestCallbackQueueSize()); EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( @@ -474,8 +494,10 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, InitialPendingEnableRequest_Success) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */, - PendingEnable /* initial_pending_wifi_sync_request_enabled */); + kPendingEnable /* initial_pending_wifi_sync_request*/); EXPECT_EQ(1, GetSetHostNetworkRequestCallbackQueueSize()); EXPECT_TRUE(delegate()->IsWifiSyncEnabled()); @@ -495,6 +517,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, MultiplePendingRequests_EnableDisable) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable->disable->enable wifi sync without invoking any @@ -523,19 +547,23 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, PendingRequest_SyncedHostBecomesUnverified) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */, - PendingEnable /* initial_pending_wifi_sync_request_enabled */); + kPendingEnable /* initial_pending_wifi_sync_request */); fake_host_status_provider()->SetHostWithStatus( mojom::HostStatus::kHostSetButNotYetVerified, test_devices()[0]); EXPECT_EQ( test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), - PendingNone); + kPendingNone); } TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, Retrying_SyncedHostBecomesUnverified) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); SetIsWifiSyncEnabled(true); @@ -556,13 +584,15 @@ mojom::HostStatus::kHostSetButNotYetVerified, test_devices()[0]); EXPECT_EQ( test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), - PendingNone); + kPendingNone); EXPECT_FALSE(mock_timer()->IsRunning()); EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); } TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, FailureCallback_SyncedHostBecomesUnverified) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); SetIsWifiSyncEnabled(true); @@ -577,7 +607,7 @@ mojom::HostStatus::kHostSetButNotYetVerified, test_devices()[0]); EXPECT_EQ( test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), - PendingNone); + kPendingNone); // Invoke failure callback. No retry should be scheduled. InvokePendingSetWifiSyncHostNetworkRequestCallback( @@ -590,6 +620,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, NoVerifiedHost_AttemptToEnable) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); fake_host_status_provider()->SetHostWithStatus( @@ -611,6 +643,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, StatusChangedOnRemoteDevice) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); @@ -625,6 +659,8 @@ TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, SimultaneousRequests_StartOff_ToggleOnOff) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); CreateDelegate(test_devices()[0] /* initial_host */); // Attempt to enable @@ -657,6 +693,168 @@ multidevice::SoftwareFeatureState::kSupported); } +TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, + SetPendingEnableOnVerify_HostSetLocallyThenHostVerified) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); + CreateDelegate(base::nullopt /* initial_host */); + + // kHostSetLocallyButWaitingForBackendConfirmation is only possible if the + // setup flow has been completed on the local device. + SetHostInDeviceSyncClient(test_devices()[0]); + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation, + test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kSetPendingEnableOnVerify); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); + + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostVerified, test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kPendingEnable); + EXPECT_TRUE(delegate()->IsWifiSyncEnabled()); + EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( + multidevice::SoftwareFeature::kWifiSyncHost), + multidevice::SoftwareFeatureState::kSupported); + InvokePendingSetWifiSyncHostNetworkRequestCallback( + device_sync::mojom::NetworkRequestResult::kSuccess, + false /* expected_to_notify_observer_and_start_retry_timer */); + EXPECT_EQ(0, GetSetHostNetworkRequestCallbackQueueSize()); + SetWifiSyncHostInDeviceSyncClient(test_devices()[0], true /* enabled */); + + EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( + multidevice::SoftwareFeature::kWifiSyncHost), + multidevice::SoftwareFeatureState::kEnabled); +} + +TEST_P( + MultiDeviceSetupWifiSyncFeatureManagerImplTest, + SetPendingEnableOnVerify_HostSetLocallyThenHostSetNotVerifiedThenHostVerified) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); + CreateDelegate(base::nullopt /* initial_host */); + + // kHostSetLocallyButWaitingForBackendConfirmation is only possible if the + // setup flow has been completed on the local device. + SetHostInDeviceSyncClient(test_devices()[0]); + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation, + test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kSetPendingEnableOnVerify); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); + + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostSetButNotYetVerified, test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kSetPendingEnableOnVerify); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); + + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostVerified, test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kPendingEnable); + EXPECT_TRUE(delegate()->IsWifiSyncEnabled()); + EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( + multidevice::SoftwareFeature::kWifiSyncHost), + multidevice::SoftwareFeatureState::kSupported); + InvokePendingSetWifiSyncHostNetworkRequestCallback( + device_sync::mojom::NetworkRequestResult::kSuccess, + false /* expected_to_notify_observer_and_start_retry_timer */); + EXPECT_EQ(0, GetSetHostNetworkRequestCallbackQueueSize()); + SetWifiSyncHostInDeviceSyncClient(test_devices()[0], true /* enabled */); + + EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( + multidevice::SoftwareFeature::kWifiSyncHost), + multidevice::SoftwareFeatureState::kEnabled); +} + +TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, + SetPendingEnableOnVerify_WifiSyncFlagOff) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + false /* enable_wifi_sync */); + CreateDelegate(base::nullopt /* initial_host */); + + // kHostSetLocallyButWaitingForBackendConfirmation is only possible if the + // setup flow has been completed on the local device. + SetHostInDeviceSyncClient(test_devices()[0]); + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation, + test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kPendingNone); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); +} + +TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, + SetPendingEnableOnVerify_HostRemoved) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); + CreateDelegate(base::nullopt /* initial_host */); + + // kHostSetLocallyButWaitingForBackendConfirmation is only possible if the + // setup flow has been completed on the local device. + SetHostInDeviceSyncClient(test_devices()[0]); + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostSetLocallyButWaitingForBackendConfirmation, + test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kSetPendingEnableOnVerify); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); + + // Host is added but not verified. + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostSetButNotYetVerified, test_devices()[0]); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kSetPendingEnableOnVerify); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); + + // Host is removed before it was verified. This simulates the user going + // through the forget phone flow before the phone was able to be verified. + // Wifi Sync should stop the enable attempt because it requires a paired host + // device that transitions from unverified to verified. + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kEligibleHostExistsButNoHostSet, base::nullopt); + EXPECT_EQ( + test_pref_service()->GetInteger(kPendingWifiSyncRequestEnabledPrefName), + kPendingNone); + EXPECT_FALSE(delegate()->IsWifiSyncEnabled()); +} + +TEST_P(MultiDeviceSetupWifiSyncFeatureManagerImplTest, + SetPendingEnableOnVerify_InitialPendingRequest) { + SetFeatureFlags(GetParam() /* use_v1_devicesync */, + true /* enable_wifi_sync */); + fake_host_status_provider()->SetHostWithStatus( + mojom::HostStatus::kHostVerified, test_devices()[0]); + CreateDelegate( + test_devices()[0] /* initial_host */, + kSetPendingEnableOnVerify /* initial_pending_wifi_sync_request */); + + EXPECT_TRUE(delegate()->IsWifiSyncEnabled()); + EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( + multidevice::SoftwareFeature::kWifiSyncHost), + multidevice::SoftwareFeatureState::kSupported); + InvokePendingSetWifiSyncHostNetworkRequestCallback( + device_sync::mojom::NetworkRequestResult::kSuccess, + false /* expected_to_notify_observer_and_start_retry_timer */); + EXPECT_EQ(0, GetSetHostNetworkRequestCallbackQueueSize()); + SetWifiSyncHostInDeviceSyncClient(test_devices()[0], true /* enabled */); + + EXPECT_EQ(test_devices()[0].GetSoftwareFeatureState( + multidevice::SoftwareFeature::kWifiSyncHost), + multidevice::SoftwareFeatureState::kEnabled); +} + // Runs tests twice; once with v1 DeviceSync enabled and once with it disabled. // TODO(https://crbug.com/1019206): Remove when v1 DeviceSync is disabled, // when all devices should have an Instance ID.
diff --git a/chromeos/services/network_health/public/mojom/network_diagnostics.mojom b/chromeos/services/network_health/public/mojom/network_diagnostics.mojom index 0bdb2bd5..506bfb6 100644 --- a/chromeos/services/network_health/public/mojom/network_diagnostics.mojom +++ b/chromeos/services/network_health/public/mojom/network_diagnostics.mojom
@@ -36,7 +36,7 @@ kDefaultNetworkAboveLatencyThreshold, // One or more of the non-default networks has failed pings. kUnsuccessfulNonDefaultNetworksPings, - // One of more of the non-default networks has a latency above the threshold. + // One or more of the non-default networks has a latency above the threshold. kNonDefaultNetworksAboveLatencyThreshold, };
diff --git a/chromeos/services/tts/tts_service.cc b/chromeos/services/tts/tts_service.cc index bd4d9e2..cb97c6a 100644 --- a/chromeos/services/tts/tts_service.cc +++ b/chromeos/services/tts/tts_service.cc
@@ -41,9 +41,7 @@ // methods utilize C features only. TtsService::TtsService(mojo::PendingReceiver<mojom::TtsService> receiver) - : service_receiver_(this, std::move(receiver)), - stream_receiver_(this), - got_first_buffer_(false) { + : service_receiver_(this, std::move(receiver)), stream_receiver_(this) { if (setpriority(PRIO_PROCESS, 0, -10 /* real time audio */) != 0) { PLOG(ERROR) << "Unable to request real time priority; performance will be " "impacted."; @@ -62,7 +60,6 @@ void TtsService::BindTtsStream( mojo::PendingReceiver<mojom::TtsStream> receiver, mojo::PendingRemote<audio::mojom::StreamFactory> factory) { - base::AutoLock al(state_lock_); stream_receiver_.Bind(std::move(receiver)); // TODO(accessibility): The sample rate below can change based on the audio @@ -79,8 +76,6 @@ void TtsService::InstallVoice(const std::string& voice_name, const std::vector<uint8_t>& voice_bytes, InstallVoiceCallback callback) { - base::AutoLock al(state_lock_); - // Create a directory to place extracted voice data. base::FilePath voice_data_path(kTempDataDirectory); voice_data_path = voice_data_path.Append(voice_name); @@ -101,8 +96,6 @@ void TtsService::SelectVoice(const std::string& voice_name, SelectVoiceCallback callback) { - base::AutoLock al(state_lock_); - base::FilePath path_prefix = base::FilePath(kTempDataDirectory).Append(voice_name); base::FilePath pipeline_path = path_prefix.Append("pipeline"); @@ -112,8 +105,6 @@ void TtsService::Speak(const std::vector<uint8_t>& text_jspb, SpeakCallback callback) { - base::AutoLock al(state_lock_); - tts_event_observer_.reset(); auto pending_receiver = tts_event_observer_.BindNewPipeAndPassReceiver(); std::move(callback).Run(std::move(pending_receiver)); @@ -125,16 +116,13 @@ return; } - // For lower end devices, pre-fetching the first buffer on the main thread is - // important. Not doing so can cause us to not respond quickly enough in the - // audio rendering thread/callback below. - size_t frames = 0; - first_buf_.first.clear(); - first_buf_.first.resize(libchrometts_.GoogleTtsGetFramesInAudioBuffer()); - first_buf_.second = - libchrometts_.GoogleTtsReadBuffered(&first_buf_.first[0], &frames); - output_device_->Play(); + + is_playing_ = true; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&TtsService::ReadMoreFrames, base::Unretained(this), + true /* is_first_buffer */)); } void TtsService::Stop() { @@ -143,7 +131,6 @@ } void TtsService::SetVolume(float volume) { - base::AutoLock al(state_lock_); output_device_->SetVolume(volume); } @@ -151,69 +138,104 @@ base::TimeTicks delay_timestamp, int prior_frames_skipped, media::AudioBus* dest) { - // Careful to not block the render callback. Only try to acquire the lock - // here, but early return if we are processing a series of other calls. This - // can be extremely important if there's a long queue of pending Speak/Stop - // pairs being processed on the main thread. This can occur if the tts api - // receives lots of tts requests. - if (!state_lock_.Try()) - return 0; - - size_t frames = 0; - float* channel = dest->channel(0); + size_t frames_in_buf = 0; int32_t status = -1; - if (got_first_buffer_) { - status = libchrometts_.GoogleTtsReadBuffered(channel, &frames); - } else { - status = first_buf_.second; - float* buf = &first_buf_.first[0]; - frames = first_buf_.first.size(); - for (size_t i = 0; i < frames; i++) - channel[i] = buf[i]; - } - - if (status <= 0) { - // -1 means an error, 0 means done. - if (status == -1) - tts_event_observer_->OnError(); - - dest->Zero(); - StopLocked(); - state_lock_.Release(); - return 0; - } - - if (frames == 0) { - state_lock_.Release(); - return 0; - } - - if (!got_first_buffer_) { - got_first_buffer_ = true; - tts_event_observer_->OnStart(); - } - - // There's only really ever one timepoint since we play this buffer in one - // chunk. int char_index = -1; - if (libchrometts_.GoogleTtsGetTimepointsCount() > 0) - char_index = libchrometts_.GoogleTtsGetTimepointsCharIndexAtIndex(0); + bool is_first_buffer = false; + { + base::AutoLock al(state_lock_); + if (buffers_.empty()) + return 0; + + const AudioBuffer& buf = buffers_.front(); + + status = buf.status; + + // Done, 0, or error, -1. + if (status <= 0) { + if (status == -1) + tts_event_observer_->OnError(); + else + tts_event_observer_->OnEnd(); + + StopLocked(); + return 0; + } + + char_index = buf.char_index; + is_first_buffer = buf.is_first_buffer; + const float* frames = &buf.frames[0]; + frames_in_buf = buf.frames.size(); + float* channel = dest->channel(0); + for (size_t i = 0; i < frames_in_buf; i++) + channel[i] = frames[i]; + buffers_.pop_front(); + } + + if (is_first_buffer) + tts_event_observer_->OnStart(); + + if (frames_in_buf == 0) + return 0; if (char_index != -1) tts_event_observer_->OnTimepoint(char_index); - state_lock_.Release(); - return frames; + return frames_in_buf; } void TtsService::OnRenderError() {} void TtsService::StopLocked() { + if (!is_playing_) + return; + output_device_->Pause(); - libchrometts_.GoogleTtsFinalizeBuffered(); - if (tts_event_observer_ && got_first_buffer_) - tts_event_observer_->OnEnd(); - got_first_buffer_ = false; + buffers_.clear(); + is_playing_ = false; +} + +void TtsService::ReadMoreFrames(bool is_first_buffer) { + if (!is_playing_) + return; + + AudioBuffer buf; + buf.frames.resize(libchrometts_.GoogleTtsGetFramesInAudioBuffer()); + size_t frames_in_buf = 0; + buf.status = + libchrometts_.GoogleTtsReadBuffered(&buf.frames[0], &frames_in_buf); + + buf.frames.resize(frames_in_buf); + + buf.char_index = -1; + if (libchrometts_.GoogleTtsGetTimepointsCount() > 0) + buf.char_index = libchrometts_.GoogleTtsGetTimepointsCharIndexAtIndex(0); + + buf.is_first_buffer = is_first_buffer; + + { + base::AutoLock al(state_lock_); + buffers_.emplace_back(std::move(buf)); + } + + if (buf.status <= 0) + return; + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&TtsService::ReadMoreFrames, base::Unretained(this), + false /* is_first_buffer */)); +} + +TtsService::AudioBuffer::AudioBuffer() = default; + +TtsService::AudioBuffer::~AudioBuffer() = default; + +TtsService::AudioBuffer::AudioBuffer(TtsService::AudioBuffer&& other) { + frames.swap(other.frames); + status = other.status; + char_index = other.char_index; + is_first_buffer = other.is_first_buffer; } } // namespace tts
diff --git a/chromeos/services/tts/tts_service.h b/chromeos/services/tts/tts_service.h index 0b8d0ab59..061937b 100644 --- a/chromeos/services/tts/tts_service.h +++ b/chromeos/services/tts/tts_service.h
@@ -54,6 +54,8 @@ // Handles stopping tts. void StopLocked() EXCLUSIVE_LOCKS_REQUIRED(state_lock_); + void ReadMoreFrames(bool is_first_buffer); + // Connection to tts in the browser. mojo::Receiver<mojom::TtsService> service_receiver_; @@ -61,26 +63,35 @@ base::Lock state_lock_; // Prebuilt. - LibChromeTtsLoader libchrometts_ GUARDED_BY(state_lock_); + LibChromeTtsLoader libchrometts_; // Connection to tts in the component extension. - mojo::Receiver<mojom::TtsStream> stream_receiver_ GUARDED_BY(state_lock_); + mojo::Receiver<mojom::TtsStream> stream_receiver_; // Connection to send tts events to component extension. - mojo::Remote<mojom::TtsEventObserver> tts_event_observer_ - GUARDED_BY(state_lock_); + mojo::Remote<mojom::TtsEventObserver> tts_event_observer_; // Outputs speech synthesis to audio. - std::unique_ptr<audio::OutputDevice> output_device_ GUARDED_BY(state_lock_); + std::unique_ptr<audio::OutputDevice> output_device_; - // Tracks whether any audio data came as a result of |Speak|. Reset for every - // call to |Speak|. - bool got_first_buffer_ GUARDED_BY(state_lock_); + // Helper group of state to pass from main thread to audio thread. + struct AudioBuffer { + AudioBuffer(); + ~AudioBuffer(); + AudioBuffer(const AudioBuffer& other) = delete; + AudioBuffer(AudioBuffer&& other); - // The first buffer; used for prefetching/warming up the engine for a new - // utterance. The first item is the audio data, the second is the status - // returned by a call to GoogleTtsReadBuffered. - std::pair<std::vector<float>, size_t> first_buf_; + std::vector<float> frames; + int char_index; + int status; + bool is_first_buffer; + }; + + // The queue of audio buffers to be played by the audio thread. + std::deque<AudioBuffer> buffers_ GUARDED_BY(state_lock_); + + // Tracks whether the output device is playing audio. + bool is_playing_ = false; }; } // namespace tts
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index adabae6f..65c27ef 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -37,7 +37,7 @@ <translation id="3820172043799983114">PIN לא חוקי.</translation> <translation id="3838338534323494292">סיסמה חדשה</translation> <translation id="39823212440917567">משימות הדפסה בנות יותר מ-<ph name="NUMBER_OF_DAYS" /> ימים יוסרו</translation> -<translation id="4003259559679196451">הניהול של המכשיר הזה מתבצע מהדומיין<ph name="ENROLLMENT_DOMAIN" /> ואפשר לגשת ממנו אל כל המידע על הפעילות של המשתמשים, כולל דפי אינטרנט שנכנסת אליהם, סיסמאות ואימייל.</translation> +<translation id="4003259559679196451">הניהול של המכשיר הזה מתבצע מהדומיין <ph name="ENROLLMENT_DOMAIN" /> ואפשר לגשת ממנו אל כל המידע על הפעילות של המשתמשים, כולל דפי אינטרנט שנכנסת אליהם, סיסמאות ואימייל.</translation> <translation id="4003384961948020559">נכשלה – מגש הפלט מלא</translation> <translation id="4027485274696301677"><ph name="DEVICE_TYPE" /> זה מנוהל על-ידי <ph name="ENROLLMENT_DOMAIN" />. מנהלי מערכת עשויים להגדיר את המכשיר הזה מרחוק.</translation> <translation id="4034824040120875894">מדפסת</translation>
diff --git a/chromeos/ui/base/tablet_state.cc b/chromeos/ui/base/tablet_state.cc index c657002..b4cde3e 100644 --- a/chromeos/ui/base/tablet_state.cc +++ b/chromeos/ui/base/tablet_state.cc
@@ -26,9 +26,24 @@ g_instance = nullptr; } +void TabletState::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void TabletState::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + bool TabletState::InTabletMode() const { return state_ == TabletState::kInTabletMode || state_ == TabletState::kEnteringTabletMode; } +void TabletState::SetState(State state) { + state_ = state; + + for (auto& observer : observers_) + observer.OnTabletStateChanged(state_); +} + } // namespace chromeos
diff --git a/chromeos/ui/base/tablet_state.h b/chromeos/ui/base/tablet_state.h index b3176c6..b14ca62 100644 --- a/chromeos/ui/base/tablet_state.h +++ b/chromeos/ui/base/tablet_state.h
@@ -6,6 +6,7 @@ #define CHROMEOS_UI_BASE_TABLET_STATE_H_ #include "base/component_export.h" +#include "base/observer_list.h" namespace ash { class TabletModeController; @@ -31,12 +32,21 @@ kExitingTabletMode, }; + class COMPONENT_EXPORT(CHROMEOS_UI_BASE) Observer { + public: + virtual void OnTabletStateChanged(State state) = 0; + + protected: + virtual ~Observer() = default; + }; + TabletState(); TabletState(const TabletState&) = delete; TabletState& operator=(const TabletState&) = delete; ~TabletState(); - // TODO(http://crbug.com/1113900): Introduce Add|RemoveObserver support. + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); // Returns true if the system is in tablet mode. bool InTabletMode() const; @@ -48,7 +58,9 @@ // the tablet state. friend class ash::TabletModeController; - void SetState(State state) { state_ = state; } + void SetState(State state); + + base::ObserverList<Observer>::Unchecked observers_; State state_ = State::kInClamshellMode; };
diff --git a/chromeos/ui/frame/BUILD.gn b/chromeos/ui/frame/BUILD.gn new file mode 100644 index 0000000..6ccf190 --- /dev/null +++ b/chromeos/ui/frame/BUILD.gn
@@ -0,0 +1,35 @@ +# Copyright 2020 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. + +assert(is_chromeos || is_lacros, + "Non-Chrome-OS or Lacros builds must not depend on //chromeos") + +# C++ headers and sources that can be used by both ash and lacros builds. +source_set("frame") { + defines = [ "IS_CHROMEOS_UI_FRAME" ] + + sources = [ + "caption_buttons/caption_button_model.h", + "caption_buttons/frame_back_button.cc", + "caption_buttons/frame_back_button.h", + "caption_buttons/frame_caption_button_container_view.cc", + "caption_buttons/frame_caption_button_container_view.h", + "caption_buttons/frame_size_button.cc", + "caption_buttons/frame_size_button.h", + "caption_buttons/frame_size_button_delegate.h", + "caption_buttons/snap_controller.cc", + "caption_buttons/snap_controller.h", + ] + + deps = [ + "//base", + "//chromeos/ui/base", + "//chromeos/ui/vector_icons", + "//skia", + "//ui/aura", + "//ui/base", + "//ui/strings:ui_strings_grit", + "//ui/views", + ] +}
diff --git a/chromeos/ui/frame/DEPS b/chromeos/ui/frame/DEPS new file mode 100644 index 0000000..b2b9550 --- /dev/null +++ b/chromeos/ui/frame/DEPS
@@ -0,0 +1,10 @@ +include_rules = [ + "+ui/aura", + "+ui/base", + "+ui/compositor/scoped_animation_duration_scale_mode.h", + "+ui/events/event_sink.h", + "+ui/gfx", + "+ui/strings/grit/ui_strings.h", + "+ui/views", + "+third_party/skia", +]
diff --git a/ash/public/cpp/caption_buttons/caption_button_model.h b/chromeos/ui/frame/caption_buttons/caption_button_model.h similarity index 75% rename from ash/public/cpp/caption_buttons/caption_button_model.h rename to chromeos/ui/frame/caption_buttons/caption_button_model.h index 33ff4d5..8593203 100644 --- a/ash/public/cpp/caption_buttons/caption_button_model.h +++ b/chromeos/ui/frame/caption_buttons/caption_button_model.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_PUBLIC_CPP_CAPTION_BUTTONS_CAPTION_BUTTON_MODEL_H_ -#define ASH_PUBLIC_CPP_CAPTION_BUTTONS_CAPTION_BUTTON_MODEL_H_ +#ifndef CHROMEOS_UI_FRAME_CAPTION_BUTTONS_CAPTION_BUTTON_MODEL_H_ +#define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_CAPTION_BUTTON_MODEL_H_ #include "ui/views/window/caption_button_types.h" -namespace ash { +namespace chromeos { // CaptionButtonModel describes the state of caption buttons // for each CaptionButtonIcon types. @@ -26,6 +26,6 @@ virtual bool InZoomMode() const = 0; }; -} // namespace ash +} // namespace chromeos -#endif // ASH_PUBLIC_CPP_CAPTION_BUTTONS_CAPTION_BUTTON_MODEL_H_ +#endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_CAPTION_BUTTON_MODEL_H_
diff --git a/ash/public/cpp/caption_buttons/frame_back_button.cc b/chromeos/ui/frame/caption_buttons/frame_back_button.cc similarity index 93% rename from ash/public/cpp/caption_buttons/frame_back_button.cc rename to chromeos/ui/frame/caption_buttons/frame_back_button.cc index cb2a5ae..f2b9041 100644 --- a/ash/public/cpp/caption_buttons/frame_back_button.cc +++ b/chromeos/ui/frame/caption_buttons/frame_back_button.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/frame_back_button.h" +#include "chromeos/ui/frame/caption_buttons/frame_back_button.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "ui/aura/window.h" @@ -15,7 +15,7 @@ #include "ui/views/window/caption_button_layout_constants.h" #include "ui/views/window/frame_caption_button.h" -namespace ash { +namespace chromeos { FrameBackButton::FrameBackButton() : FrameCaptionButton(this, views::CAPTION_BUTTON_ICON_BACK, HTMENU) { @@ -38,4 +38,4 @@ ignore_result(root_window->GetHost()->SendEventToSink(&release_key_event)); } -} // namespace ash +} // namespace chromeos
diff --git a/chromeos/ui/frame/caption_buttons/frame_back_button.h b/chromeos/ui/frame/caption_buttons/frame_back_button.h new file mode 100644 index 0000000..331de34 --- /dev/null +++ b/chromeos/ui/frame/caption_buttons/frame_back_button.h
@@ -0,0 +1,31 @@ +// 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 CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_BACK_BUTTON_H_ +#define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_BACK_BUTTON_H_ + +#include "base/component_export.h" +#include "ui/views/window/frame_caption_button.h" + +namespace chromeos { + +// A button to send back key events. It's used in Chrome hosted app windows, +// among other places. +class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) FrameBackButton + : public views::FrameCaptionButton, + public views::ButtonListener { + public: + FrameBackButton(); + ~FrameBackButton() override; + + // views::ButtonListener: + void ButtonPressed(Button* sender, const ui::Event& event) override; + + private: + DISALLOW_COPY_AND_ASSIGN(FrameBackButton); +}; + +} // namespace chromeos + +#endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_BACK_BUTTON_H_
diff --git a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc similarity index 97% rename from ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc rename to chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc index a28cfc7..59db93c 100644 --- a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.cc +++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include <cmath> #include <map> -#include "ash/public/cpp/caption_buttons/caption_button_model.h" -#include "ash/public/cpp/caption_buttons/frame_size_button.h" -#include "ash/public/cpp/caption_buttons/snap_controller.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/numerics/ranges.h" #include "chromeos/ui/base/tablet_state.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/frame_size_button.h" +#include "chromeos/ui/frame/caption_buttons/snap_controller.h" #include "ui/aura/window_tree_host.h" #include "ui/base/hit_test.h" #include "ui/base/l10n/l10n_util.h" @@ -31,7 +31,7 @@ #include "ui/views/widget/widget_delegate.h" #include "ui/views/window/frame_caption_button.h" -namespace ash { +namespace chromeos { namespace { @@ -473,7 +473,7 @@ views::FrameCaptionButton* buttons[] = {menu_button_, minimize_button_, size_button_, close_button_}; int min_squared_distance = INT_MAX; - views::FrameCaptionButton* closest_button = NULL; + views::FrameCaptionButton* closest_button = nullptr; for (size_t i = 0; i < base::size(buttons); ++i) { views::FrameCaptionButton* button = buttons[i]; if (!button->GetVisible()) @@ -520,4 +520,4 @@ SnapController::Get()->CommitSnap(frame_->GetNativeWindow(), snap); } -} // namespace ash +} // namespace chromeos
diff --git a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.h b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h similarity index 87% rename from ash/public/cpp/caption_buttons/frame_caption_button_container_view.h rename to chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h index 61cd215..bff904e 100644 --- a/ash/public/cpp/caption_buttons/frame_caption_button_container_view.h +++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ -#define ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ +#ifndef CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ +#define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ #include <map> -#include "ash/public/cpp/ash_public_export.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" -#include "ash/public/cpp/caption_buttons/frame_size_button_delegate.h" -#include "ash/public/cpp/caption_buttons/snap_controller.h" +#include "base/component_export.h" #include "base/macros.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h" +#include "chromeos/ui/frame/caption_buttons/snap_controller.h" #include "ui/views/animation/animation_delegate_views.h" #include "ui/views/controls/button/button.h" #include "ui/views/view.h" @@ -26,11 +26,15 @@ class Widget; } -namespace ash { +namespace chromeos { // Container view for the frame caption buttons. It performs the appropriate // action when a caption button is clicked. -class ASH_PUBLIC_EXPORT FrameCaptionButtonContainerView +// +// NOTE: The associated test (frame_caption_button_container_view_unittest.cc) +// is in //ash because it needs ash test support (AshTestBase and its +// utilities). +class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) FrameCaptionButtonContainerView : public views::View, public views::ButtonListener, public FrameSizeButtonDelegate, @@ -43,7 +47,7 @@ ~FrameCaptionButtonContainerView() override; // For testing. - class ASH_PUBLIC_EXPORT TestApi { + class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) TestApi { public: explicit TestApi(FrameCaptionButtonContainerView* container_view) : container_view_(container_view) {} @@ -166,6 +170,6 @@ DISALLOW_COPY_AND_ASSIGN(FrameCaptionButtonContainerView); }; -} // namespace ash +} // namespace chromeos -#endif // ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_ +#endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_CAPTION_BUTTON_CONTAINER_VIEW_H_
diff --git a/ash/public/cpp/caption_buttons/frame_size_button.cc b/chromeos/ui/frame/caption_buttons/frame_size_button.cc similarity index 97% rename from ash/public/cpp/caption_buttons/frame_size_button.cc rename to chromeos/ui/frame/caption_buttons/frame_size_button.cc index e67f494..7a1e1d58 100644 --- a/ash/public/cpp/caption_buttons/frame_size_button.cc +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.cc
@@ -2,21 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/frame_size_button.h" +#include "chromeos/ui/frame/caption_buttons/frame_size_button.h" #include <memory> -#include "ash/public/cpp/caption_buttons/snap_controller.h" #include "base/i18n/rtl.h" #include "base/metrics/user_metrics.h" #include "chromeos/ui/base/window_properties.h" +#include "chromeos/ui/frame/caption_buttons/snap_controller.h" #include "ui/aura/window.h" #include "ui/aura/window_observer.h" #include "ui/base/hit_test.h" #include "ui/gfx/geometry/vector2d.h" #include "ui/views/widget/widget.h" -namespace ash { +namespace chromeos { namespace { @@ -277,7 +277,7 @@ HitTestButton(closest_button, event_location_in_screen)) { return closest_button; } - return NULL; + return nullptr; } bool FrameSizeButton::CommitSnap(const ui::LocatedEvent& event) { @@ -313,4 +313,4 @@ delegate_->SetButtonsToNormal(animate); } -} // namespace ash +} // namespace chromeos
diff --git a/ash/public/cpp/caption_buttons/frame_size_button.h b/chromeos/ui/frame/caption_buttons/frame_size_button.h similarity index 89% rename from ash/public/cpp/caption_buttons/frame_size_button.h rename to chromeos/ui/frame/caption_buttons/frame_size_button.h index 58023fa..f868d0be 100644 --- a/ash/public/cpp/caption_buttons/frame_size_button.h +++ b/chromeos/ui/frame/caption_buttons/frame_size_button.h
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_H_ -#define ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_H_ +#ifndef CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_H_ +#define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_H_ #include <memory> -#include "ash/public/cpp/ash_public_export.h" -#include "ash/public/cpp/caption_buttons/frame_size_button_delegate.h" +#include "base/component_export.h" #include "base/macros.h" #include "base/timer/timer.h" +#include "chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h" #include "ui/views/window/frame_caption_button.h" -namespace ash { +namespace chromeos { // The maximize/restore button. // When the mouse is pressed over the size button or the size button is touched: @@ -24,7 +24,8 @@ // When the drag terminates, the action for the button underneath the mouse // is executed. For the sake of simplicity, the size button is the event // handler for a click starting on the size button and the entire drag. -class ASH_PUBLIC_EXPORT FrameSizeButton : public views::FrameCaptionButton { +class COMPONENT_EXPORT(CHROMEOS_UI_CAPTION_BUTTONS) FrameSizeButton + : public views::FrameCaptionButton { public: FrameSizeButton(views::ButtonListener* listener, FrameSizeButtonDelegate* delegate); @@ -103,6 +104,6 @@ DISALLOW_COPY_AND_ASSIGN(FrameSizeButton); }; -} // namespace ash +} // namespace chromeos -#endif // ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_H_ +#endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_H_
diff --git a/ash/public/cpp/caption_buttons/frame_size_button_delegate.h b/chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h similarity index 83% rename from ash/public/cpp/caption_buttons/frame_size_button_delegate.h rename to chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h index 7c48f16..8141a775 100644 --- a/ash/public/cpp/caption_buttons/frame_size_button_delegate.h +++ b/chromeos/ui/frame/caption_buttons/frame_size_button_delegate.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_DELEGATE_H_ -#define ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_DELEGATE_H_ +#ifndef CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_DELEGATE_H_ +#define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_DELEGATE_H_ -#include "ash/public/cpp/ash_public_export.h" +#include "base/component_export.h" #include "ui/views/window/caption_button_types.h" namespace gfx { @@ -16,12 +16,12 @@ class FrameCaptionButton; } -namespace ash { +namespace chromeos { enum class SnapDirection; // Delegate interface for FrameSizeButton. -class ASH_PUBLIC_EXPORT FrameSizeButtonDelegate { +class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) FrameSizeButtonDelegate { public: enum Animate { ANIMATE_YES, ANIMATE_NO }; @@ -58,6 +58,6 @@ virtual ~FrameSizeButtonDelegate() {} }; -} // namespace ash +} // namespace chromeos -#endif // ASH_PUBLIC_CPP_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_DELEGATE_H_ +#endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_FRAME_SIZE_BUTTON_DELEGATE_H_
diff --git a/ash/public/cpp/caption_buttons/snap_controller.cc b/chromeos/ui/frame/caption_buttons/snap_controller.cc similarity index 82% rename from ash/public/cpp/caption_buttons/snap_controller.cc rename to chromeos/ui/frame/caption_buttons/snap_controller.cc index 2cf48b9a..3c62788 100644 --- a/ash/public/cpp/caption_buttons/snap_controller.cc +++ b/chromeos/ui/frame/caption_buttons/snap_controller.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/public/cpp/caption_buttons/snap_controller.h" +#include "chromeos/ui/frame/caption_buttons/snap_controller.h" #include "base/check_op.h" -namespace ash { +namespace chromeos { namespace { @@ -29,4 +29,4 @@ g_instance = this; } -} // namespace ash +} // namespace chromeos
diff --git a/ash/public/cpp/caption_buttons/snap_controller.h b/chromeos/ui/frame/caption_buttons/snap_controller.h similarity index 78% rename from ash/public/cpp/caption_buttons/snap_controller.h rename to chromeos/ui/frame/caption_buttons/snap_controller.h index be58f9ec..cd98aa54c 100644 --- a/ash/public/cpp/caption_buttons/snap_controller.h +++ b/chromeos/ui/frame/caption_buttons/snap_controller.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_PUBLIC_CPP_CAPTION_BUTTONS_SNAP_CONTROLLER_H_ -#define ASH_PUBLIC_CPP_CAPTION_BUTTONS_SNAP_CONTROLLER_H_ +#ifndef CHROMEOS_UI_FRAME_CAPTION_BUTTONS_SNAP_CONTROLLER_H_ +#define CHROMEOS_UI_FRAME_CAPTION_BUTTONS_SNAP_CONTROLLER_H_ -#include "ash/public/cpp/ash_public_export.h" +#include "base/component_export.h" namespace aura { class Window; } -namespace ash { +namespace chromeos { // The previewed snap state for a window, corresponding to the use of a // PhantomWindowController. @@ -23,7 +23,7 @@ // This interface handles snap actions to be performed on a top level window. // The singleton that implements the interface is provided by Ash. -class ASH_PUBLIC_EXPORT SnapController { +class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) SnapController { public: virtual ~SnapController(); @@ -43,6 +43,6 @@ SnapController(); }; -} // namespace ash +} // namespace chromeos -#endif // ASH_PUBLIC_CPP_CAPTION_BUTTONS_SNAP_CONTROLLER_H_ +#endif // CHROMEOS_UI_FRAME_CAPTION_BUTTONS_SNAP_CONTROLLER_H_
diff --git a/components/OWNERS b/components/OWNERS index d3c969d..35a66c5 100644 --- a/components/OWNERS +++ b/components/OWNERS
@@ -44,6 +44,7 @@ per-file undo_strings.grdp=file://components/undo/OWNERS per-file version_ui_strings.grdp=file://components/version_ui/OWNERS per-file web_contents_delegate_android_strings.grdp=file://components/embedder_support/android/delegate/OWNERS +per-file webxr_strings.grdp=file://components/webxr/OWNERS # For web_dev_style related changes. per-file .eslintrc.js=file://ui/webui/PLATFORM_OWNERS
diff --git a/components/arc/enterprise/arc_data_snapshotd_manager.cc b/components/arc/enterprise/arc_data_snapshotd_manager.cc index c20c173d..0a331788 100644 --- a/components/arc/enterprise/arc_data_snapshotd_manager.cc +++ b/components/arc/enterprise/arc_data_snapshotd_manager.cc
@@ -11,12 +11,15 @@ #include "base/command_line.h" #include "base/logging.h" #include "base/memory/ptr_util.h" +#include "base/strings/utf_string_conversions.h" #include "base/values.h" #include "chromeos/constants/chromeos_switches.h" #include "chromeos/dbus/upstart/upstart_client.h" #include "components/arc/arc_prefs.h" #include "components/arc/enterprise/arc_data_snapshotd_bridge.h" #include "components/prefs/pref_service.h" +#include "components/session_manager/core/session_manager.h" +#include "components/user_manager/user_manager.h" #include "ui/ozone/public/ozone_switches.h" namespace arc { @@ -34,7 +37,7 @@ constexpr char kPrevious[] = "previous"; constexpr char kLast[] = "last"; constexpr char kBlockedUiReboot[] = "blocked_ui_reboot"; -constexpr char kStartedDate[] = "started_date"; +constexpr char kStarted[] = "started"; bool IsSnapshotEnabled() { // TODO(pbond): implement policy processing. @@ -59,6 +62,9 @@ bool ArcDataSnapshotdManager::is_snapshot_enabled_for_testing_ = false; +// This class is owned by ChromeBrowserMainPartsChromeos. +static ArcDataSnapshotdManager* g_arc_data_snapshotd_manager = nullptr; + ArcDataSnapshotdManager::SnapshotInfo::SnapshotInfo(const base::Value* value, bool last) : is_last_(last) { @@ -153,11 +159,11 @@ ArcDataSnapshotdManager::Snapshot::CreateForTesting( PrefService* local_state, bool blocked_ui_mode, - const std::string& started_date, + bool started, std::unique_ptr<SnapshotInfo> last, std::unique_ptr<SnapshotInfo> previous) { return base::WrapUnique(new ArcDataSnapshotdManager::Snapshot( - local_state, blocked_ui_mode, started_date, std::move(last), + local_state, blocked_ui_mode, started, std::move(last), std::move(previous))); } @@ -182,9 +188,9 @@ blocked_ui_mode_ = found.value(); } { - auto* found = dict->FindStringPath(kStartedDate); - if (found) - started_date_ = *found; + auto found = dict->FindBoolPath(kStarted); + if (found.has_value()) + started_ = found.value(); } } @@ -195,7 +201,7 @@ if (last_) last_->Sync(&dict); dict.SetBoolKey(kBlockedUiReboot, blocked_ui_mode_); - dict.SetStringKey(kStartedDate, started_date_); + dict.SetBoolKey(kStarted, started_); local_state_->Set(arc::prefs::kArcSnapshotInfo, std::move(dict)); } @@ -205,23 +211,42 @@ Sync(); } +void ArcDataSnapshotdManager::Snapshot::StartNewSnapshot() { + previous_ = std::move(last_); + last_ = nullptr; + + started_ = true; + Sync(); +} + ArcDataSnapshotdManager::Snapshot::Snapshot( PrefService* local_state, bool blocked_ui_mode, - const std::string& started_date, + bool started, std::unique_ptr<SnapshotInfo> last, std::unique_ptr<SnapshotInfo> previous) : local_state_(local_state), blocked_ui_mode_(blocked_ui_mode), - started_date_(started_date), + started_(started), last_(std::move(last)), previous_(std::move(previous)) { DCHECK(local_state_); } -ArcDataSnapshotdManager::ArcDataSnapshotdManager(PrefService* local_state) - : snapshot_{local_state} { +// static +ArcDataSnapshotdManager* ArcDataSnapshotdManager::Get() { + return g_arc_data_snapshotd_manager; +} + +ArcDataSnapshotdManager::ArcDataSnapshotdManager( + PrefService* local_state, + base::OnceClosure attempt_user_exit_callback) + : snapshot_{local_state}, + attempt_user_exit_callback_(std::move(attempt_user_exit_callback)) { + DCHECK(!g_arc_data_snapshotd_manager); DCHECK(local_state); + g_arc_data_snapshotd_manager = this; + snapshot_.Parse(); if (IsRestoredSession()) { @@ -237,6 +262,11 @@ } ArcDataSnapshotdManager::~ArcDataSnapshotdManager() { + DCHECK(g_arc_data_snapshotd_manager); + g_arc_data_snapshotd_manager = nullptr; + + session_manager::SessionManager::Get()->RemoveObserver(this); + snapshot_.Sync(); EnsureDaemonStopped(base::DoNothing()); } @@ -261,6 +291,37 @@ StopDaemon(std::move(callback)); } +bool ArcDataSnapshotdManager::IsAutoLoginConfigured() { + switch (state_) { + case ArcDataSnapshotdManager::State::kBlockedUi: + case ArcDataSnapshotdManager::State::kMgsToLaunch: + case ArcDataSnapshotdManager::State::kMgsLaunched: + return true; + case ArcDataSnapshotdManager::State::kNone: + case ArcDataSnapshotdManager::State::kRestored: + return false; + } +} + +bool ArcDataSnapshotdManager::IsAutoLoginAllowed() { + switch (state_) { + case ArcDataSnapshotdManager::State::kBlockedUi: + return false; + case ArcDataSnapshotdManager::State::kNone: + case ArcDataSnapshotdManager::State::kRestored: + case ArcDataSnapshotdManager::State::kMgsLaunched: + case ArcDataSnapshotdManager::State::kMgsToLaunch: + return true; + } +} + +void ArcDataSnapshotdManager::OnSessionStateChanged() { + if (state_ != State::kMgsToLaunch) + return; + if (user_manager::UserManager::Get()->IsLoggedInAsPublicAccount()) + state_ = State::kMgsLaunched; +} + void ArcDataSnapshotdManager::StopDaemon(base::OnceClosure callback) { VLOG(1) << "Stopping arc-data-snapshotd"; daemon_weak_ptr_factory_.InvalidateWeakPtrs(); @@ -331,10 +392,22 @@ void ArcDataSnapshotdManager::OnKeyPairGenerated(bool success) { if (success) { + VLOG(1) << "Managed Guest Session is ready to be started with blocked UI."; state_ = State::kMgsToLaunch; + session_manager::SessionManager::Get()->AddObserver(this); + // Move last to previous snapshot: + snapshot_.StartNewSnapshot(); + + if (!reset_autologin_callback_.is_null()) + std::move(reset_autologin_callback_).Run(); } else { - // TODO(pbond): restart browser to normal. LOG(ERROR) << "Key pair generation failed. Abort snapshot creation."; + + snapshot_.set_blocked_ui_mode(false); + snapshot_.Sync(); + + DCHECK(!attempt_user_exit_callback_.is_null()); + EnsureDaemonStopped(std::move(attempt_user_exit_callback_)); } }
diff --git a/components/arc/enterprise/arc_data_snapshotd_manager.h b/components/arc/enterprise/arc_data_snapshotd_manager.h index 4dec658..aba4e15a 100644 --- a/components/arc/enterprise/arc_data_snapshotd_manager.h +++ b/components/arc/enterprise/arc_data_snapshotd_manager.h
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" +#include "components/session_manager/core/session_manager_observer.h" class PrefService; @@ -26,7 +27,8 @@ // This class manages ARC data/ directory snapshots and controls the lifetime of // the arc-data-snapshotd daemon. -class ArcDataSnapshotdManager final { +class ArcDataSnapshotdManager final + : public session_manager::SessionManagerObserver { public: // State of the flow. enum class State { @@ -109,7 +111,7 @@ static std::unique_ptr<Snapshot> CreateForTesting( PrefService* local_state, bool blocked_ui_mode, - const std::string& started_date, + bool started, std::unique_ptr<SnapshotInfo> last, std::unique_ptr<SnapshotInfo> previous); @@ -121,14 +123,22 @@ // if |last| is true or previous otherwise. void ClearSnapshot(bool last); + // Moves last snapshot to previous and updates a |start_date| to the current + // date. + void StartNewSnapshot(); + + void set_blocked_ui_mode(bool blocked_ui_mode) { + blocked_ui_mode_ = blocked_ui_mode; + } bool is_blocked_ui_mode() const { return blocked_ui_mode_; } + bool started() const { return started_; } SnapshotInfo* last() { return last_.get(); } SnapshotInfo* previous() { return previous_.get(); } private: Snapshot(PrefService* local_state, bool blocked_ui_mode, - const std::string& started_date, + bool started, std::unique_ptr<SnapshotInfo> last, std::unique_ptr<SnapshotInfo> previous); @@ -138,32 +148,49 @@ // Values should be kept in sync with values stored in arc.snapshot // preference. bool blocked_ui_mode_ = false; - std::string started_date_; + bool started_; std::unique_ptr<SnapshotInfo> last_; std::unique_ptr<SnapshotInfo> previous_; }; - explicit ArcDataSnapshotdManager(PrefService* local_state); + ArcDataSnapshotdManager(PrefService* local_state, + base::OnceClosure attempt_user_exit_callback); ArcDataSnapshotdManager(const ArcDataSnapshotdManager&) = delete; ArcDataSnapshotdManager& operator=(const ArcDataSnapshotdManager&) = delete; - ~ArcDataSnapshotdManager(); + ~ArcDataSnapshotdManager() override; + + static ArcDataSnapshotdManager* Get(); // Starts arc-data-snapshotd. void EnsureDaemonStarted(base::OnceClosure callback); // Stops arc-data-snapshotd. void EnsureDaemonStopped(base::OnceClosure callback); + // Returns true if autologin to public account should be performed. + bool IsAutoLoginConfigured(); + // Returns true if autologin is allowed to be performed and manager is not + // waiting for the response from arc-data-snapshotd daemon. + bool IsAutoLoginAllowed(); + + // session_manager::SessionManagerObserver: + void OnSessionStateChanged() override; + // Get |bridge_| for testing. ArcDataSnapshotdBridge* bridge() { return bridge_.get(); } State state() const { return state_; } + void set_reset_autologin_callback(base::OnceClosure callback) { + reset_autologin_callback_ = std::move(callback); + } + static void set_snapshot_enabled_for_testing(bool enabled) { is_snapshot_enabled_for_testing_ = enabled; } static bool is_snapshot_enabled_for_testing() { return is_snapshot_enabled_for_testing_; } + void set_state_for_testing(State state) { state_ = state; } private: // Attempts to arc-data-snapshotd daemon regardless of state of the class. @@ -201,6 +228,11 @@ std::unique_ptr<ArcDataSnapshotdBridge> bridge_; + base::OnceClosure attempt_user_exit_callback_; + + // Callback to reset an autologin timer once userless MGS is ready to start. + base::OnceClosure reset_autologin_callback_; + // Used for cancelling previously posted tasks to daemon. base::WeakPtrFactory<ArcDataSnapshotdManager> daemon_weak_ptr_factory_{this}; // WeakPtrFactory to use for callbacks.
diff --git a/components/arc/enterprise/arc_data_snapshotd_manager_unittest.cc b/components/arc/enterprise/arc_data_snapshotd_manager_unittest.cc index d645161..5b172890 100644 --- a/components/arc/enterprise/arc_data_snapshotd_manager_unittest.cc +++ b/components/arc/enterprise/arc_data_snapshotd_manager_unittest.cc
@@ -9,6 +9,7 @@ #include "base/bind_helpers.h" #include "base/command_line.h" #include "base/memory/ptr_util.h" +#include "base/test/bind_test_util.h" #include "base/test/task_environment.h" #include "chromeos/constants/chromeos_switches.h" #include "chromeos/dbus/arc/fake_arc_data_snapshotd_client.h" @@ -17,6 +18,7 @@ #include "components/arc/arc_prefs.h" #include "components/arc/enterprise/arc_data_snapshotd_bridge.h" #include "components/prefs/testing_pref_service.h" +#include "components/session_manager/core/session_manager.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/ozone/public/ozone_switches.h" @@ -103,6 +105,7 @@ private: TestingPrefServiceSimple local_state_; std::unique_ptr<TestUpstartClient> upstart_client_; + session_manager::SessionManager session_manager_; }; // Tests flows in ArcDataSnapshotdManager: @@ -125,7 +128,9 @@ } // Check number of snapshots in local_state. - void CheckSnapshotsNumber(int expected_number) { + void CheckSnapshots(int expected_snapshots_number, + bool expected_blocked_ui = true, + bool expected_snapshot_started = false) { ArcDataSnapshotdManager::Snapshot snapshot(local_state()); snapshot.Parse(); int actual_number = 0; @@ -135,12 +140,14 @@ if (snapshot.last()) { actual_number++; } - EXPECT_EQ(expected_number, actual_number); + EXPECT_EQ(expected_snapshots_number, actual_number); + EXPECT_EQ(expected_blocked_ui, snapshot.is_blocked_ui_mode()); + EXPECT_EQ(expected_snapshot_started, snapshot.started()); } // Set up local_state with info for previous and last snapshots and blocked ui // mode. - void SetupLocalState() { + void SetupLocalState(bool blocked_ui_mode) { auto last = ArcDataSnapshotdManager::SnapshotInfo::CreateForTesting( "" /* os_version */, "" /* creation_date */, false /* verified */, false /* updated */, true /* last */); @@ -148,11 +155,16 @@ "" /* os_version */, "" /* creation_date */, false /* verified */, false /* updated */, false /* last */); auto snapshot = ArcDataSnapshotdManager::Snapshot::CreateForTesting( - local_state(), true /* blocked_ui_mode */, "" /* started_date */, - std::move(last), std::move(previous)); + local_state(), blocked_ui_mode, false /* started */, std::move(last), + std::move(previous)); snapshot->Sync(); } + void TearDownLocalState() { + ArcDataSnapshotdManager::Snapshot snapshot(local_state()); + snapshot.Sync(); + } + void RunUntilIdle() { if (is_dbus_client_available()) { task_environment_.RunUntilIdle(); @@ -170,7 +182,9 @@ // Test basic scenario: start / stop arc-data-snapshotd. TEST_F(ArcDataSnapshotdManagerBasicTest, Basic) { - ArcDataSnapshotdManager manager(local_state()); + // Daemon stopped in ctor, since no need to be running. + ExpectStopDaemon(false /* success */); + ArcDataSnapshotdManager manager(local_state(), base::DoNothing()); EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kNone); EXPECT_FALSE(manager.bridge()); @@ -186,7 +200,9 @@ // Test a double start scenario: start arc-data-snapshotd twice. // Upstart job returns "false" if the job is already running. TEST_F(ArcDataSnapshotdManagerBasicTest, DoubleStart) { - ArcDataSnapshotdManager manager(local_state()); + // Daemon stopped in ctor, since no need to be running. + ExpectStopDaemon(false /* success */); + ArcDataSnapshotdManager manager(local_state(), base::DoNothing()); EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kNone); EXPECT_FALSE(manager.bridge()); @@ -208,7 +224,11 @@ // Test that arc-data-snapshotd daemon is already stopped when |manager| tries // to stop it. TEST_F(ArcDataSnapshotdManagerBasicTest, UpstartFailures) { - ArcDataSnapshotdManager manager(local_state()); + // Daemon stopped in ctor, since no need to be running. + ExpectStopDaemon(false /* success */); + + ArcDataSnapshotdManager manager(local_state(), base::DoNothing()); + EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kNone); EXPECT_FALSE(manager.bridge()); @@ -225,8 +245,11 @@ SetUpRestoredSessionCommandLine(); // The attempt to stop the daemon, started before crash. ExpectStopDaemon(true /*success */); - ArcDataSnapshotdManager manager(local_state()); + ArcDataSnapshotdManager manager(local_state(), base::DoNothing()); EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kRestored); + EXPECT_FALSE(manager.IsAutoLoginConfigured()); + EXPECT_TRUE(manager.IsAutoLoginAllowed()); + EXPECT_FALSE(manager.bridge()); ExpectStartDaemon(true /*success */); @@ -239,8 +262,9 @@ // Test clear snapshots flow. TEST_P(ArcDataSnapshotdManagerFlowTest, ClearSnapshotsBasic) { // Set up two snapshots (previous and last) in local_state. - SetupLocalState(); - CheckSnapshotsNumber(2 /* expected_number */); + SetupLocalState(false /* blocked_ui_mode */); + CheckSnapshots(2 /* expected_snapshots_number */, + false /* expected_blocked_ui_mode */); // Once |manager| is created, it tries to clear both snapshots, because the // mechanism is disabled by default, and stop the daemon. @@ -248,21 +272,25 @@ ExpectStartDaemon(true /*success */); // Stop once finished clearing. ExpectStopDaemon(true /*success */); - ArcDataSnapshotdManager manager(local_state()); + ArcDataSnapshotdManager manager(local_state(), base::DoNothing()); RunUntilIdle(); // No snapshots in local_state either. EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kNone); - CheckSnapshotsNumber(0 /* expected_number */); + EXPECT_FALSE(manager.IsAutoLoginConfigured()); + EXPECT_TRUE(manager.IsAutoLoginAllowed()); + CheckSnapshots(0 /* expected_snapshots_number */, + false /* expected_blocked_ui_mode */); EXPECT_FALSE(manager.bridge()); + TearDownLocalState(); } // Test blocked UI mode flow. TEST_P(ArcDataSnapshotdManagerFlowTest, BlockedUiBasic) { // Set up two snapshots (previous and last) in local_state. - SetupLocalState(); - CheckSnapshotsNumber(2 /* expected_number */); + SetupLocalState(true /* blocked_ui_mode */); + CheckSnapshots(2 /* expected_snapshots_number */); // Enable snapshotting mechanism for testing. ArcDataSnapshotdManager::set_snapshot_enabled_for_testing(true /* enabled */); @@ -272,21 +300,39 @@ ExpectStartDaemon(true /*success */); // Stop once finished clearing. ExpectStopDaemon(true /*success */); - ArcDataSnapshotdManager manager(local_state()); + bool is_attempt_user_exit_called = false; + ArcDataSnapshotdManager manager( + local_state(), + base::BindLambdaForTesting([&is_attempt_user_exit_called]() { + is_attempt_user_exit_called = true; + })); CheckHeadlessMode(); EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kBlockedUi); + EXPECT_TRUE(manager.IsAutoLoginConfigured()); + EXPECT_FALSE(manager.IsAutoLoginAllowed()); + RunUntilIdle(); - // Snapshots are valid, no need to clear. - CheckSnapshotsNumber(2 /* expected_number */); + if (is_dbus_client_available()) { + EXPECT_FALSE(is_attempt_user_exit_called); + EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kMgsToLaunch); + EXPECT_TRUE(manager.IsAutoLoginConfigured()); + EXPECT_TRUE(manager.IsAutoLoginAllowed()); - auto expected_state = is_dbus_client_available() - ? ArcDataSnapshotdManager::State::kMgsToLaunch - : ArcDataSnapshotdManager::State::kBlockedUi; - - // The communication is established and MGS can be launched. - EXPECT_EQ(manager.state(), expected_state); - EXPECT_TRUE(manager.bridge()); + EXPECT_TRUE(manager.bridge()); + // Starts a last snapshot creation. last became previous. + CheckSnapshots(1 /* expected_snapshots_number */, + true /*expected_blocked_ui */, + true /* expected_snapshot_started */); + } else { + EXPECT_TRUE(is_attempt_user_exit_called); + EXPECT_EQ(manager.state(), ArcDataSnapshotdManager::State::kBlockedUi); + EXPECT_FALSE(manager.bridge()); + // Snapshots are valid. No need to clear. + CheckSnapshots(2 /* expected_snapshots_number */, + false /* expected_blocked_ui */); + } + TearDownLocalState(); } INSTANTIATE_TEST_SUITE_P(ArcDataSnapshotdManagerFlowTest,
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java index aec63081..0ba2bb7 100644 --- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java +++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java
@@ -121,13 +121,12 @@ * Temporarily saves the given set of image bytes and provides that URI to a callback for * sharing. * - * @param context The context used to trigger the share action. * @param imageData The image data to be shared in |fileExtension| format. * @param fileExtension File extension which |imageData| encoded to. * @param callback A provided callback function which will act on the generated URI. */ - public static void generateTemporaryUriFromData(final Context context, final byte[] imageData, - String fileExtension, Callback<Uri> callback) { + public static void generateTemporaryUriFromData( + final byte[] imageData, String fileExtension, Callback<Uri> callback) { if (imageData.length == 0) { Log.w(TAG, "Share failed -- Received image contains no data."); return; @@ -153,13 +152,12 @@ /** * Temporarily saves the bitmap and provides that URI to a callback for sharing. * - * @param context The Context to use for determining download location. * @param filename The filename without extension. * @param bitmap The Bitmap to download. * @param callback A provided callback function which will act on the generated URI. */ public static void generateTemporaryUriFromBitmap( - final Context context, String fileName, Bitmap bitmap, Callback<Uri> callback) { + String fileName, Bitmap bitmap, Callback<Uri> callback) { OnImageSaveListener listener = new OnImageSaveListener() { @Override public void onImageSaved(Uri uri, String displayName) {
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtilsTest.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtilsTest.java index 087d535..11316f50 100644 --- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtilsTest.java +++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtilsTest.java
@@ -121,7 +121,7 @@ private Uri generateAnImageToClipboard(String fileExtension) throws TimeoutException { GenerateUriCallback imageCallback = new GenerateUriCallback(); ShareImageFileUtils.generateTemporaryUriFromData( - getActivity(), TEST_IMAGE_DATA, fileExtension, imageCallback); + TEST_IMAGE_DATA, fileExtension, imageCallback); imageCallback.waitForCallback(0, 1, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); Clipboard.getInstance().setImageUri(imageCallback.getImageUri()); CriteriaHelper.pollInstrumentationThread(() -> {
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index db665575..d23be9d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Laat vol MIDI-toestelbeheer toe</translation> <translation id="1509960214886564027">Kenmerke op baie werwe kan breek</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Toegang tot jou kamera</translation> <translation id="1660204651932907780">Laat werwe toe om klank te speel (aanbeveel)</translation> <translation id="1677097821151855053">Webkoekies en ander werfdata word gebruik om jou te onthou, byvoorbeeld om jou aan te meld of om advertensies te personaliseer. Sien <ph name="BEGIN_LINK" />Instellings<ph name="END_LINK" /> om webkoekies vir alle werwe te bestuur.</translation> <translation id="1688867105868176567">Vee werfdata uit?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" /> word toegelaat}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" /> word toegelaat}}</translation> <translation id="2434158240863470628">Aflaai is voltooi <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Liggingtoegang</translation> <translation id="2482878487686419369">Kennisgewings</translation> <translation id="2490684707762498678">Bestuur deur <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Hulp en terugvoer</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Skakel toestemmings vir <ph name="APP_NAME" /> in <ph name="BEGIN_LINK" />Android-instellings<ph name="END_LINK" /> aan.</translation> -<translation id="945632385593298557">Toegang tot jou mikrofoon</translation> <translation id="965817943346481315">Blokkeer as werf indringerige of misleidende advertensies wys (aanbeveel)</translation> <translation id="967624055006145463">Data geberg</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index 1417967..99d3561 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">ሙሉ የMIDI መሣሪያዎች መቆጣጠርን ያስችላል</translation> <translation id="1509960214886564027">በበርካታ ጣቢያዎች ላይ ያሉ ባሕሪያት ሊሰበሩ ይችላሉ</translation> <translation id="1620510694547887537">ካሜራ</translation> -<translation id="1647391597548383849">ካሜራዎን ይድረሱ</translation> <translation id="1660204651932907780">ጣቢያዎች ድምጽን እንዲያጫውቱ ፍቀድ (የሚመከር)</translation> <translation id="1677097821151855053">ኩኪዎች እና ሌላ የጣቢያ ውሂብ እርስዎን ለማስታወስ ያገለግላሉ፣ ለምሳሌ እርስዎን ለማስገባት ወይም ማስታወቂያዎችን ግላዊ ለማድረግ። ለሁሉም ጣቢያዎች ኩኪዎችን ለማቀናበር፣ <ph name="BEGIN_LINK" />ቅንብሮችን<ph name="END_LINK" /> ይመልከቱ።</translation> <translation id="1688867105868176567">የጣቢያ ውሂብ ይጸዳ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> ሜባ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ ተፈቅደዋል}one{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" /> እና <ph name="NUM_MORE" /> ተጨማሪ ተፈቅደዋል}other{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" /> እና <ph name="NUM_MORE" /> ተጨማሪ ተፈቅደዋል}}</translation> <translation id="2434158240863470628">ማውረድ ተጠናቅቋል <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">የአካባቢ መዳረሻ</translation> <translation id="2482878487686419369">ማስታወቂያዎች</translation> <translation id="2490684707762498678">በ<ph name="APP_NAME" /> የሚተዳደር ነው</translation> <translation id="2498359688066513246">እገዛ እና ግብረመልስ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ብሉቱዝ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ}one{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ}other{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ}}</translation> <translation id="913657688200966289">ለ <ph name="APP_NAME" /> በ <ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ፈቃዶችን ያብሩ።</translation> -<translation id="945632385593298557">የእርስዎን ማይክሮፎን ይድረሱ</translation> <translation id="965817943346481315">ጣቢያው ረባሽ ወይም አሳሳች ማስታወቂያዎችን የሚያሳይ ከሆነ ማገድ (የሚመከር)</translation> <translation id="967624055006145463">የተከማቸ ውሂብ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 26081229..4862c8d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">السماح بالتحكم الكامل لأجهزة MIDI</translation> <translation id="1509960214886564027">قد تتوقف الميزات عن العمل في العديد من المواقع الإلكترونية.</translation> <translation id="1620510694547887537">الكاميرا</translation> -<translation id="1647391597548383849">الدخول إلى الكاميرا</translation> <translation id="1660204651932907780">السماح للمواقع الإلكترونية بتشغيل الصوت (موصى به)</translation> <translation id="1677097821151855053">يتم استخدام ملفات تعريف الارتباط وبيانات المواقع الإلكترونية الأخرى لتذكُّرك بهدف تسجيل دخولك أو تقديم إعلانات مخصّصة لك مثلاً. لإدارة ملفات تعريف الارتباط لجميع المواقع الإلكترونية، يمكنك الاطّلاع على <ph name="BEGIN_LINK" />الإعدادات<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">هل تريد محو بيانات الموقع الإلكتروني؟</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> ميغابايت</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{تم السماح بالوصول إلى <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> وإذن واحد (<ph name="NUM_MORE" />) آخر.}zero{تم السماح بالوصول إلى <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> إذن آخر.}two{تم السماح بالوصول إلى <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> وإذنَين (<ph name="NUM_MORE" />) آخرَين.}few{تم السماح بالوصول إلى <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> أذونات أخرى.}many{تم السماح بالوصول إلى <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> إذنًا آخر.}other{تم السماح بالوصول إلى <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> إذن آخر.}}</translation> <translation id="2434158240863470628">اكتمل التنزيل <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">تحديد الموقع الجغرافي</translation> <translation id="2482878487686419369">الإشعارات</translation> <translation id="2490684707762498678">تتم إدارتها من خلال <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">المساعدة والتعليقات</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">بلوتوث</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> وإذن واحد (<ph name="NUM_MORE" />) آخر}zero{<ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> إذن آخر}two{<ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> وإذنان (<ph name="NUM_MORE" />) آخران}few{<ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> أذونات أخرى}many{<ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> إذنًا آخر}other{<ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" /> و<ph name="NUM_MORE" /> إذن آخر}}</translation> <translation id="913657688200966289">فعِّل الأذونات لتطبيق <ph name="APP_NAME" /> في <ph name="BEGIN_LINK" />إعدادات Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">الدخول إلى الميكروفون</translation> <translation id="965817943346481315">الحظر في حال كان الموقع الإلكتروني يعرض إعلانات مضلِّلة أو غير مرغوب فيها (مُستحسَن)</translation> <translation id="967624055006145463">البيانات المُخزَّنة</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index 312c9f5..88c8f22 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ডিভাইচৰ সম্পূর্ণ নিয়ন্ত্ৰণৰ অনুমতি দিয়া</translation> <translation id="1509960214886564027">বহুতো ছাইটৰ সুবিধাসমূহ ব্যাহত হ’ব পাৰে</translation> <translation id="1620510694547887537">কেমেৰা</translation> -<translation id="1647391597548383849">আপোনাৰ কেমেৰাৰ এক্সেছ</translation> <translation id="1660204651932907780">ছাইটবোৰক ধ্বনি প্লে’ কৰিবলৈ অনুমতি দিয়ক (চুপাৰিছ কৰা)</translation> <translation id="1677097821151855053">কুকিসমূহ আৰু ছাইটৰ অন্য ডেটা আপোনাক মনত ৰাখিবলৈ ব্যৱহাৰ কৰা হয়, উদাহৰণস্বৰূপে, আপোনাক ছাইন ইন কৰাবলৈ অথবা বিজ্ঞাপনসমূহ ব্যক্তিগতকৰণ কৰিবলৈ। সকলো ছাইটৰ বাবে কুকিসমূহ পৰিচালনা কৰিবলৈ <ph name="BEGIN_LINK" />ছেটিংসমূহ<ph name="END_LINK" /> চাওক।</translation> <translation id="1688867105868176567">ছাইটৰ ডেটা মচিবনে?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> এম. বি.</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> আৰু <ph name="NUM_MORE" /> টাৰ অনুমতি দিয়া আছে}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> আৰু <ph name="NUM_MORE" /> টাৰ অনুমতি দিয়া আছে}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> আৰু <ph name="NUM_MORE" /> টাৰ অনুমতি দিয়া আছে}}</translation> <translation id="2434158240863470628">ডাউনল’ড সম্পূর্ণ হৈছে <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">অৱস্থানৰ এক্সেছ</translation> <translation id="2482878487686419369">জাননী</translation> <translation id="2490684707762498678"><ph name="APP_NAME" />এ পৰিচালনা কৰে</translation> <translation id="2498359688066513246">সহায় আৰু মতামত</translation> @@ -302,7 +300,6 @@ <translation id="9074739597929991885">ব্লুটুথ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> আৰু <ph name="NUM_MORE" /> টা}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> আৰু <ph name="NUM_MORE" /> টা}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> আৰু <ph name="NUM_MORE" /> টা}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />ত <ph name="APP_NAME" />ৰ বাবে অনুমতিসমূহ অন কৰক।</translation> -<translation id="945632385593298557">আপোনাৰ মাইক্ৰ'ফ'ন এক্সেছ কৰক</translation> <translation id="965817943346481315">কোনো ছাইটে অননুমোদিত বা বিভ্ৰান্তিকৰ বিজ্ঞাপন দেখুৱালে সেয়া অৱৰোধ কৰক ( চুপাৰিছ কৰা)</translation> <translation id="967624055006145463">ডেটা সঞ্চয় কৰা হ’ল</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index 98f264e..ad7fe3e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI cihazlar üzərində tam nəzarətə icazə verin</translation> <translation id="1509960214886564027">Bir çox saytdakı xüsusiyyətlər işləməyə bilər</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Kameranıza daxil olun</translation> <translation id="1660204651932907780">Saytlara səs oxutmaq icazəsi verin (məsləhətli)</translation> <translation id="1677097821151855053">Kukilər və digər sayt datası sizin yadda saxlamaq üçün istifadə edilir, məsələn, daxil olmanıza və ya reklamları fərdiləşdirməyə imkan yaradır. Bütün saytlar üçün kukiləri idarə etmək üçün <ph name="BEGIN_LINK" />Ayarlara<ph name="END_LINK" /> baxın.</translation> <translation id="1688867105868176567">Sayt datası təmizlənsin?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> üçün icazə verilib}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> üçün icazə verilib}}</translation> <translation id="2434158240863470628">Endirmə tamamlandı <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Məkan girişi</translation> <translation id="2482878487686419369">Bildirişlər</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> tərəfindən idarə edilir</translation> <translation id="2498359688066513246">Yardım və geri əlaqə</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> icazə}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> icazə}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> üçün icazələri <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> aktiv edin.</translation> -<translation id="945632385593298557">Mikrofonunuza giriş</translation> <translation id="965817943346481315">Sayt inadçı və ya aldadıcı reklamlar göstərirsə, blok edin (tövsiyə olunur)</translation> <translation id="967624055006145463">Yadda saxlanmış data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb index b146187..0a3fde2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Дазв. поўны кантроль MIDI-прылад</translation> <translation id="1509960214886564027">Функцыі на многіх сайтах могуць перастаць працаваць</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Доступ да камеры</translation> <translation id="1660204651932907780">Дазволіць сайтам прайграваць гук (рэкамендуецца)</translation> <translation id="1677097821151855053">Файлы cookie і іншыя даныя сайта выкарыстоўваюцца, каб запомніць вас (напрыклад, калі вы ўваходзіце ва ўліковы запіс) або для персаналізацыі змесціва. Каб кіраваць файламі cookie для ўсіх сайтаў, перайдзіце ў <ph name="BEGIN_LINK" />Налады<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Выдаліць даныя сайта?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> МБ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Дазволены <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}one{Дазволены <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}few{Дазволены <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}many{Дазволены <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}other{Дазволены <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Спампоўванне завершана <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Доступ да даных геалакацыі</translation> <translation id="2482878487686419369">Апавяшчэнні</translation> <translation id="2490684707762498678">Пад кіраваннем праграмы "<ph name="APP_NAME" />"</translation> <translation id="2498359688066513246">Даведка і водгукі</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Уключыце для праграмы "<ph name="APP_NAME" />" дазволы ў <ph name="BEGIN_LINK" />Наладах Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Доступ да мікрафона</translation> <translation id="965817943346481315">Блакіраваць, калі сайт паказвае назойлівую рэкламу або рэкламу, якая ўводзіць у зман (рэкамендуецца)</translation> <translation id="967624055006145463">Захаваныя даныя</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb index 2c126e34..8afdf14 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Разр. на пълния контрол над MIDI</translation> <translation id="1509960214886564027">Функциите в много сайтове може да не работят правилно</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Достъп до камерата</translation> <translation id="1660204651932907780">Разрешаване на сайтовете да възпроизвеждат звук (препоръчително)</translation> <translation id="1677097821151855053">„Бисквитките“ и другите данни за сайтове се използват с цел да бъдете запомнени, като например за влизане в профила ви или за персонализиране на реклами. За да управлявате „бисквитките“ за всички сайтове, вижте <ph name="BEGIN_LINK" />настройките<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Да се изчистят ли данните за сайта?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> МБ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Достъпът до <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и още <ph name="NUM_MORE" /> е разрешен}other{Достъпът до <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и още <ph name="NUM_MORE" /> е разрешен}}</translation> <translation id="2434158240863470628">Изтеглянето завърши <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Достъп до местоположението</translation> <translation id="2482878487686419369">Известия</translation> <translation id="2490684707762498678">Управляват се от <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Помощ и отзиви</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и още <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и още <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Включете разрешенията за <ph name="APP_NAME" /> от <ph name="BEGIN_LINK" />настройките на Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Достъп до микрофона</translation> <translation id="965817943346481315">Блокиране, ако на сайта се показват натрапчиви или подвеждащи реклами (препоръчително)</translation> <translation id="967624055006145463">Съхранени данни</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb index ad267a01..e535632 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ডিভাইসগুলির পূর্ণ নিয়ন্ত্রণের অনুমতি দিন</translation> <translation id="1509960214886564027">একাধিক সাইটের ফিচারগুলি কাজ নাও করতে পারে</translation> <translation id="1620510694547887537">ক্যামেরা</translation> -<translation id="1647391597548383849">আপনার ক্যামেরা অ্যাক্সেস করুন</translation> <translation id="1660204651932907780">সাউন্ডটি প্লে করার জন্য সাইটটিতে অনুমতি দিন (প্রস্তাবিত)</translation> <translation id="1677097821151855053">কুকি এবং অন্যন্য সাইটের ডেটা আপনার অ্যাকাউন্টের তথ্য মনে রাখে, যেমন আপনাকে সাইন-ইন করানোর সময় অথবা আপনার পছন্দমতো বিজ্ঞাপন দেখানোর সময়। সব সাইটের জন্য কুকি ম্যানেজ করতে, <ph name="BEGIN_LINK" />সেটিংস<ph name="END_LINK" /> দেখুন।</translation> <translation id="1688867105868176567">সাইট ডেটা খালি করতে চান?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> এমবি</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ও আরও <ph name="NUM_MORE" />টি সুবিধা ব্যবহারের অনুমতি দেওয়া হয়েছে}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ও আরও <ph name="NUM_MORE" />টি সুবিধা ব্যবহারের অনুমতি দেওয়া হয়েছে}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ও আরও <ph name="NUM_MORE" />টি সুবিধা ব্যবহারের অনুমতি দেওয়া হয়েছে}}</translation> <translation id="2434158240863470628"><ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /> ডাউনলোড সম্পূর্ণ হয়েছে</translation> -<translation id="2440823041667407902">লোকেশন অ্যাক্সেস</translation> <translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ম্যানেজ করে</translation> <translation id="2498359688066513246">সহায়তা ও প্রতিবার্তা</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ব্লুটুথ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ও আরও <ph name="NUM_MORE" />টি সুবিধা}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ও আরও <ph name="NUM_MORE" />টি সুবিধা}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ও আরও <ph name="NUM_MORE" />টি সুবিধা}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android সেটিংসে<ph name="END_LINK" /> <ph name="APP_NAME" />-এর জন্য অনুমতিগুলি চালু করুন।</translation> -<translation id="945632385593298557">আপনার মাইক্রোফোন অ্যাক্সেস করুন</translation> <translation id="965817943346481315">সাইটে থাকা ব্যাঘাত সৃষ্টিকারী বা বিভ্রান্তিকর বিজ্ঞাপন ব্লক করুন (প্রস্তাবিত)</translation> <translation id="967624055006145463">ডেটা স্টোর করা হয়েছে</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index 0378cb34..f28aa71 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Puna kontrola MIDI uređaja</translation> <translation id="1509960214886564027">Moguće je da će funkcije na mnogim web lokacijama prestati s radom</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Pristup vašoj kameri</translation> <translation id="1660204651932907780">Dozvolite web lokacijama da reproduciraju zvuk (preporučeno)</translation> <translation id="1677097821151855053">Kolačići i drugi podaci web lokacije se koriste da vas web lokacija zapamti, naprimjer radi vaše prijave ili personaliziranja oglasa. Da upravljate kolačićima za sve web lokacije, pogledajte <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Obrisati podatke web lokacije?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Dozvoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Dozvoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Dozvoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Dozvoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Preuzimanje je završeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Pristup lokaciji</translation> <translation id="2482878487686419369">Obavještenja</translation> <translation id="2490684707762498678">Upravlja aplikacija <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Pomoć i povr. inf.</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Uključite odobrenja za aplikaciju <ph name="APP_NAME" /> u <ph name="BEGIN_LINK" />Postavkama Androida<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Pristup mikrofonu</translation> <translation id="965817943346481315">Blokirajte ako web lokacija prikazuje nametljive ili obmanjujuće oglase (preporučeno)</translation> <translation id="967624055006145463">Pohranjeni podaci</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb index 8353392..8f4d83a9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Permet control total disp. MIDI</translation> <translation id="1509960214886564027">Pot ser que les funcions de molts llocs web no funcionin</translation> <translation id="1620510694547887537">Càmera</translation> -<translation id="1647391597548383849">Accés a la càmera</translation> <translation id="1660204651932907780">Permet que els llocs web reprodueixin so (opció recomanada)</translation> <translation id="1677097821151855053">Les galetes i altres dades dels llocs web s'utilitzen per recordar-te amb finalitats com ara iniciar la teva sessió o personalitzar anuncis. Per gestionar les galetes de tots els llocs web, consulta <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Vols esborrar les dades del lloc web?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{S'han permès <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i <ph name="NUM_MORE" /> més}other{S'han permès <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i <ph name="NUM_MORE" /> més}}</translation> <translation id="2434158240863470628">S'ha completat la baixada <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Accés a la ubicació</translation> <translation id="2482878487686419369">Notificacions</translation> <translation id="2490684707762498678">Gestionades per <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ajuda i suggeriments </translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i <ph name="NUM_MORE" /> més}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i <ph name="NUM_MORE" /> més}}</translation> <translation id="913657688200966289">Activa els permisos per a <ph name="APP_NAME" /> a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Accés al micròfon</translation> <translation id="965817943346481315">Bloqueja els anuncis si el lloc web mostra publicitat intrusiva o enganyosa (opció recomanada)</translation> <translation id="967624055006145463">Dades emmagatzemades</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb index 2ffff83..8d5026be 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Povolit úplné ovládání zařízení MIDI</translation> <translation id="1509960214886564027">Mnoho webů může přestat fungovat</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Přístup k fotoaparátu</translation> <translation id="1660204651932907780">Povolit webům přehrávat zvuky (doporučeno)</translation> <translation id="1677097821151855053">Soubory cookie a další data webů slouží k tomu, aby si vás web zapamatoval, například pro účely přihlášení nebo personalizace reklam. Chcete-li spravovat cookies pro všechny weby, přejděte do <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Vymazat data webu?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Povolená oprávnění: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}few{Povolená oprávnění: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}many{Povolená oprávnění: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}other{Povolená oprávnění: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}}</translation> <translation id="2434158240863470628">Stažení bylo dokončeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Přístup k poloze</translation> <translation id="2482878487686419369">Oznámení</translation> <translation id="2490684707762498678">Spravováno aplikací <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Nápověda a zpětná vazba</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a další (<ph name="NUM_MORE" />)}}</translation> <translation id="913657688200966289">Zapněte v <ph name="BEGIN_LINK" />Nastavení Android<ph name="END_LINK" /> oprávnění pro aplikaci <ph name="APP_NAME" />.</translation> -<translation id="945632385593298557">Přístup k mikrofonu</translation> <translation id="965817943346481315">Blokovat, pokud web zobrazuje rušivé nebo zavádějící reklamy (doporučeno)</translation> <translation id="967624055006145463">Uložená data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index e652735..9e6baaab 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Tillad fuld kontrol over MIDI-enheder</translation> <translation id="1509960214886564027">Funktioner på mange websites virker muligvis ikke</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Adgang til dit kamera</translation> <translation id="1660204651932907780">Tillad, at websites afspiller lyd (anbefales)</translation> <translation id="1677097821151855053">Cookies og andre websitedata bruges til at huske dig, f.eks. for at logge dig ind eller give dig personligt tilpassede annoncer. Gå til <ph name="BEGIN_LINK" />Indstillinger<ph name="END_LINK" /> for at administrere cookies for alle websites.</translation> <translation id="1688867105868176567">Ville du rydde websitets data?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> mere er tilladt}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more allowed}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> mere er tilladt}}</translation> <translation id="2434158240863470628">Downloaden er fuldført <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Placeringsadgang</translation> <translation id="2482878487686419369">Notifikationer</translation> <translation id="2490684707762498678">Administreret af <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Hjælp og feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> mere}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> mere}}</translation> <translation id="913657688200966289">Aktivér tilladelser for <ph name="APP_NAME" /> i <ph name="BEGIN_LINK" />Android-indstillingerne<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Adgang til din mikrofon</translation> <translation id="965817943346481315">Bloker, hvis websitet viser påtrængende eller vildledende annoncer (anbefales)</translation> <translation id="967624055006145463">Lagrede data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb index 9cb42fb1..66533c1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Volle Kontr. über MIDI-Ger. erl.</translation> <translation id="1509960214886564027">Funktionen auf vielen Websites funktionieren möglicherweise nicht mehr</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Kamerazugriff</translation> <translation id="1660204651932907780">Wiedergabe von Ton auf Websites zulassen (empfohlen)</translation> <translation id="1677097821151855053">Durch Cookies und andere Websitedaten erinnert sich die Website an Sie, z. B. bei der Anmeldung oder für personalisierte Werbung. Sie können Cookies für alle Websites <ph name="BEGIN_LINK" />in den Einstellungen verwalten<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Websitedaten löschen?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> und <ph name="NUM_MORE" /> weitere zugelassen}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> und <ph name="NUM_MORE" /> weitere zugelassen}}</translation> <translation id="2434158240863470628">Download abgeschlossen <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Standortzugriff</translation> <translation id="2482878487686419369">Benachrichtigungen</translation> <translation id="2490684707762498678">Über <ph name="APP_NAME" /> verwaltet</translation> <translation id="2498359688066513246">Hilfe & Feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> und <ph name="NUM_MORE" /> weitere}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> und <ph name="NUM_MORE" /> weitere}}</translation> <translation id="913657688200966289">Die Berechtigungen für <ph name="APP_NAME" /> können in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktiviert werden.</translation> -<translation id="945632385593298557">Mikrofonzugriff</translation> <translation id="965817943346481315">Blockieren, wenn Website aufdringliche oder irreführende Werbung anzeigt (empfohlen)</translation> <translation id="967624055006145463">Gespeicherte Daten</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index 2d853d5..5d738bb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Να επιτρέπεται πλήρης έλεγχος σε MIDI</translation> <translation id="1509960214886564027">Μπορεί να παρουσιαστούν προβλήματα στις λειτουργίες πολλών ιστοτόπων.</translation> <translation id="1620510694547887537">Κάμερα</translation> -<translation id="1647391597548383849">Πρόσβαση στην κάμερα</translation> <translation id="1660204651932907780">Να επιτρέπεται στους ιστοτόπους να αναπαράγουν ήχο (συνιστάται)</translation> <translation id="1677097821151855053">Τα cookie και άλλα δεδομένα ιστοτόπου χρησιμοποιούνται για την απομνημόνευσή σας, όπως, για παράδειγμα, για σας συνδέουν ή να εξατομικεύουν τις διαφημίσεις σας. Για να διαχειριστείτε τα cookie για όλους τους ιστοτόπους, ανατρέξτε στις <ph name="BEGIN_LINK" />Ρυθμίσεις<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Να διαγραφούν τα δεδομένα ιστοτόπου;</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Οι άδειες <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> και <ph name="NUM_MORE" /> ακόμη επιτράπηκαν.}other{Οι άδειες <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> και <ph name="NUM_MORE" /> ακόμη επιτράπηκαν.}}</translation> <translation id="2434158240863470628">Η λήψη ολοκληρώθηκε <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Πρόσβαση τοποθεσίας</translation> <translation id="2482878487686419369">Ειδοποιήσεις</translation> <translation id="2490684707762498678">Διαχειριζόμενες από την εφαρμογή <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Βοήθεια και σχόλια</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> και <ph name="NUM_MORE" /> ακόμη}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> και <ph name="NUM_MORE" /> ακόμη}}</translation> <translation id="913657688200966289">Ενεργοποιήστε τις άδειες για την εφαρμογή <ph name="APP_NAME" /> στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Πρόσβαση στο μικρόφωνό σας</translation> <translation id="965817943346481315">Αποκλεισμός εάν ο ιστότοπος εμφανίζει παρεμβατικές ή παραπλανητικές διαφημίσεις (συνιστάται)</translation> <translation id="967624055006145463">Αποθηκευμένα δεδομένα</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index 2a7d90e..e4d3125 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Allow full control of MIDI devices</translation> <translation id="1509960214886564027">Features on many sites may break</translation> <translation id="1620510694547887537">Camera</translation> -<translation id="1647391597548383849">Access your camera</translation> <translation id="1660204651932907780">Allow sites to play sound (recommended)</translation> <translation id="1677097821151855053">Cookies and other site data are used to remember you, for example, to sign you in or to personalise ads. To manage cookies for all sites, see <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Clear site data?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> and <ph name="NUM_MORE" /> more allowed}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> and <ph name="NUM_MORE" /> more allowed}}</translation> <translation id="2434158240863470628">Download complete <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Location access</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2490684707762498678">Managed by <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Help & feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more}}</translation> <translation id="913657688200966289">Turn on permissions for <ph name="APP_NAME" /> in <ph name="BEGIN_LINK" />Android settings<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Access your microphone</translation> <translation id="965817943346481315">Block if site shows intrusive or misleading ads (recommended)</translation> <translation id="967624055006145463">Data stored</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb index 69dd6c4d..e98c862 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Control de dispositivos MIDI</translation> <translation id="1509960214886564027">Es posible que las características de muchos sitios no funcionen de forma correcta</translation> <translation id="1620510694547887537">Cámara</translation> -<translation id="1647391597548383849">Acceso a la cámara</translation> <translation id="1660204651932907780">Permitir que los sitios reproduzcan sonido (recomendado)</translation> <translation id="1677097821151855053">Se utilizan cookies y otros datos del sitio para recordarte. De esta manera, podrás acceder a tu cuenta y ver anuncios personalizados, entre otras cosas. Para administrar las cookies de todos los sitios, visita la <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">¿Quieres borrar los datos del sitio?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Permitidos: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más}other{Permitidos: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más}}</translation> <translation id="2434158240863470628">Se completó la descarga <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Acceso a la ubicación</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2490684707762498678">Administradas por <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ayuda y comentarios</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más}}</translation> <translation id="913657688200966289">Activa los permisos para <ph name="APP_NAME" /> en la <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Acceso al micrófono</translation> <translation id="965817943346481315">Bloquear si el sitio muestra anuncios intrusivos o engañosos (opción recomendada)</translation> <translation id="967624055006145463">Datos almacenados</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index f5eedca..d4c9c92 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Control total dispositivos MIDI</translation> <translation id="1509960214886564027">Es posible que las funciones de muchos sitios web no funcionen correctamente.</translation> <translation id="1620510694547887537">Cámara</translation> -<translation id="1647391597548383849">Acceder a la cámara</translation> <translation id="1660204651932907780">Permitir que los sitios web reproduzcan sonidos (recomendado)</translation> <translation id="1677097821151855053">Las cookies y otros datos de los sitios web se usan para recordarte. Así, podrás iniciar sesión o ver anuncios personalizados, entre otras cosas. Para gestionar las cookies de todos los sitios web, ve a <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">¿Quieres borrar los datos del sitio web?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más permitidos}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más permitidos}}</translation> <translation id="2434158240863470628">Descarga finalizada <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Acceso a la ubicación</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2490684707762498678">Gestionadas por <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ayuda y sugerencias</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> y <ph name="NUM_MORE" /> más}}</translation> <translation id="913657688200966289">Activa los permisos para <ph name="APP_NAME" /> en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Acceder al micrófono</translation> <translation id="965817943346481315">Bloquear si el sitio web muestra anuncios invasivos o engañosos (recomendado)</translation> <translation id="967624055006145463">Datos almacenados</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index 8099699..228db145 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI-seadm. täieliku juht. lub.</translation> <translation id="1509960214886564027">Paljude saitide funktsioonid ei pruugi töötada</translation> <translation id="1620510694547887537">Kaamera</translation> -<translation id="1647391597548383849">Juurdepääs kaamerale</translation> <translation id="1660204651932907780">Saitidel lubatakse esitada heli (soovitatav)</translation> <translation id="1677097821151855053">Küpsisefaile ja muid saidi andmeid kasutatakse teie meeldejätmiseks, näiteks selleks, et teid sisse logida või reklaame isikupärastada. Kõigi saitide küpsisefailide haldamiseks vaadake jaotist <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Kas soovite saidi andmed kustutada?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja veel <ph name="NUM_MORE" /> on lubatud}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja veel <ph name="NUM_MORE" /> on lubatud}}</translation> <translation id="2434158240863470628">Allalaadimine jõudis lõpule: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Juurdepääs asukohale</translation> <translation id="2482878487686419369">Märguanded</translation> <translation id="2490684707762498678">Haldab <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Abi ja tagasiside</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja veel <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja veel <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Lülitage <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" /> sisse load rakendusele <ph name="APP_NAME" />.</translation> -<translation id="945632385593298557">Juurdepääs mikrofonile</translation> <translation id="965817943346481315">Blokeeri, kui sait kuvab sekkuvaid või eksitavaid reklaame (soovitatav)</translation> <translation id="967624055006145463">Salvestatud andmete maht</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index b8828f7..517a53b9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Onartu MIDI gailuen kontrol osoa</translation> <translation id="1509960214886564027">Baliteke webgune askotako eginbideek ez funtzionatzea</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Atzitu kamera</translation> <translation id="1660204651932907780">Baimendu webguneei soinua erreproduzitzea (gomendatua)</translation> <translation id="1677097821151855053">Cookieak eta webguneko beste datu batzuk zu gogoratzeko erabiltzen dira; adibidez, saioa hasteko edo iragarkiak pertsonalizatzeko. Webgune guztietako cookieak kudeatzeko, ikusi <ph name="BEGIN_LINK" />Ezarpenak<ph name="END_LINK" /> atala.</translation> <translation id="1688867105868176567">Webguneko datuak garbitu nahi dituzu?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Baimena eman zaie hauei: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}other{Baimena eman zaie hauei: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Deskargatu da <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Kokapenerako sarbidea</translation> <translation id="2482878487686419369">Jakinarazpenak</translation> <translation id="2490684707762498678">Kudeatzailea: <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Laguntza eta iritziak</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth-a</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Aktibatu <ph name="APP_NAME" /> aplikaziorako baimenak <ph name="BEGIN_LINK" />Android-en ezarpenetan<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Atzitu mikrofonoa</translation> <translation id="965817943346481315">Webguneak iragarki oztopatzaileak erakusten baditu, blokea itzazu (gomendatua)</translation> <translation id="967624055006145463">Gordetako datuak</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index 3c93e842..7fe7a7aa 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">اجازه کنترل کامل دستگاههای MIDI</translation> <translation id="1509960214886564027">ویژگیهای بسیاری از سایتها ممکن است درست کار نکنند</translation> <translation id="1620510694547887537">دوربین</translation> -<translation id="1647391597548383849">دسترسی به دوربین</translation> <translation id="1660204651932907780">به سایتها اجازه داده شود صدا پخش کنند (توصیه میشود)</translation> <translation id="1677097821151855053">از کوکیها و دیگر دادههای سایت برای بهخاطر سپردن شما استفاده میشود؛ برای مثال ورود به سیستم یا نمایش آگهیهای شخصیشده. برای مدیریت کردن کوکیها برای همه سایتها، به <ph name="BEGIN_LINK" />تنظیمات<ph name="END_LINK" /> بروید.</translation> <translation id="1688867105868176567">دادههای سایت پاک شود؟</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> مگابایت</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر مجاز هستند}one{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر مجاز هستند}other{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر مجاز هستند}}</translation> <translation id="2434158240863470628">بارگیری کامل شد <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">دسترسی به موقعیت مکانی</translation> <translation id="2482878487686419369">اعلانها</translation> <translation id="2490684707762498678">تحت مدیریت <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">راهنمایی و بازخورد</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">بلوتوث</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر}one{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر}other{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" />، و <ph name="NUM_MORE" /> اجازه دیگر}}</translation> <translation id="913657688200966289">اجازههای <ph name="APP_NAME" /> را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> روشن کنید.</translation> -<translation id="945632385593298557">دسترسی به میکروفن</translation> <translation id="965817943346481315">اگر سایتْ آگهیهای مزاحم یا گمراهکننده نشان میدهد مسدود شود (توصیه میشود)</translation> <translation id="967624055006145463">داده ذخیره شد</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index 75492a1..9f851f6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Salli MIDI-laitteiden täysi käyttöoik.</translation> <translation id="1509960214886564027">Useiden sivustojen ominaisuudet saattavat lakata toimimasta</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Kameran käyttöoikeus</translation> <translation id="1660204651932907780">Salli sivustojen toistaa ääniä (suositus)</translation> <translation id="1677097821151855053">Evästeillä ja muulla sivustodatalla tunnistetaan sinut, jotta voit esimerkiksi kirjautua sisään tai nähdä personoituja mainoksia. Jos haluat ylläpitää kaikkien sivustojen evästeitä, siirry <ph name="BEGIN_LINK" />Asetuksiin<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Tyhjennetäänkö sivustotiedot?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> Mt</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta sallittu}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta sallittu}}</translation> <translation id="2434158240863470628">Lataus valmis <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Sijaintitietojen käyttöoikeus</translation> <translation id="2482878487686419369">Ilmoitukset</translation> <translation id="2490684707762498678">Ylläpitäjä: <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ohjeet ja palaute</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta}}</translation> <translation id="913657688200966289">Laita luvat (<ph name="APP_NAME" />) päälle <ph name="BEGIN_LINK" />Androidin asetuksista<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Mikrofonin käyttöoikeus</translation> <translation id="965817943346481315">Estä, jos sivusto näyttää häiritseviä tai harhaanjohtavia mainoksia (suositus)</translation> <translation id="967624055006145463">Tallennettu data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb index 1d3ba72..ca236a51 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Payagan ganap na kontrol sa MIDI device</translation> <translation id="1509960214886564027">Posibleng masira ang mga feature sa maraming site</translation> <translation id="1620510694547887537">Camera</translation> -<translation id="1647391597548383849">I-access ang iyong camera</translation> <translation id="1660204651932907780">Payagan ang mga site na mag-play ng tunog (inirerekomenda)</translation> <translation id="1677097821151855053">Ginagamit ang cookies at iba pang data ng site para tandaan ka, halimbawa para i-sign in ka o i-personalize ang mga ad. Para mapamahalaan ang cookies para sa lahat ng site, tingnan ang <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">I-clear ang data ng site?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Pinapayagan ang <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="NUM_MORE" /> pa}one{Pinapayagan ang <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="NUM_MORE" /> pa}other{Pinapayagan ang <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="NUM_MORE" /> pa}}</translation> <translation id="2434158240863470628">Tapos nang mag-download <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Access sa lokasyon</translation> <translation id="2482878487686419369">Mga Abiso</translation> <translation id="2490684707762498678">Pinapamahalaan ng <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Tulong at feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="NUM_MORE" /> pa}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="NUM_MORE" /> pa}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, at <ph name="NUM_MORE" /> pa}}</translation> <translation id="913657688200966289">I-on ang mga pahintulot para sa <ph name="APP_NAME" /> sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">I-access ang iyong mikropono</translation> <translation id="965817943346481315">I-block kung nagpapakita ang site ng mga nakakasagabal o nakakapanlinlang na ad (inirerekomenda)</translation> <translation id="967624055006145463">Naka-store na data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index 5388376d..dc204c20 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Autoriser le contrôle des appareils MIDI</translation> <translation id="1509960214886564027">Des fonctionnalités sur de nombreux sites risquent de ne pas fonctionner</translation> <translation id="1620510694547887537">Caméra</translation> -<translation id="1647391597548383849">Accès à votre caméra</translation> <translation id="1660204651932907780">Autoriser les sites à faire jouer du son (recommandé)</translation> <translation id="1677097821151855053">Les témoins et d'autres données de sites sont utilisés pour se souvenir de vous. Par exemple : pour vous connecter à votre compte ou pour personnaliser les annonces. Pour gérer les témoins pour tous les sites, reportez-vous au menu <ph name="BEGIN_LINK" />Paramètres<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Effacer les données du site?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> Mo</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Autorisations <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autre accordées}one{Autorisations <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autre accordées}other{Autorisations <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autres accordées}}</translation> <translation id="2434158240863470628">Téléchargement terminé <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Accès à la position</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2490684707762498678">Les notifications sont gérées par <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Aide et commentaires</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autre}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autre}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autres}}</translation> <translation id="913657688200966289">Vous pouvez activer les autorisations pour <ph name="APP_NAME" /> dans les <ph name="BEGIN_LINK" />paramètres d'Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Accès à votre microphone</translation> <translation id="965817943346481315">Bloquer si le site diffuse des annonces intrusives ou trompeuses (recommandé)</translation> <translation id="967624055006145463">Données stockées</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb index bb486a0..94be2c87 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Autoriser le contrôle complet des appareils MIDI</translation> <translation id="1509960214886564027">Des fonctionnalités sur de nombreux sites risquent de ne pas fonctionner</translation> <translation id="1620510694547887537">Caméra</translation> -<translation id="1647391597548383849">Accéder à votre caméra</translation> <translation id="1660204651932907780">Autoriser le son des sites (recommandé)</translation> <translation id="1677097821151855053">Les cookies et autres données de site servent à se souvenir de vous (par exemple, pour que vous puissiez vous connecter plus facilement ou pour personnaliser les annonces). Pour gérer les cookies de l'ensemble des sites, accédez aux <ph name="BEGIN_LINK" />paramètres<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Effacer les données du site ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> Mo</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Autorisations accordées : <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> de plus}one{Autorisations accordées : <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> de plus}other{Autorisations accordées : <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> de plus}}</translation> <translation id="2434158240863470628">Téléchargement terminé <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Accès à la position</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2490684707762498678">Géré par <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Aide et commentaires</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> de plus}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> de plus}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> de plus}}</translation> <translation id="913657688200966289">Activez les autorisations pour <ph name="APP_NAME" /> dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Accéder à votre micro</translation> <translation id="965817943346481315">Bloquer si le site affiche des annonces intrusives ou trompeuses (recommandé)</translation> <translation id="967624055006145463">Données stockées</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb index 40a9152..0b1649e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Permitir control disposit. MIDI</translation> <translation id="1509960214886564027">As funcións de moitos sitios poden deixar de funcionar</translation> <translation id="1620510694547887537">Cámara</translation> -<translation id="1647391597548383849">Acceso á túa cámara</translation> <translation id="1660204651932907780">Permite que os sitios reproduzan son (recomendado)</translation> <translation id="1677097821151855053">As cookies e outros datos do sitio utilízanse para lembrarte (por exemplo, á hora de iniciar de sesión ou de personalizar anuncios). Se queres xestionar as cookies para todos os sitios, vai a <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Queres borrar os datos do sitio?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> máis (permitidos)}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> máis (permitidos)}}</translation> <translation id="2434158240863470628">Completouse a descarga <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Acceso á localización</translation> <translation id="2482878487686419369">Notificacións</translation> <translation id="2490684707762498678">Xestionadas por <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Axuda e comentarios</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> máis}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> máis}}</translation> <translation id="913657688200966289">Activa os permisos para <ph name="APP_NAME" /> en <ph name="BEGIN_LINK" />Configuración de Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Acceso ao teu micrófono</translation> <translation id="965817943346481315">Bloquear se o sitio mostra anuncios enganosos ou intrusivos (recomendado)</translation> <translation id="967624055006145463">Datos almacenados</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index 5a993b5..61c112b4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ઉપકરણોના પૂર્ણ નિયંત્રણની મંજૂરી આપો</translation> <translation id="1509960214886564027">ઘણી સાઇટ પરની સુવિધાઓને કદાચ બંધ કરવામાં આવી શકે</translation> <translation id="1620510694547887537">કૅમેરો</translation> -<translation id="1647391597548383849">તમારા કૅમેરાની ઍક્સેસ</translation> <translation id="1660204651932907780">સાઇટને અવાજ ચલાવવાની મંજૂરી આપો (સુઝાવ આપેલ)</translation> <translation id="1677097821151855053">કુકી અને અન્ય સાઇટ ડેટાનો ઉપયોગ તમને યાદ રાખવા માટે કરવામાં આવે છે, ઉદાહરણ તરીકે, તમને સાઇન ઇન કરવા માટે અથવા જાહેરાતો મનગમતી બનાવવા માટે. બધી સાઇટ માટે કુકી મેનેજ કરવા, <ph name="BEGIN_LINK" />સેટિંગ<ph name="END_LINK" /> જુઓ.</translation> <translation id="1688867105868176567">સાઇટનો ડેટા સાફ કરીએ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> અને વધુ <ph name="NUM_MORE" />ની મંજૂરી આપી}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> અને વધુ <ph name="NUM_MORE" />ની મંજૂરી આપી}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> અને વધુ <ph name="NUM_MORE" />ની મંજૂરી આપી}}</translation> <translation id="2434158240863470628">ડાઉનલોડ પૂર્ણ <ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">સ્થાન ઍક્સેસ</translation> <translation id="2482878487686419369">નોટિફિકેશનો</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> દ્વારા સંચાલિત</translation> <translation id="2498359688066513246">સહાય અને પ્રતિસાદ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">બ્લૂટૂથ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> અને વધુ <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> અને વધુ <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> અને વધુ <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં <ph name="APP_NAME" /> માટે પરવાનગીઓ ચાલુ કરો.</translation> -<translation id="945632385593298557">તમારા માઇક્રોફોનની ઍક્સેસ</translation> <translation id="965817943346481315">જો સાઇટ ઘૃણાસ્પદ અથવા ભ્રામક જાહેરાતો બતાવતી હોય, તો બ્લૉક કરો (ભલામણ કરેલ)</translation> <translation id="967624055006145463">સ્ટોર કરેલ ડેટા</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index 6f48188..2318f51 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI डिवाइस के पूरे नियंत्रण की अनुमति दें</translation> <translation id="1509960214886564027">शायद कई साइटों पर सुविधाएं ठीक से काम न करें</translation> <translation id="1620510694547887537">कैमरा</translation> -<translation id="1647391597548383849">अपना कैमरा एक्सेस करें</translation> <translation id="1660204651932907780">साइटों को आवाज़ चलाने दें (सुझाया गया)</translation> <translation id="1677097821151855053">कुकी और अन्य साइट डेटा का इस्तेमाल आपकी जानकारी को याद रखने के लिए किया जाता है, जैसे कि आपको साइन इन करने देना या आपकी पसंद को ध्यान में रखकर विज्ञापन दिखाना. सभी साइटों से जुड़ी कुकी प्रबंधित करने के लिए, <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> देखें.</translation> <translation id="1688867105868176567">'साइट डेटा' हटाएं?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> एमबी</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="NUM_MORE" /> अन्य सुविधा को इस्तेमाल करने की अनुमति दी गई}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="NUM_MORE" /> अन्य सुविधा को इस्तेमाल करने की अनुमति दी गई}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="NUM_MORE" /> अन्य सुविधाओं को इस्तेमाल करने की अनुमति दी गई}}</translation> <translation id="2434158240863470628">डाउनलोड हो गया <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">जगह की जानकारी का एक्सेस दें</translation> <translation id="2482878487686419369">सूचनाएं</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> प्रबंधित करता है</translation> <translation id="2498359688066513246">सहायता और फ़ीडबैक</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ब्लूटूथ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="NUM_MORE" /> अन्य सुविधा}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="NUM_MORE" /> अन्य सुविधा}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, और <ph name="NUM_MORE" /> अन्य सुविधाएं}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android की सेटिंग<ph name="END_LINK" /> में जाकर, <ph name="APP_NAME" /> के लिए अनुमतियां चालू करें.</translation> -<translation id="945632385593298557">अपना माइक्रोफ़ोन एक्सेस करें</translation> <translation id="965817943346481315">अगर साइट तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं, तो उन्हें ब्लॉक करें (सुझाव)</translation> <translation id="967624055006145463">डेटा संग्रहित किया गया</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index e5680826..12812ea 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Omogući potpuni nadzor za MIDI</translation> <translation id="1509960214886564027">Značajke na mnogim web-lokacijama mogu prestati funkcionirati</translation> <translation id="1620510694547887537">Fotoaparat</translation> -<translation id="1647391597548383849">Pristup fotoaparatu</translation> <translation id="1660204651932907780">Web-lokacije mogu reproducirati zvuk (preporučeno)</translation> <translation id="1677097821151855053">Kolačići i drugi podaci web-lokacije koriste se kako bi vas web-lokacija zapamtila, na primjer kako bi vas prijavila na račun ili vam prilagodila oglase. Da biste upravljali kolačićima za sve web-lokacije, idite na <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Želite li izbrisati podatke web-lokacije?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Odobrena su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Odobrena su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Odobrena su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Odobrena su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Preuzimanje je dovršeno: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Pristup lokaciji</translation> <translation id="2482878487686419369">Obavijesti</translation> <translation id="2490684707762498678">Upravlja: <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Pomoć i povratne informacije</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Uključite dopuštenja za aplikaciju <ph name="APP_NAME" /> u <ph name="BEGIN_LINK" />Androidovim postavkama<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Pristup mikrofonu</translation> <translation id="965817943346481315">Blokiraj ako web-lokacija prikazuje ometajuće ili obmanjujuće oglase (preporučeno)</translation> <translation id="967624055006145463">Pohranjeni podaci</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index a08ed712..46a0c1d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI-eszközök teljes vezérlése</translation> <translation id="1509960214886564027">Számos webhelyen nem működnek a funkciók</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Hozzáférés a fényképezőgéphez</translation> <translation id="1660204651932907780">A webhelyek lejátszhatnak hangokat (ajánlott)</translation> <translation id="1677097821151855053">A cookie-k és az egyéb webhelyadatok arra szolgálnak, hogy a webhelyek emlékezzenek Önre, és így például bejelentkeztetik, vagy személyre szabják a hirdetéseket. A <ph name="BEGIN_LINK" />Beállításokban<ph name="END_LINK" /> kezelheti a webhelyek cookie-jait.</translation> <translation id="1688867105868176567">Törli a webhelyadatokat?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> és további <ph name="NUM_MORE" /> engedélyezve}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> és további <ph name="NUM_MORE" /> engedélyezve}}</translation> <translation id="2434158240863470628">Letöltés befejezve <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Helyhozzáférés</translation> <translation id="2482878487686419369">Értesítések</translation> <translation id="2490684707762498678">Kezelő: <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Súgó és visszajelzés</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> és további <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> és további <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">A(z) <ph name="APP_NAME" /> alkalmazásra vonatkozó engedélyeket az <ph name="BEGIN_LINK" />Android-beállítások<ph name="END_LINK" /> között lehet aktiválni.</translation> -<translation id="945632385593298557">Hozzáférés a mikrofonhoz</translation> <translation id="965817943346481315">Letiltás, ha a webhely tolakodó vagy félrevezető hirdetéseket jelenít meg (ajánlott)</translation> <translation id="967624055006145463">Tárolt adatok</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb index 651d0b3..44a0b5c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Տրամադրել ամբողջական հսկողություն MIDI սարքերի նկատմամբ</translation> <translation id="1509960214886564027">Շատ կայքերում գործառույթները կարող են չաշխատել։</translation> <translation id="1620510694547887537">Տեսախցիկ</translation> -<translation id="1647391597548383849">Տեսախցիկի օգտագործում</translation> <translation id="1660204651932907780">Թույլ տալ կայքերին նվագարկել ձայն (խորհուրդ է տրվում)</translation> <translation id="1677097821151855053">Քուքիները և կայքի այլ տվյալներ օգտագործվում են ձեզ հիշելու համար։ Դա անհրաժեշտ է, որպեսզի, օրինակ, դուք կարողանաք հաշիվ մտնել կամ ձեզ անհատականացված գովազդ ցուցադրվի։ Բոլոր կայքերի քուքիները կարող եք կառավարել <ph name="BEGIN_LINK" />Քուքիների կարգավորումներ<ph name="END_LINK" /> բաժնում։</translation> <translation id="1688867105868176567">Ջնջե՞լ կայքի տվյալները</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> ՄԲ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Թույլատրված են՝ «<ph name="PERMISSION_1" />», «<ph name="PERMISSION_2" />» ու ևս <ph name="NUM_MORE" /> թույլտվություն}one{Թույլատրված են՝ «<ph name="PERMISSION_1" />», «<ph name="PERMISSION_2" />» ու ևս <ph name="NUM_MORE" /> թույլտվություն}other{Թույլատրված են՝ «<ph name="PERMISSION_1" />», «<ph name="PERMISSION_2" />» ու ևս <ph name="NUM_MORE" /> թույլտվություն}}</translation> <translation id="2434158240863470628">Ներբեռնումն ավարտված է՝ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Իմ տեղակայումը</translation> <translation id="2482878487686419369">Ծանուցումներ</translation> <translation id="2490684707762498678">Կառավարվում է <ph name="APP_NAME" /> հավելվածի կողմից</translation> <translation id="2498359688066513246">Օգնություն և հետադարձ կապ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{«<ph name="PERMISSION_1" />», «<ph name="PERMISSION_2" />» ու ևս <ph name="NUM_MORE" /> թույլտվություն}one{«<ph name="PERMISSION_1" />», «<ph name="PERMISSION_2" />» ու ևս <ph name="NUM_MORE" /> թույլտվություն}other{«<ph name="PERMISSION_1" />», «<ph name="PERMISSION_2" />» ու ևս <ph name="NUM_MORE" /> թույլտվություն}}</translation> <translation id="913657688200966289">Միացնել <ph name="APP_NAME" />-ի թույլտվությունները <ph name="BEGIN_LINK" />Android-ի կարգավորումներում<ph name="END_LINK" />։</translation> -<translation id="945632385593298557">Խոսափողի օգտագործում</translation> <translation id="965817943346481315">Արգելափակել, եթե կայքը հոգնեցնող կամ մոլորեցնող գովազդ է ցուցադրում (խորհուրդ է տրվում)</translation> <translation id="967624055006145463">Պահված տվյալներ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index 239a138..a280343 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Izinkan kontrol penuh perangkat MIDI</translation> <translation id="1509960214886564027">Fitur di banyak situs mungkin error</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Mengakses kamera Anda</translation> <translation id="1660204651932907780">Mengizinkan situs memutar suara (direkomendasikan)</translation> <translation id="1677097821151855053">Cookie dan data situs lainnya digunakan untuk mengingat Anda, misalnya untuk login atau personalisasi iklan. Untuk mengelola cookie semua situs, lihat <ph name="BEGIN_LINK" />Setelan<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Hapus data situs?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, dan <ph name="NUM_MORE" /> lainnya diizinkan}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, dan <ph name="NUM_MORE" /> lainnya diizinkan}}</translation> <translation id="2434158240863470628">Download selesai <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Akses lokasi</translation> <translation id="2482878487686419369">Notifikasi</translation> <translation id="2490684707762498678">Dikelola oleh <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Bantuan & masukan</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, dan <ph name="NUM_MORE" /> lainnya}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, dan <ph name="NUM_MORE" /> lainnya}}</translation> <translation id="913657688200966289">Aktifkan izin untuk <ph name="APP_NAME" /> di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Akses mikrofon Anda</translation> <translation id="965817943346481315">Blokir jika situs menampilkan iklan yang mengganggu atau menyesatkan (direkomendasikan)</translation> <translation id="967624055006145463">Data disimpan</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb index f597aa0..a607eb4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Leyfa ótakmarkaða stjórn á MIDI-tækjum</translation> <translation id="1509960214886564027">Eiginleikar gætu bilað á mörgum vefsvæðum</translation> <translation id="1620510694547887537">Myndavél</translation> -<translation id="1647391597548383849">Aðgangur að myndavélinni</translation> <translation id="1660204651932907780">Leyfa vefsvæðum að spila hljóð (mælt með)</translation> <translation id="1677097821151855053">Fótspor og önnur gögn af síðunni eru notuð til að muna eftir þér, t.d. til að skrá þig inn eða sérsníða auglýsingar. Upplýsingar um stjórnun fótspora fyrir öll vefsvæði eru í <ph name="BEGIN_LINK" />Stillingar<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Viltu hreinsa vefsvæðagögn?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{„<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót leyft}one{„<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót leyft}other{„<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót leyft}}</translation> <translation id="2434158240863470628">Niðurhali lokið <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Aðgangur að staðsetningu</translation> <translation id="2482878487686419369">Tilkynningar</translation> <translation id="2490684707762498678">Stýrt af <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Hjálp og ábendingar</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{„<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót}one{„<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót}other{„<ph name="PERMISSION_1" />“, „<ph name="PERMISSION_2" />“ og <ph name="NUM_MORE" /> í viðbót}}</translation> <translation id="913657688200966289">Kveiktu á heimildum fyrir <ph name="APP_NAME" /> í <ph name="BEGIN_LINK" />stillingum Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Aðgangur að hljóðnemanum</translation> <translation id="965817943346481315">Loka fyrir ef vefsvæði sýnir ágengar eða villandi auglýsingar (ráðlagt)</translation> <translation id="967624055006145463">Vistuð gögn</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index fe3fac01..ae41c34 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Controllo completo dispos. MIDI</translation> <translation id="1509960214886564027">Le funzionalità su molti siti potrebbero non essere disponibili</translation> <translation id="1620510694547887537">Videocamera</translation> -<translation id="1647391597548383849">Accesso alla fotocamera</translation> <translation id="1660204651932907780">Consenti ai siti di riprodurre l'audio (opzione consigliata)</translation> <translation id="1677097821151855053">I cookie e altri dati dei siti vengono utilizzati per ricordare attività e informazioni dell'utente, ad esempio per l'esecuzione dell'accesso o per personalizzare gli annunci. Per gestire i cookie per tutti i siti, consulta le <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Cancellare i dati del sito?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Consentite: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> altra}other{Consentite: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e altre <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Download completato: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Accesso alla posizione</translation> <translation id="2482878487686419369">Notifiche</translation> <translation id="2490684707762498678">Gestite da <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Guida e feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e <ph name="NUM_MORE" /> altra}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e altre <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Attiva le autorizzazioni per l'app <ph name="APP_NAME" /> nelle <ph name="BEGIN_LINK" />Impostazioni Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Accesso al microfono</translation> <translation id="965817943346481315">Blocca se il sito mostra annunci invasivi o fuorvianti (consigliato)</translation> <translation id="967624055006145463">Dati memorizzati</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index 120ca20..e3cf293 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">התר שליטה מלאה על מכשירי MIDI</translation> <translation id="1509960214886564027">ייתכן שהתכונות של חלק גדול מהאתרים לא יפעלו כראוי</translation> <translation id="1620510694547887537">מצלמה</translation> -<translation id="1647391597548383849">גישה אל המצלמה שלך</translation> <translation id="1660204651932907780">מתן הרשאה לאתרים להשמיע צלילים (מומלץ)</translation> <translation id="1677097821151855053">קובצי cookie ונתונים אחרים מאתרים משמשים כדי לזכור את הפרטים שלך, למשל כדי להכניס אותך לחשבון או להציג מודעות בהתאמה אישית. אפשר לנהל את קובצי ה-cookie מכל האתרים דרך ה<ph name="BEGIN_LINK" />הגדרות<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">למחוק את נתוני האתר?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{הוענקו ההרשאות <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד אחת (<ph name="NUM_MORE" />)}two{הוענקו ההרשאות <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}many{הוענקו ההרשאות <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}other{הוענקו ההרשאות <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">ההורדה הושלמה <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">גישה למיקום</translation> <translation id="2482878487686419369">התראות</translation> <translation id="2490684707762498678">מנוהלות על-ידי <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">עזרה ומשוב</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד הרשאה אחת (<ph name="NUM_MORE" />)}two{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">יש להעניק הרשאות עבור <ph name="APP_NAME" /> ב<ph name="BEGIN_LINK" />הגדרות Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">גישה למיקרופון שלך</translation> <translation id="965817943346481315">חסימה אם באתר מוצגות מודעות מפריעות או מטעות (מומלץ)</translation> <translation id="967624055006145463">נפח הנתונים</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb index 7dfc53b..1f0b6c4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI機器のフルコントロールを許可</translation> <translation id="1509960214886564027">多くサイトで機能を使用できなくなる可能性があります</translation> <translation id="1620510694547887537">カメラ</translation> -<translation id="1647391597548383849">カメラへのアクセス</translation> <translation id="1660204651932907780">音声の再生をサイトに許可する(推奨)</translation> <translation id="1677097821151855053">Cookie と他のサイトデータは、ログインや広告のカスタマイズなどでユーザーを特定するために使用されます。すべてのサイトの Cookie を管理するには、<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />をご覧ください。</translation> <translation id="1688867105868176567">サイトデータを削除しますか?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="NUM_MORE" /> 個の権限が許可されています}other{<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="NUM_MORE" /> 個の権限が許可されています}}</translation> <translation id="2434158240863470628">ダウンロードが完了しました<ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">位置情報へのアクセス</translation> <translation id="2482878487686419369">通知</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> で管理</translation> <translation id="2498359688066513246">ヘルプとフィードバック</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="NUM_MORE" /> 個の権限}other{<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="NUM_MORE" /> 個の権限}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android の設定<ph name="END_LINK" />で <ph name="APP_NAME" /> の権限を有効にしてください。</translation> -<translation id="945632385593298557">マイクへのアクセス</translation> <translation id="965817943346481315">煩わしい広告や誤解を招く広告が表示されるサイトの場合にブロック(推奨)</translation> <translation id="967624055006145463">保存データ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index 73cae3b7..a02da62 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI მოწყ. სრული კონტ. დაშვება</translation> <translation id="1509960214886564027">მრავალი საიტის ფუნქციებმა შეიძლება არასათანადოდ იმუშაოს</translation> <translation id="1620510694547887537">კამერა</translation> -<translation id="1647391597548383849">თქვენს კამერაზე წვდომა</translation> <translation id="1660204651932907780">საიტებისთვის ხმის დაკვრის დაშვება (რეკომენდებული)</translation> <translation id="1677097821151855053">ქუქი-ჩანაწერები და საიტების სხვა მონაცემები გამოიყენება თქვენ დასამახსოვრებლად, რომ, მაგალითად, შეიყვანოთ სისტემაში ან რეკლამა მოგარგოთ. ყველა საიტისთვის ქუქი-ჩანაწერების სამართავად გადადით <ph name="BEGIN_LINK" />პარამეტრებზე<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">გსურთ საიტის მონაცემების გასუფთავება?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> მბაიტი</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> და <ph name="NUM_MORE" /> სხვა დაშვებულია}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> და <ph name="NUM_MORE" /> სხვა დაშვებულია}}</translation> <translation id="2434158240863470628">ჩამოტვირთვა დასრულდა: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">მდებარეობაზე წვდომა</translation> <translation id="2482878487686419369">შეტყობინებები</translation> <translation id="2490684707762498678">მართავს <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">დახმარება და უკუკავშირი</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> და <ph name="NUM_MORE" /> სხვა}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> და <ph name="NUM_MORE" /> სხვა}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" />-ისთვის ნებართვების გააქტიურება <ph name="BEGIN_LINK" />Android-ის პარამეტრებში<ph name="END_LINK" /> შეგიძლიათ.</translation> -<translation id="945632385593298557">თქვენი მიკროფონი ხელმისაწვდომია</translation> <translation id="965817943346481315">დაბლოკვა, თუ საიტი აჩვენებს მომაბეზრებელ ან შეცდომაში შემყვან რეკლამას (რეკომენდებული)</translation> <translation id="967624055006145463">შენახული მონაცემები</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index 9938c74e..1d763a0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI толық бақылауға рұқсат беру</translation> <translation id="1509960214886564027">Көптеген сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Камераңызға кіру</translation> <translation id="1660204651932907780">Сайттарда дыбыстың шығуына рұқсат ету (ұсынылады)</translation> <translation id="1677097821151855053">Cookie файлдары мен сайттың басқа деректері сізді есте сақтап қалу (мысалы, есептік жазбаңызға кіру процесін жеңілдету немесе жарнамаларды сізге бейімдеу) үшін қолданылады. Барлық сайт үшін cookie файлдарын басқару үшін <ph name="BEGIN_LINK" />Параметрлер<ph name="END_LINK" /> бөлімін қараңыз.</translation> <translation id="1688867105868176567">Сайт деректері өшірілсін бе?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> МБ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> және тағы <ph name="NUM_MORE" /> қызметті пайдалануға рұқсат етілген.}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> және тағы <ph name="NUM_MORE" /> қызметті пайдалануға рұқсат етілген.}}</translation> <translation id="2434158240863470628"><ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /> жүктеп алынды</translation> -<translation id="2440823041667407902">Орналасқан жерін көру</translation> <translation id="2482878487686419369">Хабарландырулар</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> басқарады</translation> <translation id="2498359688066513246">Анықтама және пікір</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> және тағы <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> және тағы <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> браузері үшін рұқсаттарды <ph name="BEGIN_LINK" />Android параметрлерінде<ph name="END_LINK" /> қосыңыз.</translation> -<translation id="945632385593298557">Микрофонды пайдалану мүмкіндігі</translation> <translation id="965817943346481315">Сайт мазалайтын немесе жалған ақпаратты жарнамалар көрсеткен жағдайда бөгеу (ұсынылады)</translation> <translation id="967624055006145463">Сақталған деректер</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb index dd4c7ab..f02f2e4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">អនុញ្ញាតឲ្យមានការគ្រប់គ្រងពេញលេញលើឧបករណ៍ MIDI</translation> <translation id="1509960214886564027">មុខងារនៅលើគេហទំព័រជាច្រើនអាចដំណើរការមិនត្រឹមត្រូវ</translation> <translation id="1620510694547887537">កាមេរ៉ា</translation> -<translation id="1647391597548383849">ចូលប្រើកាមេរ៉ារបស់អ្នក</translation> <translation id="1660204651932907780">អនុញ្ញាតឱ្យទំព័រចាក់សំឡេង (បានណែនាំ)</translation> <translation id="1677097821151855053">ខូគី និងទិន្នន័យគេហទំព័រផ្សេងទៀតត្រូវបានប្រើ ដើម្បីចងចាំអ្នក ឧទាហរណ៍ ដើម្បីនាំអ្នកចូលគណនី ឬដើម្បីកំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យស្របនឹងអ្នក។ ដើម្បីគ្រប់គ្រងខូគីសម្រាប់គេហទំព័រទាំងអស់ សូមមើល<ph name="BEGIN_LINK" />ការកំណត់<ph name="END_LINK" />។</translation> <translation id="1688867105868176567">សម្អាតទិន្នន័យគេហទំព័រ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{បានអនុញ្ញាត <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> និង <ph name="NUM_MORE" /> ទៀត}other{បានអនុញ្ញាត <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> និង <ph name="NUM_MORE" /> ទៀត}}</translation> <translation id="2434158240863470628">ការទាញយកបានបញ្ចប់ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ទីតាំងការចូលប្រើ</translation> <translation id="2482878487686419369">ការជូនដំណឹង</translation> <translation id="2490684707762498678">ស្ថិតក្រោមការគ្រប់គ្រងរបស់ <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">ជំនួយ & មតិ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ប៊្លូធូស</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> និង <ph name="NUM_MORE" /> ទៀត}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> និង <ph name="NUM_MORE" /> ទៀត}}</translation> <translation id="913657688200966289">បើកការអនុញ្ញាតសម្រាប់ <ph name="APP_NAME" /> នៅក្នុង<ph name="BEGIN_LINK" />ការកំណត់ Android<ph name="END_LINK" />។</translation> -<translation id="945632385593298557">ចូលប្រើម៉ៃក្រូហ្វូនរបស់អ្នក</translation> <translation id="965817943346481315">ទប់ស្កាត់ ប្រសិនបើគេហទំព័របង្ហាញការផ្សាយពាណិជ្ជកម្មដែលនាំឱ្យយល់ច្រឡំ ឬរំខាន (បានណែនាំ)</translation> <translation id="967624055006145463">ទិន្នន័យដែលបានរក្សាទុក</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb index ce82f96..3e29980 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ಸಾಧನಗಳ ಪೂರ್ಣ ನಿಯಂತ್ರಣ ಅನುಮತಿಸಿ</translation> <translation id="1509960214886564027">ಹಲವು ಸೈಟ್ಗಳಲ್ಲಿನ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು</translation> <translation id="1620510694547887537">ಕ್ಯಾಮರಾ</translation> -<translation id="1647391597548383849">ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಿ</translation> <translation id="1660204651932907780">ಧ್ವನಿಯನ್ನು ಪ್ಲೇ ಮಾಡಲು ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> <translation id="1677097821151855053">ಕುಕೀಗಳು ಮತ್ತು ಇತರ ಸೈಟ್ ಡೇಟಾವನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲಾಗುತ್ತದೆ, ಉದಾಹರಣೆಗೆ ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಮಾಡಲು ಅಥವಾ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ಈ ಎಲ್ಲಾ ಸೈಟ್ಗಳಿಗಾಗಿ ಕುಕಿಗಳನ್ನು ನಿರ್ವಹಿಸಲು, <ph name="BEGIN_LINK" />ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು<ph name="END_LINK" /> ನೋಡಿ.</translation> <translation id="1688867105868176567">ಸೈಟ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಬೇಕೇ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ಮತ್ತು ಇನ್ನೂ <ph name="NUM_MORE" /> ಸಂಗತಿಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ಮತ್ತು ಇನ್ನೂ <ph name="NUM_MORE" /> ಸಂಗತಿಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ಮತ್ತು ಇನ್ನೂ <ph name="NUM_MORE" /> ಸಂಗತಿಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ}}</translation> <translation id="2434158240863470628">ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ಸ್ಥಳ ಪ್ರವೇಶ</translation> <translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ಆ್ಯಪ್ ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation> <translation id="2498359688066513246">ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ಬ್ಲೂಟೂತ್</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ಮತ್ತು ಇನ್ನೂ <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ಮತ್ತು ಇನ್ನೂ <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ಮತ್ತು ಇನ್ನೂ <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ<ph name="END_LINK" /> <ph name="APP_NAME" /> ಗಾಗಿ ಅನುಮತಿಗಳನ್ನು ಆನ್ ಮಾಡಿ.</translation> -<translation id="945632385593298557">ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶಿಸಿ</translation> <translation id="965817943346481315">ಅತಿಕ್ರಮಣಕಾರಿಯಾಗಿರುವ ಅಥವಾ ತಪ್ಪುದಾರಿಗೆಳೆಯುವ ಜಾಹೀರಾತುಗಳನ್ನು ಸೈಟ್ ತೋರಿಸಿದರೆ ಅದನ್ನು ನಿರ್ಬಂಧಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> <translation id="967624055006145463">ಸಂಗ್ರಹಣೆ ಮಾಡಿರುವ ಡೇಟಾ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index eb5e2b55..70c77ef 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI 기기의 전체 제어 허용</translation> <translation id="1509960214886564027">다수의 사이트에서 기능이 작동하지 않을 수 있음</translation> <translation id="1620510694547887537">카메라</translation> -<translation id="1647391597548383849">카메라에 액세스</translation> <translation id="1660204651932907780">사이트에서 소리를 재생하도록 허용(권장)</translation> <translation id="1677097821151855053">예를 들어 로그인하거나 광고를 맞춤설정하기 위해 정보를 저장하는 데 쿠키와 기타 사이트 데이터가 사용됩니다. 모든 사이트의 쿠키를 관리하려면 <ph name="BEGIN_LINK" />설정<ph name="END_LINK" />을 참조하세요.</translation> <translation id="1688867105868176567">사이트 데이터를 삭제하시겠습니까?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" />MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> 외 <ph name="NUM_MORE" />개 허용됨}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> 외 <ph name="NUM_MORE" />개 허용됨}}</translation> <translation id="2434158240863470628">다운로드 완료: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">위치 액세스</translation> <translation id="2482878487686419369">알림</translation> <translation id="2490684707762498678"><ph name="APP_NAME" />에서 관리함</translation> <translation id="2498359688066513246">고객센터</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">블루투스</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> 외 <ph name="NUM_MORE" />개}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> 외 <ph name="NUM_MORE" />개}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 <ph name="APP_NAME" /> 관련 권한을 허용하세요.</translation> -<translation id="945632385593298557">마이크에 액세스</translation> <translation id="965817943346481315">사이트에서 방해가 되거나 사용자를 현혹하는 광고를 표시하는 경우 광고 차단(권장)</translation> <translation id="967624055006145463">저장된 데이터</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index 95657dc..1c06bc36 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI түзмктрд толук көзмлд уркст</translation> <translation id="1509960214886564027">Функциялар көпчүлүк сайттарда туура иштебеши мүмкүн.</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Камераңызга мүмкүнчүлүк алуу</translation> <translation id="1660204651932907780">Сайттарга үн чыгарууга уруксат берилсин (сунушталат)</translation> <translation id="1677097821151855053">Cookie файлдары жана башка маалымат сизди эстеп калып, аккаунтка кирүү же жарнамаларды жекелештирүү ж.б. үчүн колдонулат. Бардык сайттардын cookie файлдарын башкаруу үчүн <ph name="BEGIN_LINK" />Жөндөөлөргө<ph name="END_LINK" /> өтүңүз.</translation> <translation id="1688867105868176567">Сайттын дайындары тазалансынбы?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> Мб</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> жана дагы <ph name="NUM_MORE" /> үчүн уруксат берилди}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> жана дагы <ph name="NUM_MORE" /> үчүн уруксат берилди}}</translation> <translation id="2434158240863470628">Жүктөлүп алынды: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Жайгашкн жерд көрп туруу</translation> <translation id="2482878487686419369">Билдирмелер</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> тарабынан башкарылат</translation> <translation id="2498359688066513246">Жардам/пикир билдирүү</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> жана дагы <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> жана дагы <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> колдонмосу үчүн уруксаттарды <ph name="BEGIN_LINK" />Android Жөндөөлөрүнөн<ph name="END_LINK" /> күйгүзүңүз.</translation> -<translation id="945632385593298557">Микрофонуңузга мүмкүнчүлүк алуу</translation> <translation id="965817943346481315">Эгер сайт тажатма же адаштыруучу жарнамаларды көрсөтүп баштаса, бөгөттөлсүн (сунушталат)</translation> <translation id="967624055006145463">Сакталган дайындар</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index 22addec..c6af6d2c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">ອະນຸຍາດການຄວບຄຸມອຸປະກອນ MIDI ເຕັມ</translation> <translation id="1509960214886564027">ຄຸນສົມບັດໃນຫຼາຍໆເວັບໄຊອາດຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="1620510694547887537">ກ້ອງຖ່າຍຮູບ</translation> -<translation id="1647391597548383849">ເຂົ້າຫາກ້ອງຖ່າຍຮູບຂອງທ່ານ</translation> <translation id="1660204651932907780">ອະນຸຍາດໃຫ້ເວັບໄຊຫຼິ້ນສຽງ (ແນະນຳ)</translation> <translation id="1677097821151855053">ຄຸກກີ້ ແລະ ຂໍ້ມູນເວັບໄຊອື່ນໆຖືກໃຊ້ເພື່ອຈື່ທ່ານ, ຕົວຢ່າງ: ນຳທ່ານເຂົ້າສູ່ລະບົບ ຫຼື ເພື່ອປັບແຕ່ງໂຄສະນາເປັນແບບສ່ວນຕົວ. ເພື່ອຈັດການຄຸກກີ້ສຳລັບເວັບໄຊທັງໝົດ, ກະລຸນາເບິ່ງ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">ລຶບລ້າງຂໍ້ມູນເວັບໄຊບໍ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{ອະນຸຍາດ <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ແລະ ອີກ <ph name="NUM_MORE" /> ລາຍການແລ້ວ}other{ອະນຸຍາດ <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ແລະ ອີກ <ph name="NUM_MORE" /> ລາຍການແລ້ວ}}</translation> <translation id="2434158240863470628">ການດາວໂຫຼດສຳເລັດແລ້ວ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ການເຂົ້າເຖິງຂໍ້ມູນສະຖານທີ່</translation> <translation id="2482878487686419369">ການແຈ້ງເຕືອນ</translation> <translation id="2490684707762498678">ຈັດການໂດຍ <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">ຊ່ວຍເຫຼືອ ແລະ ຄໍາຄິດເຫັນຕິຊົມ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ແລະ ອີກ <ph name="NUM_MORE" /> ລາຍການ}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ແລະ ອີກ <ph name="NUM_MORE" /> ລາຍການ}}</translation> <translation id="913657688200966289">ເປີດການອະນຸຍາດສຳລັບ <ph name="APP_NAME" /> ໃນ <ph name="BEGIN_LINK" />ການຕັ້ງຄ່າ Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">ເຂົ້າຫາໄມໂຄຣໂຟນຂອງທ່ານ</translation> <translation id="965817943346481315">ບລັອກຖ້າເວັບໄຊສະແດງໂຄສະນາທີ່ລົບກວນ ຫຼື ຫຼອກລວງ (ແນະນຳ)</translation> <translation id="967624055006145463">ເກັບຂໍ້ມູນໄວ້ແລ້ວ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index c3802c3..f469e8ce 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Leisti visiškai valdyti MIDI įr.</translation> <translation id="1509960214886564027">Funkcijos gali neveikti daugybėje svetainių.</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Prieiga prie fotoaparato</translation> <translation id="1660204651932907780">Leisti svetainėms leisti garsą (rekomenduojama)</translation> <translation id="1677097821151855053">Slapukai ir kiti svetainės duomenys naudojami siekiant jus prisiminti, pvz., prisijungiant ar suasmeninant skelbimus. Norėdami tvarkyti visų svetainių slapukus, žr. skiltį <ph name="BEGIN_LINK" />„Nustatymai“<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Išvalyti svetainės duomenis?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Leidžiama: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}one{Leidžiama: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}few{Leidžiama: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}many{Leidžiama: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}other{Leidžiama: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Atsisiųsta: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Prieiga prie vietovės</translation> <translation id="2482878487686419369">Pranešimai</translation> <translation id="2490684707762498678">Tvarko „<ph name="APP_NAME" />“</translation> <translation id="2498359688066513246">Pagalba ir atsiliepimai</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Įjunkite „<ph name="APP_NAME" />“ leidimus <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Prieiga prie mikrofono</translation> <translation id="965817943346481315">Blokuoti, jei svetainėje rodomi nepageidaujami arba klaidinantys skelbimai (rekomenduojama)</translation> <translation id="967624055006145463">Saugomi duomenys</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb index 6ba23f54..7b3aceb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Pilnīga MIDI ierīču pārvaldība</translation> <translation id="1509960214886564027">Daudzās vietnēs funkcijas var nedarboties</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Piekļuve kamerai</translation> <translation id="1660204651932907780">Atļaut vietnēm atskaņot skaņu (ieteicams)</translation> <translation id="1677097821151855053">Sīkfaili un citi vietnes dati tiek izmantoti, lai saglabātu jūsu datus un tos izmantotu, piemēram, kad pierakstāties, vai reklāmu personalizēšanai. Lai pārvaldītu visu vietņu sīkfailus, pārejiet uz sadaļu <ph name="BEGIN_LINK" />Iestatījumi<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Vai notīrīt vietnes datus?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Atļautas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}zero{Atļautas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}one{Atļautas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}other{Atļautas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Lejupielāde pabeigta: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Piekļuve atrašanās vietai</translation> <translation id="2482878487686419369">Paziņojumi</translation> <translation id="2490684707762498678">Pārvalda <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Palīdzība un atsauksmes</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}zero{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> un vēl <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android iestatījumos<ph name="END_LINK" /> ieslēdziet atļaujas lietotnei <ph name="APP_NAME" />.</translation> -<translation id="945632385593298557">Piekļuve mikrofonam</translation> <translation id="965817943346481315">Bloķēt, ja vietnē tiek rādītas traucējošas vai maldinošas reklāmas (ieteicams)</translation> <translation id="967624055006145463">Dati saglabāti</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index 3a42b9d..2b04875 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Дозволи контрола над MIDI-уреди</translation> <translation id="1509960214886564027">Функциите на многу сајтови може да не функционираат</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Пристапи до камерата</translation> <translation id="1660204651932907780">Дозволи сајтовите да пуштаат звук (се препорачува)</translation> <translation id="1677097821151855053">Колачињата и другите сајтови се користат за да ве запомнат, на пр., за најавување или за персонализирање реклами. За да управувате со колачињата за сите сајтови, погледнете ги <ph name="BEGIN_LINK" />Поставките<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Дали да се исчистат сите податоци?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> се одобрени}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> се одобрени}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> се одобрени}}</translation> <translation id="2434158240863470628">Преземањето е завршено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Пристап до локација</translation> <translation id="2482878487686419369">Известувања</translation> <translation id="2490684707762498678">Управувани од <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Помош и повратни информации</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> друго}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> друго}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> други}}</translation> <translation id="913657688200966289">Вклучете ги дозволите за <ph name="APP_NAME" /> во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Пристапи до микрофонот</translation> <translation id="965817943346481315">Блокирај ако сајтот прикажува нападни или лажни реклами (препорачано)</translation> <translation id="967624055006145463">Складирани податоци</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index 63f7a0f..f87a1807 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ഉപകരണങ്ങളുടെ പൂർണ്ണ നിയന്ത്രണം അനുവദിക്കുക</translation> <translation id="1509960214886564027">നിരവധി സൈറ്റുകളിലെ ഫീച്ചറുകൾക്ക് പ്രവർത്തനം നടത്താനായേക്കില്ല</translation> <translation id="1620510694547887537">ക്യാമറ</translation> -<translation id="1647391597548383849">നിങ്ങളുടെ ക്യാമറ ആക്സസ് ചെയ്യുക</translation> <translation id="1660204651932907780">ശബ്ദം പ്ലേ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുക (ശുപാർശ ചെയ്യുന്നു)</translation> <translation id="1677097821151855053">നിങ്ങളുടെ വിവരങ്ങൾ ഓർക്കാൻ കുക്കികളും മറ്റ് സൈറ്റ് ഡാറ്റയും ഉപയോഗിച്ചിരിക്കുന്നു, ഉദാഹരണത്തിന് നിങ്ങളെ സൈൻ ഇൻ ചെയ്യിക്കാൻ അല്ലെങ്കിൽ പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ. എല്ലാ സൈറ്റുകൾക്കുമുള്ള കുക്കികൾ മാനേജ് ചെയ്യാൻ, <ph name="BEGIN_LINK" />ക്രമീകരണം<ph name="END_LINK" /> കാണുക.</translation> <translation id="1688867105868176567">സൈറ്റ് ഡാറ്റ മായ്ക്കണോ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> എന്നിവയും മറ്റ് <ph name="NUM_MORE" /> എണ്ണവും അനുവദിച്ചു}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> എന്നിവയും മറ്റ് <ph name="NUM_MORE" /> എണ്ണവും അനുവദിച്ചു}}</translation> <translation id="2434158240863470628">ഡൗൺലോഡ് പൂർത്തിയായി <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ലൊക്കേഷൻ ആക്സസ്</translation> <translation id="2482878487686419369">അറിയിപ്പുകൾ</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ആണ് മാനേജ് ചെയ്യുന്നത്</translation> <translation id="2498359688066513246">സഹായവും ഫീഡ്ബാക്കും</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> എന്നിവയും മറ്റ് <ph name="NUM_MORE" /> എണ്ണവും}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> എന്നിവയും മറ്റ് <ph name="NUM_MORE" /> എണ്ണവും}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> <ph name="APP_NAME" /> ആപ്പിനായി അനുമതികൾ ഓണാക്കുക.</translation> -<translation id="945632385593298557">നിങ്ങളുടെ മൈക്രോഫോൺ ആക്സസ് ചെയ്യുക</translation> <translation id="965817943346481315">സൈറ്റ്, അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങള് കാണിക്കുന്നുണ്ടെങ്കില് ബ്ലോക്ക് ചെയ്യുക (ശുപാര്ശ ചെയ്യുന്നു)</translation> <translation id="967624055006145463">ഡാറ്റ സംഭരിച്ചു</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index 6364fd39..7032567 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI төхөөрөмжийг бүрэн хянахыг зөвшөөрөх</translation> <translation id="1509960214886564027">Олон сайтын онцлогууд ажиллахгүй байж болзошгүй</translation> <translation id="1620510694547887537">Камер</translation> -<translation id="1647391597548383849">Камерт хандах</translation> <translation id="1660204651932907780">Сайтуудад дуу тоглуулахыг зөвшөөрөх (санал болгосон)</translation> <translation id="1677097821151855053">Күүки болон сайтын бусад өгөгдлийг таныг нэвтрүүлэх эсвэл зарыг хувийн болгох зэргээр таныг санахад ашигладаг. Бүх сайтын күүкийг удирдахын тулд <ph name="BEGIN_LINK" />Тохиргоог<ph name="END_LINK" /> харна уу.</translation> <translation id="1688867105868176567">Сайтын өгөгдлийг устгах уу?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> мегабайт</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> болон бусад <ph name="NUM_MORE" />-г зөвшөөрсөн}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> болон бусад <ph name="NUM_MORE" />-г зөвшөөрсөн}}</translation> <translation id="2434158240863470628">Татаж дууссан <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Байршилд нэвтрэх</translation> <translation id="2482878487686419369">Мэдэгдэл</translation> <translation id="2490684707762498678"><ph name="APP_NAME" />-с удирддаг</translation> <translation id="2498359688066513246">Тусламж болон санал хүсэлт</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> болон бусад <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> болон бусад <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" />-н зөвшөөрлийг <ph name="BEGIN_LINK" />Андройдын тохиргоо<ph name="END_LINK" />-нд асаана уу.</translation> -<translation id="945632385593298557">Микрофонд хандах</translation> <translation id="965817943346481315">Сайт төвөгтэй эсвэл хуурамч зар харуулсан тохиолдолд блоклох (санал болгосон)</translation> <translation id="967624055006145463">Хадгалсан өгөгдөл</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb index 6705c32..25089494 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI डिव्हाइसेसच्या पूर्ण नियंत्रणास अनुमती द्या</translation> <translation id="1509960214886564027">अनेक साइटवरील वैशिष्ट्यांमध्ये खंड पडू शकतो</translation> <translation id="1620510694547887537">कॅमेरा</translation> -<translation id="1647391597548383849">तुमचा कॅमेरा ॲक्सेस करा</translation> <translation id="1660204651932907780">साइटना ध्वनी प्ले करण्याची परवानगी द्या (शिफारस केलेले)</translation> <translation id="1677097821151855053">कुकी आणि इतर साइट डेटा तुम्हाला लक्षात ठेवण्यासाठी वापरला जातो, उदाहरणार्थ, तुम्हाला साइन इन करण्यासाठी किंवा जाहिराती पर्सनलाइझ करण्यासाठी. सर्व साइटसाठी कुकी व्यवस्थापित करण्याकरिता <ph name="BEGIN_LINK" />सेटिंग्ज<ph name="END_LINK" /> पहा.</translation> <translation id="1688867105868176567">साइट डेटा साफ करायचा?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> आणि आणखी <ph name="NUM_MORE" /> ला अनुमती दिली}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> आणि आणखी <ph name="NUM_MORE" /> ना अनुमती दिली}}</translation> <translation id="2434158240863470628">डाउनलोड पूर्ण झाले <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">स्थान ॲक्सेस</translation> <translation id="2482878487686419369">सूचना</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> द्वारे व्यवस्थापित केले आहे</translation> <translation id="2498359688066513246">मदत आणि अभिप्राय</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ब्लूटूथ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> आणि आणखी <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> आणि आणखी <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" /> मध्ये <ph name="APP_NAME" /> साठी परवानग्या सुरू करा.</translation> -<translation id="945632385593298557">तुमचा मायक्रोफोन ॲक्सेस करा</translation> <translation id="965817943346481315">साइट अनाहूत किंवा दिशाभूल करणाऱ्या जाहिराती दाखवत असल्यास ब्लॉक करा (शिफारस केलेले)</translation> <translation id="967624055006145463">डेटा स्टोअर केला</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index a5d965b..a8f8f3e8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Benarkan kawalan penuh peranti MIDI</translation> <translation id="1509960214886564027">Ciri pada banyak tapak mungkin rosak</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Akses kamera anda</translation> <translation id="1660204651932907780">Benarkan tapak untuk memainkan bunyi (disyorkan)</translation> <translation id="1677097821151855053">Kuki dan data tapak lain digunakan untuk mengingat anda, misalnya untuk log anda masuk atau memperibadikan iklan. Untuk mengurus kuki bagi semua tapak, lihat <ph name="BEGIN_LINK" />Tetapan<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Kosongkan data tapak?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi dibenarkan}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi dibenarkan}}</translation> <translation id="2434158240863470628">Muat turun selesai: <ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Akses lokasi</translation> <translation id="2482878487686419369">Pemberitahuan</translation> <translation id="2490684707762498678">Diurus oleh <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Bantuan & maklum balas</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi}}</translation> <translation id="913657688200966289">Hidupkan kebenaran untuk <ph name="APP_NAME" /> dalam <ph name="BEGIN_LINK" />Tetapan Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Akses mikrofon anda</translation> <translation id="965817943346481315">Sekat jika tapak menyiarkan iklan yang mengganggu atau mengelirukan (disyorkan)</translation> <translation id="967624055006145463">Data disimpan</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index 7b08d23..3f6fa63 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ကိရိယာများအား အပြည့်အဝ ထိန်းချုပ်ခွင့် ပြုရန်</translation> <translation id="1509960214886564027">ဝဘ်ဆိုက်အတော်များများရှိ ဝန်ဆောင်မှုများ ရပ်သွားနိုင်သည်</translation> <translation id="1620510694547887537">ကင်မရာ</translation> -<translation id="1647391597548383849">သင့်ကင်မရာကို ဝင်ကြည့်မည်</translation> <translation id="1660204651932907780">ဝဘ်ဆိုက်များအား အသံဖွင့်ခွင့်ပြုရန် (အကြံပြုထားသည်)</translation> <translation id="1677097821151855053">သင့်ကို မှတ်ထားရန်အတွက် ကွတ်ကီးများနှင့် အခြား ဝဘ်ဆိုက်ဒေတာများကို အသုံးပြုပြီး ဥပမာ - သင့်ကို အကောင့်ဝင်ပေးရန် သို့မဟုတ် စိတ်ကြိုက်ပြင်ထားသော ကြော်ငြာများပြရန်။ ဝဘ်ဆိုက်အားလုံးအတွက် ကွတ်ကီးများကို စီမံရန် <ph name="BEGIN_LINK" />ဆက်တင်များ<ph name="END_LINK" /> ကို ကြည့်ပါ။</translation> <translation id="1688867105868176567">ဝဘ်ဆိုက်ဒေတာများကို ရှင်းလင်းလိုပါသလား။</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> မီဂါဘိုက်</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> နှင့် နောက်ထပ် <ph name="NUM_MORE" /> ခု ခွင့်ပြုထားသည်}other{<ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> နှင့် နောက်ထပ် <ph name="NUM_MORE" /> ခု ခွင့်ပြုထားသည်}}</translation> <translation id="2434158240863470628">ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">တည်နေရာ ရယူသုံးမှု</translation> <translation id="2482878487686419369">အကြောင်းကြားစာ</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> က စီမံခန့်ခွဲထားပါသည်</translation> <translation id="2498359688066513246">အကူအညီ & အကြံပြုချက်</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ဘလူးတုသ်</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> နှင့် နောက်ထပ် <ph name="NUM_MORE" /> ခု}other{<ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> နှင့် နောက်ထပ် <ph name="NUM_MORE" /> ခု}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင် <ph name="APP_NAME" /> အတွက် ခွင့်ပြုချက်များကို ဖွင့်ပါ။</translation> -<translation id="945632385593298557">သင့်မိုက်အား အသုံးပြုမည်</translation> <translation id="965817943346481315">စိတ်အနှောင့်အယှက်ဖြစ်စေသော (သို့) အထင်အမြင်မှားစေသော ကြော်ငြာများ ပြလျှင် ဝဘ်ဆိုက်ကို ပိတ်သည် (အကြံပြုထားသည်)</translation> <translation id="967624055006145463">သိမ်းဆည်းထားသည့် ဒေတာ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb index 992cb1a..cfec33b6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI यन्त्रहरूको पूर्ण नियन्त्रणलाई अनुमति दिनुहोस्</translation> <translation id="1509960214886564027">कयौँ साइटका सुविधाहरूले काम नगर्न सक्छन्</translation> <translation id="1620510694547887537">क्यामेरा</translation> -<translation id="1647391597548383849">आफ्नो क्यामेरा पहुँच गर्नुहोस्</translation> <translation id="1660204651932907780">साइटहरूलाई आवाज प्ले गर्न अनुमति दिनुहोस् (सिफारिस गरिएको)</translation> <translation id="1677097821151855053">कुकी र साइटका अन्य डेटा तपाईंको जानकारी याद राख्न प्रयोग गरिन्छन्। जस्तै, कुकी र साइटका अन्य डेटा तपाईंलाई साइन इन गराउन वा तपाईंको चाखअनुसारका विज्ञापन देखाउन प्रयोग गरिन्छन्। सबै साइटका कुकीहरू व्यवस्थापन गर्न <ph name="BEGIN_LINK" />सेटिङ<ph name="END_LINK" />मा जानुहोस्।</translation> <translation id="1688867105868176567">साइटको डेटा खाली गर्ने हो?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> एम.बि.</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> र थप <ph name="NUM_MORE" /> सुविधासम्बन्धी अनुमति दिइएको छ}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> र थप <ph name="NUM_MORE" /> सुविधासम्बन्धी अनुमति दिइएको छ}}</translation> <translation id="2434158240863470628">डाउनलोड सम्पन्न भयो <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">स्थान पहुँच</translation> <translation id="2482878487686419369">सूचनाहरू</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ले व्यवस्थापन गरेको</translation> <translation id="2498359688066513246">मद्दत र प्रतिक्रिया</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ब्लुटुथ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> र थप <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> र थप <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android का सेटिङ<ph name="END_LINK" />मा गई <ph name="APP_NAME" /> लाई अनुमति दिनुहोस्।</translation> -<translation id="945632385593298557">आफ्नो माइक्रोफोन पहुँच गर्नुहोस्</translation> <translation id="965817943346481315">साइटले हस्तक्षेपकारी वा भ्रामक विज्ञापनहरू देखाएमा त्यसलाई रोक लगाउनुहोस् (सिफारिस गरिएको)</translation> <translation id="967624055006145463">डेटा भण्डारण गरियो</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb index be5009a2..edccc2b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Volledig beheer van MIDI-apparaten toestaan</translation> <translation id="1509960214886564027">Functies op veel sites werken mogelijk niet meer</translation> <translation id="1620510694547887537">Camera</translation> -<translation id="1647391597548383849">Toegang tot camera</translation> <translation id="1660204651932907780">Toestaan dat sites geluid afspelen (aanbevolen)</translation> <translation id="1677097821151855053">Cookies en andere sitegegevens worden gebruikt om je te onthouden, bijvoorbeeld voor inloggen of gepersonaliseerde advertenties. Ga naar <ph name="BEGIN_LINK" />Instellingen<ph name="END_LINK" /> om de cookies voor alle sites te beheren.</translation> <translation id="1688867105868176567">Sitegegevens wissen?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" /> toegestaan}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" /> toegestaan}}</translation> <translation id="2434158240863470628">Download voltooid <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Locatietoegang</translation> <translation id="2482878487686419369">Meldingen</translation> <translation id="2490684707762498678">Beheerd door <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Hulp en feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Schakel rechten in voor <ph name="APP_NAME" /> via de <ph name="BEGIN_LINK" />Android-instellingen<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Toegang tot je microfoon</translation> <translation id="965817943346481315">Blokkeren als site opdringerige of misleidende advertenties weergeeft (aanbevolen)</translation> <translation id="967624055006145463">Opgeslagen gegevens</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb index 73a9ae2..99dcd9a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Full kontroll over MIDI-enheter</translation> <translation id="1509960214886564027">Det kan hende at funksjoner på mange nettsteder slutter å fungere</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Tilgang til kameraet ditt</translation> <translation id="1660204651932907780">Tillat nettsteder å spille av lyd (anbefales)</translation> <translation id="1677097821151855053">Informasjonskapsler og andre nettstedsdata brukes til å huske deg, for eksempel for å logge deg på eller for å vise deg personlig tilpassede annonser. For å administrere informasjonskapsler for alle nettsteder, se <ph name="BEGIN_LINK" />Innstillinger<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Vil du fjerne nettstedsdata?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> til er tillatt}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> til er tillatt}}</translation> <translation id="2434158240863470628">Nedlasting fullført <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Posisjonstilgang</translation> <translation id="2482878487686419369">Varsler</translation> <translation id="2490684707762498678">Administreres av <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Hjelp og tilbakemelding</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> til}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> til}}</translation> <translation id="913657688200966289">Slå på tillatelser for <ph name="APP_NAME" /> i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Tilgang til mikrofonen din</translation> <translation id="965817943346481315">Blokkér hvis nettstedet viser forstyrrende eller villedende annonser (anbefalt)</translation> <translation id="967624055006145463">Lagrede data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb index cb46e9f..f7a633fe 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ଡିଭାଇସ୍ଗୁଡ଼ିକର ପୂର୍ଣ୍ଣ ନିୟନ୍ତ୍ରଣର ଅନୁମତି ଦିଅନ୍ତୁ</translation> <translation id="1509960214886564027">କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ</translation> <translation id="1620510694547887537">କ୍ୟାମେରା</translation> -<translation id="1647391597548383849">ଆପଣଙ୍କର କ୍ୟାମେରା ଆକ୍ସେସ୍ କରନ୍ତୁ</translation> <translation id="1660204651932907780">ସାଉଣ୍ଡ ଚାଲୁ କରିବାକୁ ସାଇଟ୍ଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ (ସୁପାରିଶ୍ କରାଯାଇଛି)</translation> <translation id="1677097821151855053">ଆପଣଙ୍କୁ ସାଇନ୍ ଇନ୍ କରିବା କିମ୍ବା ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପରି, ଆପଣଙ୍କ ସୂଚନା ମନେରଖିବା ପାଇଁ କୁକୀ ଏବଂ ଅନ୍ୟ ସାଇଟ୍ ଡାଟା ବ୍ୟବହାର କରାଯାଇଥାଏ। ସମସ୍ତ ସାଇଟ୍ ପାଇଁ କୁକୀଗୁଡ଼ିକ ପରିଚାଳନା କରିବାକୁ, <ph name="BEGIN_LINK" />ସେଟିଂସ୍<ph name="END_LINK" /> ଦେଖନ୍ତୁ।</translation> <translation id="1688867105868176567">ସାଇଟ୍ ଡାଟା ଖାଲି କରିବେ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ଏବଂ ଅଧିକ <ph name="NUM_MORE" />ଟିକୁ ଅନୁମତି ଦିଆଯାଇଛି}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ଏବଂ ଅଧିକ <ph name="NUM_MORE" />ଟିକୁ ଅନୁମତି ଦିଆଯାଇଛି}}</translation> <translation id="2434158240863470628">ଡାଉନ୍ଲୋଡ୍ ଶେଷ ହେଲା <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ଲୋକେସନ୍ ଆକ୍ସେସ୍</translation> <translation id="2482878487686419369">ବିଜ୍ଞପ୍ତି</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ଦ୍ୱାରା ପରିଚାଳିତ</translation> <translation id="2498359688066513246">ସାହାଯ୍ୟ ଓ ମତାମତ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ବ୍ଲୁଟୁଥ୍</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ଓ ଅଧିକ <ph name="NUM_MORE" />ଟି}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ଓ ଅଧିକ <ph name="NUM_MORE" />ଟି}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ସେଟିଂସ<ph name="END_LINK" />ରେ <ph name="APP_NAME" /> ପାଇଁ ଅନୁମତି ଚାଲୁ କରନ୍ତୁ।</translation> -<translation id="945632385593298557">ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍ କରନ୍ତୁ</translation> <translation id="965817943346481315">ଯଦି ସାଇଟ୍ ଅନଧିକାର ପ୍ରବେଶ କରିଥିବା କିମ୍ବା ବିଭ୍ରାନ୍ତିକର ବିଜ୍ଞାପନ ଦେଖାଉଛି, ତେବେ ବ୍ଲକ୍ କରନ୍ତୁ(ସୁପାରିଶ୍ କରାଯାଇଛି)</translation> <translation id="967624055006145463">ଡାଟା ଷ୍ଟୋର୍ କରାଯାଇଛି</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index a8b1802..b3de7a2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI ਡਿਵਾਈਸਾਂ ਦੇ ਪੂਰੇ ਨਿਯੰਤਰਣ ਦੀ ਆਗਿਆ ਦਿਓ</translation> <translation id="1509960214886564027">ਸ਼ਾਇਦ ਕਈ ਸਾਈਟਾਂ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ</translation> <translation id="1620510694547887537">ਕੈਮਰਾ</translation> -<translation id="1647391597548383849">ਆਪਣੇ ਕੈਮਰੇ ਤੱਕ ਪਹੁੰਚੋ</translation> <translation id="1660204651932907780">ਸਾਈਟਾਂ ਨੂੰ ਧੁਨੀ ਵਜਾਉਣ ਦਿਓ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> <translation id="1677097821151855053">ਕੁਕੀਜ਼ ਅਤੇ ਹੋਰ ਸਾਈਟ ਡਾਟੇ ਦੀ ਵਰਤੋਂ ਤੁਹਾਨੂੰ ਯਾਦ ਰੱਖਣ ਲਈ ਕੀਤੀ ਜਾਂਦੀ ਹੈ, ਉਦਾਹਰਨ ਦੇ ਤੌਰ 'ਤੇ ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਜਾਂ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ। ਸਾਰੀਆਂ ਸਾਈਟਾਂ ਲਈ ਕੁਕੀਜ਼ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ, <ph name="BEGIN_LINK" />ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਦੇਖੋ।</translation> <translation id="1688867105868176567">ਕੀ ਸਾਈਟ ਡਾਟਾ ਕਲੀਅਰ ਕਰਨਾ ਹੈ?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="NUM_MORE" /> ਹੋਰ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਗਈ}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="NUM_MORE" /> ਹੋਰ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਗਈ}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="NUM_MORE" /> ਹੋਰ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਗਈ}}</translation> <translation id="2434158240863470628">ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਪਹੁੰਚ</translation> <translation id="2482878487686419369">ਸੂਚਨਾਵਾਂ</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="2498359688066513246">ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">ਬਲੂਟੁੱਥ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="NUM_MORE" /> ਹੋਰ}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="NUM_MORE" /> ਹੋਰ}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ਅਤੇ <ph name="NUM_MORE" /> ਹੋਰ}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ਸੈਟਿੰਗਾਂ<ph name="END_LINK" /> ਵਿੱਚ <ph name="APP_NAME" /> ਲਈ ਇਜਾਜ਼ਤਾਂ ਚਾਲੂ ਕਰੋ।</translation> -<translation id="945632385593298557">ਆਪਣੇ ਮਾਈਕ੍ਰੋਫੋਨ ਤੱਕ ਪਹੁੰਚੋ</translation> <translation id="965817943346481315">ਜੇਕਰ ਸਾਈਟ ਦਖਲਅੰਦਾਜ਼ੀ ਅਤੇ ਗੁਮਰਾਹ ਕਰਨ ਵਾਲੇ ਵਿਗਿਆਪਨ ਦਿਖਾਉਂਦੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਬਲਾਕ ਕਰੋ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> <translation id="967624055006145463">ਸਟੋਰ ਕੀਤਾ ਡਾਟਾ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index d08f41f..da75fd7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Pełne sterowanie urządzeniami MIDI</translation> <translation id="1509960214886564027">Funkcje wielu stron mogą nie działać prawidłowo</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Dostęp do kamery</translation> <translation id="1660204651932907780">Zezwalaj na odtwarzanie dźwięku na stronach internetowych (zalecane)</translation> <translation id="1677097821151855053">Plików cookie i innych danych stron używamy, żeby Cię zapamiętać, na przykład w celu logowania czy personalizowania reklam. Plikami cookie wszystkich stron możesz zarządzać w <ph name="BEGIN_LINK" />Ustawieniach<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Wyczyścić dane witryn?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Dozwolone: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}few{Dozwolone: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}many{Dozwolone: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}other{Dozwolone: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Ukończono pobieranie <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Dostęp do lokalizacji</translation> <translation id="2482878487686419369">Powiadomienia</translation> <translation id="2490684707762498678">Zarządzane przez <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Pomoc i opinie</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Przyznaj aplikacji <ph name="APP_NAME" /> uprawnienia w <ph name="BEGIN_LINK" />ustawieniach Androida<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Dostęp do mikrofonu</translation> <translation id="965817943346481315">Zablokuj, jeśli na stronie wyświetlają się uciążliwe lub wprowadzające w błąd reklamy (zalecane)</translation> <translation id="967624055006145463">Zapisane dane</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index 4d09cf7..7e555c969 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Permitir controle total de dispositivos MIDI</translation> <translation id="1509960214886564027">Os recursos de muitos sites podem apresentar falhas</translation> <translation id="1620510694547887537">Câmera</translation> -<translation id="1647391597548383849">Acessar sua câmera</translation> <translation id="1660204651932907780">Permitir o áudio dos sites (recomendado)</translation> <translation id="1677097821151855053">Os cookies e outros dados do site são usados para lembrar de você, por exemplo, para conectar sua conta ou personalizar anúncios. Para gerenciar os cookies de todos os sites, acesse <ph name="BEGIN_LINK" />Configurações<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Limpar dados do site?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Permitidas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}one{Permitidas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}other{Permitidas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Download concluído <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Acesso ao local</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2490684707762498678">Gerenciadas por <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ajuda e feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Ative as permissões para o app <ph name="APP_NAME" /> nas <ph name="BEGIN_LINK" />configurações do Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Acessar seu microfone</translation> <translation id="965817943346481315">Bloquear se o site mostrar anúncios invasivos ou enganosos (recomendado)</translation> <translation id="967624055006145463">Dados armazenados</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index 230e45b..a843183 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Perm. controlo total dispo. MIDI</translation> <translation id="1509960214886564027">As funcionalidades em muitos sites podem falhar.</translation> <translation id="1620510694547887537">Câmara</translation> -<translation id="1647391597548383849">Aceder à câmara</translation> <translation id="1660204651932907780">Permitir que os sites reproduzam som (recomendado)</translation> <translation id="1677097821151855053">Os cookies e outros dados de sites são utilizados para memorizar o utilizador, por exemplo, para iniciar a sua sessão ou para personalizar anúncios. Para gerir cookies de todos os sites, veja <ph name="BEGIN_LINK" />Definições <ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Pretende limpar os dados do site?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" /> permitidas.}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" /> permitidas.}}</translation> <translation id="2434158240863470628">Transferência concluída: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Acesso à localização</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2490684707762498678">Gerido por <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ajuda e comentários</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />.}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />.}}</translation> <translation id="913657688200966289">Ative as autorizações para a app <ph name="APP_NAME" /> nas <ph name="BEGIN_LINK" />Definições do Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Aceder ao microfone</translation> <translation id="965817943346481315">Bloquear se o site apresentar anúncios intrusivos ou enganadores (recomendado)</translation> <translation id="967624055006145463">Dados armazenados</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb index f771fb2..0deddefb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Control complet dispozitive MIDI</translation> <translation id="1509960214886564027">Este posibil ca funcțiile de pe mai multe site-uri să fie întrerupte</translation> <translation id="1620510694547887537">Cameră</translation> -<translation id="1647391597548383849">Accesează camera foto</translation> <translation id="1660204651932907780">Permite site-urilor să redea sunet (recomandat)</translation> <translation id="1677097821151855053">Cookie-urile și alte date ale site-urilor sunt folosite pentru a te reține, de exemplu, pentru a te conecta sau pentru a personaliza anunțuri. Pentru a gestiona cookie-urile pentru toate site-urile, consultă <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Ștergi datele site-ului?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" /> sunt permise}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" /> sunt permise}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" /> sunt permise}}</translation> <translation id="2434158240863470628">Descărcare finalizată <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Accesul la locație</translation> <translation id="2482878487686419369">Notificări</translation> <translation id="2490684707762498678">Gestionate de <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ajutor și feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Activează permisiunile pentru <ph name="APP_NAME" /> din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Accesează microfonul</translation> <translation id="965817943346481315">Blochează dacă site-ul afișează anunțuri deranjante sau înșelătoare (recomandat)</translation> <translation id="967624055006145463">Date stocate</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index 34490c6..a0a6bd11 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Полный доступ к управлению MIDI-устройствами</translation> <translation id="1509960214886564027">Многие функции на сайтах могут работать некорректно</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Доступ к камере</translation> <translation id="1660204651932907780">Разрешить сайтам воспроизводить звуки (рекомендуется)</translation> <translation id="1677097821151855053">Файлы cookie и другие данные сайтов используются чтобы хранить информацию о вас, в том числе для входа в систему и персонализации рекламы. Управлять файлами cookie можно в <ph name="BEGIN_LINK" />разделе настроек<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Удалить данные сайта?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> МБ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Разрешено: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}one{Разрешено: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}few{Разрешено: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}many{Разрешено: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}other{Разрешено: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Скачивание завершено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Данные о местоположении</translation> <translation id="2482878487686419369">Уведомления</translation> <translation id="2490684707762498678">Под управлением приложения "<ph name="APP_NAME" />"</translation> <translation id="2498359688066513246">Справка/отзыв</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Предоставьте приложению "<ph name="APP_NAME" />" разрешения в <ph name="BEGIN_LINK" />настройках Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Доступ к микрофону</translation> <translation id="965817943346481315">Блокировать, если сайт показывает навязчивую или вводящую в заблуждение рекламу (рекомендуется)</translation> <translation id="967624055006145463">Объем занятой памяти</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb index a1af7a4..6727440 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI උපාංගවල සම්පූර්ණ පාලනයට ඉඩ දෙන්න</translation> <translation id="1509960214886564027">බොහෝ වෙබ් අඩවි මත විශේෂාංග කැඩී ගිය හැක</translation> <translation id="1620510694547887537">කැමරාව</translation> -<translation id="1647391597548383849">ඔබේ කැමරාව වෙත ප්රවේශ වන්න</translation> <translation id="1660204651932907780">අඩවිවලට ශබ්දය වාදනය කිරීමට ඉඩ දෙන්න (නිර්දේශිතයි)</translation> <translation id="1677097821151855053">ඔබව මතක තබා ගැනීමට කුකි සහ වෙනත් අඩවි දත්ත භාවිත කරයි, උදාහරණයක් ලෙස ඔබව පිරීමට හෝ වෙළඳ දැන්වීම් පුද්ගලිකකරණය කිරීමට. සියලුම වෙබ් අඩවි සඳහා කුකී කළමනාකරණය කිරීමට, <ph name="BEGIN_LINK" />සැකසීම්<ph name="END_LINK" /> බලන්න.</translation> <translation id="1688867105868176567">අඩවි දත්ත හිස් කරන්නද?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තව <ph name="NUM_MORE" />ක් ඉඩ දෙන ලදි}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තව <ph name="NUM_MORE" />ක් ඉඩ දෙන ලදි}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තව <ph name="NUM_MORE" />ක් ඉඩ දෙන ලදි}}</translation> <translation id="2434158240863470628">බාගැනීම සම්පූර්ණයි <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">ස්ථානය ප්රවේශය</translation> <translation id="2482878487686419369">දැනුම්දීම්</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> විසින් කළමනා කෙරේ</translation> <translation id="2498359688066513246">උදවු සහ ප්රතිපෝෂණය</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> සඳහා අවසර <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ ක්රියාත්මක කරන්න.</translation> -<translation id="945632385593298557">ඔබේ මයික්රෆෝනය වෙත ප්රවේශ වන්න</translation> <translation id="965817943346481315">වෙබ් අඩවිය ආක්රමණශීලී හෝ නොමඟ යවන දැන්වීම් පෙන්වන්නේ නම් අවහිර කරන්න (නිර්දේශිතයි)</translation> <translation id="967624055006145463">දත්ත ගබඩා කර ඇත</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index 2c4750d..17c2fb28 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Povoliť úplné ovlád. zar. MIDI</translation> <translation id="1509960214886564027">Funkcie na mnohých weboch môžu zlyhávať</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Prístup ku kamere</translation> <translation id="1660204651932907780">Povoliť webom prehrávať zvuk (odporúčané)</translation> <translation id="1677097821151855053">Stránky si vás pomocou súborov cookie a ďalších údajov webov zapamätajú, napríklad vás pomocou nich prihlásia alebo prispôsobia reklamy. Ak chcete spravovať súbory cookie pre všetky weby, prejdite do <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Vymazať dáta webu?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Sú udelené povolenia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalšie}few{Sú udelené povolenia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalšie}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more allowed}other{Sú udelené povolenia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalších}}</translation> <translation id="2434158240863470628">Sťahovanie bolo dokončené <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Prístup k polohe</translation> <translation id="2482878487686419369">Upozornenia</translation> <translation id="2490684707762498678">Spravuje <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Pomocník a spätná väzba</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalšie povolenie}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalšie povolenia}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalších povolení}}</translation> <translation id="913657688200966289">Zapnite v <ph name="BEGIN_LINK" />nastaveniach Androidu<ph name="END_LINK" /> povolenia pre aplikáciu <ph name="APP_NAME" />.</translation> -<translation id="945632385593298557">Prístup k mikrofónu</translation> <translation id="965817943346481315">Blokovať, ak web zobrazuje obťažujúce alebo zavádzajúce reklamy (odporúčané)</translation> <translation id="967624055006145463">Uložené dáta</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb index 2917ba9..0ff4c31 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Dovolitev popolnega nadzora nad napravami MIDI</translation> <translation id="1509960214886564027">Funkcije na številnih spletnih mestih morda ne bodo delovale</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Dostop do fotoaparata</translation> <translation id="1660204651932907780">Dovoli spletnim mestom predvajanje zvoka (priporočljivo)</translation> <translation id="1677097821151855053">Piškotke in druge podatke spletnega mesta uporabljamo, da si zapomnimo vaše podatke, na primer za prijavo ali osebno prilagajanje oglasov. Če želite upravljati piškotke za vsa spletna mesta, si oglejte <ph name="BEGIN_LINK" />Nastavitve<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Ali želite izbrisati podatke spletnega mesta?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Dovoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}one{Dovoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}two{Dovoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}few{Dovoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}other{Dovoljeno: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Prenos je končan <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Dostop do lokacije</translation> <translation id="2482878487686419369">Obvestila</translation> <translation id="2490684707762498678">Upravlja aplikacija <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Pomoč in povratne inform.</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}two{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">V <ph name="BEGIN_LINK" />nastavitvah za Android<ph name="END_LINK" /> vklopite dovoljenja za aplikacijo <ph name="APP_NAME" />.</translation> -<translation id="945632385593298557">Dostop do mikrofona</translation> <translation id="965817943346481315">Blokiraj, če spletno mesto prikazuje vsiljive ali zavajajoče oglase (priporočljivo)</translation> <translation id="967624055006145463">Shranjeni podatki</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb index 2927d2f..35131d1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Lejo kontrollin e plotë të pajisjeve MIDI</translation> <translation id="1509960214886564027">Veçoritë në shumë sajte mund të ndalojnë së funksionuari</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Qasu te kamera</translation> <translation id="1660204651932907780">Lejo që sajtet të luajnë tinguj (rekomandohet)</translation> <translation id="1677097821151855053">Kukit dhe të dhënat e tjera të sajtit përdoren për të të kujtuar ty, për shembull për të të identifikuar ose për të personalizuar reklamat. Për të menaxhuar kukit për të gjitha sajtet, shiko <ph name="BEGIN_LINK" />Cilësimet<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Të spastrohen të dhënat e sajtit?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dhe <ph name="NUM_MORE" /> tjetër e lejuar}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dhe <ph name="NUM_MORE" /> të tjera të lejuara}}</translation> <translation id="2434158240863470628">Shkarkimi përfundoi <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Qasja e vendndodhjes</translation> <translation id="2482878487686419369">Njoftimet</translation> <translation id="2490684707762498678">Menaxhuar nga <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Ndihmë dhe komente</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth-i</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dhe <ph name="NUM_MORE" /> tjetër}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dhe <ph name="NUM_MORE" /> të tjera}}</translation> <translation id="913657688200966289">Aktivizo lejet për <ph name="APP_NAME" /> në <ph name="BEGIN_LINK" />Cilësimet e Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Qasu te mikrofoni</translation> <translation id="965817943346481315">Blloko nëse sajti shfaq reklama ndërhyrëse ose mashtruese (rekomandohet)</translation> <translation id="967624055006145463">Të dhënat e ruajtura</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb index b1d6d5c01..36e807b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Puna kontrola nad MIDI uređajima</translation> <translation id="1509960214886564027">Funkcije na mnogim sajtovima mogu da prestanu sa radom</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Pristup kameri</translation> <translation id="1660204651932907780">Dozvoli sajtovima da puštaju zvuk (preporučeno)</translation> <translation id="1677097821151855053">Kolačići i drugi podaci o sajtovima se koriste da biste bili zapamćeni, na primer, radi prijavljivanja ili personalizovanja oglasa. Da biste upravljali kolačićima za sve sajtove, pogledajte <ph name="BEGIN_LINK" />Podešavanja<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Želite li da obrišete podatke sajta?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Odobrene su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Odobrene su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Odobrene su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Odobrene su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Preuzimanje je završeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Pristup lokaciji</translation> <translation id="2482878487686419369">Obaveštenja</translation> <translation id="2490684707762498678">Upravlja <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Pomoć i povratne informacije</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Uključite dozvole za aplikaciju <ph name="APP_NAME" /> u <ph name="BEGIN_LINK" />Android podešavanjima<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Pristup mikrofonu</translation> <translation id="965817943346481315">Blokiraj ako sajt prikazuje oglase koji ometaju aktivnosti ili obmanjujuće oglase (preporučeno)</translation> <translation id="967624055006145463">Sačuvani podaci</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb index 305e5c1..37e17277 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Пуна контрола над MIDI уређајима</translation> <translation id="1509960214886564027">Функције на многим сајтовима могу да престану са радом</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Приступ камери</translation> <translation id="1660204651932907780">Дозволи сајтовима да пуштају звук (препоручено)</translation> <translation id="1677097821151855053">Колачићи и други подаци о сајтовима се користе да бисте били запамћени, на пример, ради пријављивања или персонализовања огласа. Да бисте управљали колачићима за све сајтове, погледајте <ph name="BEGIN_LINK" />Подешавања<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Желите ли да обришете податке сајта?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Одобрене су дозволе <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}one{Одобрене су дозволе <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}few{Одобрене су дозволе <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}other{Одобрене су дозволе <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Преузимање је завршено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Приступ локацији</translation> <translation id="2482878487686419369">Обавештења</translation> <translation id="2490684707762498678">Управља <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Помоћ и повратне информације</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и још <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Укључите дозволе за апликацију <ph name="APP_NAME" /> у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Приступ микрофону</translation> <translation id="965817943346481315">Блокирај ако сајт приказује огласе који ометају активности или обмањујуће огласе (препоручено)</translation> <translation id="967624055006145463">Сачувани подаци</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb index 6b9d6ede..fe38dfd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Tillåt fullst. kontroll av MIDI</translation> <translation id="1509960214886564027">Funktioner kan sluta att fungera på många webbplatser</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Tillgång till din kamera</translation> <translation id="1660204651932907780">Tillåt att ljud spelas upp på webbplatser (rekommenderas)</translation> <translation id="1677097821151855053">Cookies och annan webbplatsdata används för att komma ihåg dig, till exempel vid inloggning och annonsanpassning. Du kan hantera cookies för alla webbplatser i <ph name="BEGIN_LINK" />inställningarna<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Vill du ta bort webbplatsdata?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> och <ph name="NUM_MORE" /> till tillåts}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> och <ph name="NUM_MORE" /> till tillåts}}</translation> <translation id="2434158240863470628">Nedladdningen är klar<ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Platsåtkomst</translation> <translation id="2482878487686419369">Aviseringar</translation> <translation id="2490684707762498678">Hanteras av <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Hjälp och feedback</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> och <ph name="NUM_MORE" /> till}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> och <ph name="NUM_MORE" /> till}}</translation> <translation id="913657688200966289">Aktivera behörigheter för <ph name="APP_NAME" /> i <ph name="BEGIN_LINK" />Android-inställningarna<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Tillgång till din mikrofon</translation> <translation id="965817943346481315">Blockera om påträngande eller vilseledande annonser visas på webbplatsen (rekommenderas)</translation> <translation id="967624055006145463">Sparad data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb index 277c21c..cc853d8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Ruhusu udhibiti kamili wa vifaa vya MIDI</translation> <translation id="1509960214886564027">Huenda vipengele kwenye tovuti nyingi vikakosa kufanya kazi</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Kufikia kamera yako</translation> <translation id="1660204651932907780">Ruhusu tovuti kucheza sauti (inapendekezwa)</translation> <translation id="1677097821151855053">Vidakuzi na data nyingine ya tovuti hutumika kukukumbuka, kwa mfano kukuingiza katika akaunti au kuweka mapendeleo kwenye matangazo. Ili udhibiti vidakuzi vya tovuti zote, angalia <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Ungependa kufuta data ya tovuti?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747">MB <ph name="MEGABYTES" /></translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Umeruhusu <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> na nyingine<ph name="NUM_MORE" />}other{Umeruhusu <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> na nyingine<ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Upakuaji umekamilika <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Ufikiaji wa eneo</translation> <translation id="2482878487686419369">Arifa</translation> <translation id="2490684707762498678">Inasimamiwa na <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Usaidizi na maoni</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> na nyingine <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> na nyingine <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Washa ruhusa za <ph name="APP_NAME" /> katika <ph name="BEGIN_LINK" />Mipangilio ya Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Kufikia maikrofoni yako</translation> <translation id="965817943346481315">Zuia ikiwa tovuti inaonyesha matangazo yanayopotosha au yanayokatiza huduma (inapendekezwa)</translation> <translation id="967624055006145463">Data iliyohifadhiwa</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index 15d6b2eca..c12be89 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI சாதனங்களுக்கு முழுக் கட்டுப்பாட்டை அனுமதி</translation> <translation id="1509960214886564027">பெரும்பாலான தளங்களிலுள்ள அம்சங்கள் செயல்படாமல் போகக்கூடும்</translation> <translation id="1620510694547887537">கேமரா</translation> -<translation id="1647391597548383849">உங்கள் கேமராவை அணுகலாம்</translation> <translation id="1660204651932907780">ஒலியை இயக்க, தளங்களை அனுமதிக்கும் (பரிந்துரைக்கப்படுவது)</translation> <translation id="1677097821151855053">குக்கீகளும் பிற தளத்தின் தரவும் உங்கள் செயல்பாட்டை நினைவில் வைத்துக்கொள்ளப் பயன்படுத்தப்படுகின்றன. உதாரணமாக, உங்களை உள்நுழையச் செய்வது, விளம்பரங்களைப் பிரத்தியேகமாக்குவது. அனைத்துத் தளங்களுக்கான குக்கீகளையும் நிர்வகிக்க, <ph name="BEGIN_LINK" />அமைப்புகளைப்<ph name="END_LINK" /> பார்க்கவும்.</translation> <translation id="1688867105868176567">தளத் தரவை அழிக்கவா?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> மெ.பை.</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> & மேலும் <ph name="NUM_MORE" /> அனுமதிகள் வழங்கப்பட்டுள்ளன}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> & மேலும் <ph name="NUM_MORE" /> அனுமதிகள் வழங்கப்பட்டுள்ளன}}</translation> <translation id="2434158240863470628">பதிவிறக்கம் முடிந்தது <ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">இருப்பிட அணுகல்</translation> <translation id="2482878487686419369">அறிவிப்புகள்</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> நிர்வகிக்கிறது</translation> <translation id="2498359688066513246">உதவி & கருத்து</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">புளூடூத்</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> & மேலும் <ph name="NUM_MORE" /> அனுமதிகள்}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> & மேலும் <ph name="NUM_MORE" /> அனுமதிகள்}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android அமைப்புகளில் <ph name="END_LINK" /> <ph name="APP_NAME" /> ஆப்ஸுக்கான அனுமதிகளை இயக்கவும்.</translation> -<translation id="945632385593298557">உங்கள் மைக்ரோஃபோனை அணுகலாம்</translation> <translation id="965817943346481315">குறுக்கிடும் அல்லது தவறாக வழிநடத்தும் விளம்பரங்களை தளம் காண்பித்தால், அதைத் தடு (பரிந்துரைக்கப்படுவது)</translation> <translation id="967624055006145463">சேமிக்கப்பட்ட தரவின்படி</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb index 2dbe496..a054ac4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI పరికరాల పూర్తి నియం. అనుమ.</translation> <translation id="1509960214886564027">చాలా సైట్లలోని ఫీచర్లు పని చేయకుండాపోవచ్చు</translation> <translation id="1620510694547887537">కెమెరా</translation> -<translation id="1647391597548383849">మీ కెమెరా యాక్సెస్ అనుమతి</translation> <translation id="1660204651932907780">ధ్వనిని ప్లే చేయగలిగేలా సైట్లను అనుమతిస్తుంది (సిఫార్సు చేయబడింది)</translation> <translation id="1677097821151855053">మిమ్మల్ని గుర్తుంచుకోవడానికి కుక్కీలు, ఇతర సైట్ డేటా ఉపయోగించబడతాయి, ఉదాహరణకు మిమల్ని సైన్ ఇన్ చేయడం కోసం లేదా యాడ్లను వ్యక్తిగతీకరించడం కోసం. అన్ని సైట్లకు కుక్కీలను మేనేజ్ చేయడానికి, <ph name="BEGIN_LINK" />సెట్టింగ్ల<ph name="END_LINK" />ను చూడండి.</translation> <translation id="1688867105868176567">సైట్ డేటాని క్లియర్ చేయాలా?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ఇంకా మరో <ph name="NUM_MORE" /> అనుమతించబడ్డాయి}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ఇంకా మరో <ph name="NUM_MORE" /> అనుమతించబడ్డాయి}}</translation> <translation id="2434158240863470628">డౌన్లోడ్ పూర్తయింది <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">స్థాన యాక్సెస్</translation> <translation id="2482878487686419369">నోటిఫికేషన్లు</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ద్వారా నిర్వహించబడుతున్నాయి</translation> <translation id="2498359688066513246">సహాయం & అభిప్రాయం</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">బ్లూటూత్</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ఇంకా మరో <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, ఇంకా మరో <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android సెట్టింగ్ల<ph name="END_LINK" />లో <ph name="APP_NAME" /> కోసం అనుమతులను ఆన్ చేయండి.</translation> -<translation id="945632385593298557">మీ మైక్రోఫోన్ యాక్సెస్ అనుమతి</translation> <translation id="965817943346481315">సైట్ అనుచితమైన లేదా తప్పుదారి పట్టించే ప్రకటనలను చూపించినప్పుడు బ్లాక్ చేయి (సిఫార్సు చేయబడింది)</translation> <translation id="967624055006145463">నిల్వ చేయబడిన డేటా</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index 095736b..8ac68e95 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">ควบคุมอุปกรณ์ MIDI ได้สมบูรณ์</translation> <translation id="1509960214886564027">ฟีเจอร์ในหลายเว็บไซต์อาจใช้งานไม่ได้</translation> <translation id="1620510694547887537">กล้องถ่ายรูป</translation> -<translation id="1647391597548383849">เข้าถึงกล้องถ่ายรูป</translation> <translation id="1660204651932907780">อนุญาตให้เว็บไซต์เล่นเสียง (แนะนำ)</translation> <translation id="1677097821151855053">คุกกี้และข้อมูลอื่นๆ ของเว็บไซต์ใช้ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้ให้คุณหรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation> <translation id="1688867105868176567">ล้างข้อมูลเว็บไซต์ไหม</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{อนุญาตให้เข้าถึง<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}other{อนุญาตให้เข้าถึง<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}}</translation> <translation id="2434158240863470628">ดาวน์โหลดเสร็จสมบูรณ์ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">การเข้าถึงตำแหน่ง</translation> <translation id="2482878487686419369">การแจ้งเตือน</translation> <translation id="2490684707762498678">จัดการโดย <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">ความช่วยเหลือและความคิดเห็น</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">บลูทูธ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}other{<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}}</translation> <translation id="913657688200966289">เปิดการใช้สิทธิ์สำหรับ <ph name="APP_NAME" /> ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation> -<translation id="945632385593298557">เข้าถึงไมโครโฟน</translation> <translation id="965817943346481315">บล็อกหากเว็บไซต์แสดงโฆษณาที่แทรกหรือทำให้เข้าใจผิด (แนะนำ)</translation> <translation id="967624055006145463">ข้อมูลที่จัดเก็บ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index 40c8706..e823b83 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI cihazlarının tam denetimine izin verme</translation> <translation id="1509960214886564027">Birçok sitedeki özellikler bozulabilir</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Kameranıza erişim</translation> <translation id="1660204651932907780">Sitelerin ses çalmasına izin ver (önerilir)</translation> <translation id="1677097821151855053">Çerezler ve diğer site verileri sizi hatırlamamız için kullanılır, örneğin oturumunuzu açmak veya reklamları kişiselleştirmek için. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="BEGIN_LINK" />Ayarlar<ph name="END_LINK" /> bölümünden öğrenebilirsiniz.</translation> <translation id="1688867105868176567">Site verileri temizlensin mi?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> tanesi için daha izin verildi}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> tanesi için daha izin verildi}}</translation> <translation id="2434158240863470628">İndirme işlemi tamamlandı <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Konum erişimi</translation> <translation id="2482878487686419369">Bildirimler</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> tarafından yönetiliyor</translation> <translation id="2498359688066513246">Yardım ve geri bildirim</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> tane daha}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ve <ph name="NUM_MORE" /> tane daha}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> için izinleri açmak üzere <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda izinleri açın.</translation> -<translation id="945632385593298557">Mikrofonunuza erişim</translation> <translation id="965817943346481315">Site, araya giren veya yanıltıcı reklamlar gösteriyorsa engelle (önerilen)</translation> <translation id="967624055006145463">Depolanan veriler</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 1bd4e9c..e8d187a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Повний контроль пристроїв MIDI</translation> <translation id="1509960214886564027">Функції на багатьох сайтах можуть не працювати</translation> <translation id="1620510694547887537">Камера</translation> -<translation id="1647391597548383849">Доступ до камери</translation> <translation id="1660204651932907780">Дозволити сайтам відтворювати звук (рекомендується)</translation> <translation id="1677097821151855053">Файли cookie та інші дані із сайтів використовуються, щоб запам'ятати ваші дані, наприклад, щоб входити у ваш обліковий запис або персоналізувати рекламу. Щоб керувати файлами cookie для всіх сайтів, перегляньте <ph name="BEGIN_LINK" />Налаштування<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Очистити дані сайту?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> МБ</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Дозволено: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}one{Дозволено: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}few{Дозволено: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}many{Дозволено: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}other{Дозволено: "<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}}</translation> <translation id="2434158240863470628">Завантажено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Доступ до геоданих</translation> <translation id="2482878487686419369">Сповіщення</translation> <translation id="2490684707762498678">Адміністратор сімейної групи: <ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Довідка й відгуки</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{"<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}one{"<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}few{"<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}many{"<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}other{"<ph name="PERMISSION_1" />", "<ph name="PERMISSION_2" />" і ще <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Увімкніть дозволи для додатка <ph name="APP_NAME" /> у <ph name="BEGIN_LINK" />налаштуваннях Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Доступ до мікрофона</translation> <translation id="965817943346481315">Блокувати, якщо сайт показує нав’язливі чи оманливі оголошення (рекомендовано)</translation> <translation id="967624055006145463">Збережені дані</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb index 468ec9e4..422f719 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI آلات کے مکمل کنٹرول کی اجازت دیں</translation> <translation id="1509960214886564027">بہت سی سائٹس پر خصوصیات میں خلل ہو سکتا ہے</translation> <translation id="1620510694547887537">کیمرا</translation> -<translation id="1647391597548383849">اپنے کیمرے تک رسائی حاصل کریں</translation> <translation id="1660204651932907780">سائٹس کو آواز چلانے کی اجازت دیں (تجویز کردہ)</translation> <translation id="1677097821151855053">کوکیز اور سائٹ کا دیگر ڈیٹا آپ کو یاد رکھنے کے لئے استعمال ہوتا ہے، مثال کے طور پر آپ کو سائن ان کرنے یا اشتہارات کو ذاتی نوعیت کا بنانے کے لیے۔ سبھی سائٹس کی خاطر کوکیز کا نظم کرنے کے لیے، <ph name="BEGIN_LINK" />ترتیبات<ph name="END_LINK" /> دیکھیں۔</translation> <translation id="1688867105868176567">سائٹ کا ڈیٹا صاف کریں؟</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" /> اور <ph name="NUM_MORE" /> مزید کی اجازت دی گئی}other{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" /> اور <ph name="NUM_MORE" /> مزید کی اجازت دی گئی}}</translation> <translation id="2434158240863470628">ڈاؤن لوڈ مکمل ہو گیا <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">مقام تک رسائی</translation> <translation id="2482878487686419369">اطلاعات</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> کے زیر انتظام</translation> <translation id="2498359688066513246">مدد اور تاثرات</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">بلوٹوتھ</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" /> اور <ph name="NUM_MORE" /> مزید}other{<ph name="PERMISSION_1" />، <ph name="PERMISSION_2" /> اور <ph name="NUM_MORE" /> مزید}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android ترتیبات<ph name="END_LINK" /> میں <ph name="APP_NAME" /> کے لیے اجازتیں آن کریں۔</translation> -<translation id="945632385593298557">اپنے مائیکروفون تک رسائی حاصل کریں</translation> <translation id="965817943346481315">اگر سائٹ دخل انداز یا گمراہ کن اشتہارات دکھاتی ہے تو مسدود کریں (تجویز کردہ)</translation> <translation id="967624055006145463">اسٹور کردہ ڈیٹا</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 3fd8704f..98729b4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">MIDI qurilmalarini boshqarishga to‘liq ruxsat berish</translation> <translation id="1509960214886564027">Aksariyat saytlardagi funksiyalar ishalamay qolishi mumkin</translation> <translation id="1620510694547887537">Kamera</translation> -<translation id="1647391597548383849">Kameraga ruxsat</translation> <translation id="1660204651932907780">Saytlarga ovoz ijro etish uchun ruxsat berish (tavsiya etiladi)</translation> <translation id="1677097821151855053">Saytga kirish uchun yoki reklamani moslashtirish uchun ishlatiladigan cookie fayllari va boshqa sayt maʼlumotlari. Barcha saytlar uchun cookie fayllarni boshqarish uchun <ph name="BEGIN_LINK" />Cookie sozlamalari<ph name="END_LINK" /> sahifasini oching.</translation> <translation id="1688867105868176567">Sayt ma’lumotlari tozalansinmi?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Ruxsat berildi: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> va yana <ph name="NUM_MORE" /> ta}other{Ruxsat berildi: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> va yana <ph name="NUM_MORE" /> ta}}</translation> <translation id="2434158240863470628">Yuklab olindi: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Joylashuv ma’lumotidan foyd-sh</translation> <translation id="2482878487686419369">Bildirishnomalar</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> tomonidan boshqariladi</translation> <translation id="2498359688066513246">Yordam va fikr-mulohaza</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> va yana <ph name="NUM_MORE" /> ta}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> va yana <ph name="NUM_MORE" /> ta}}</translation> <translation id="913657688200966289"><ph name="BEGIN_LINK" />Android sozlamalari<ph name="END_LINK" /> orqali <ph name="APP_NAME" /> uchun ruxsatnomalarni yoqing.</translation> -<translation id="945632385593298557">Mikrofonga ruxsat</translation> <translation id="965817943346481315">Saytlarda chiquvchi yoqimsiz yoki befoyda reklamalar bloklansin (tavsiya etiladi)</translation> <translation id="967624055006145463">Ishlatilgan joy</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index b8074c0..4b35a77c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Cho phép kiểm soát hoàn toàn thiết bị MIDI</translation> <translation id="1509960214886564027">Các tính năng trên nhiều trang web có thể hoạt động không đúng cách</translation> <translation id="1620510694547887537">Máy ảnh</translation> -<translation id="1647391597548383849">Truy cập máy ảnh của bạn</translation> <translation id="1660204651932907780">Cho phép các trang web phát âm thanh (được đề xuất)</translation> <translation id="1677097821151855053">Cookie và dữ liệu trang web khác được dùng để ghi nhớ bạn, chẳng hạn như giúp bạn đăng nhập hoặc cá nhân hóa quảng cáo. Để quản lý cookie cho tất cả trang web, hãy xem phần <ph name="BEGIN_LINK" />Cài đặt<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Xóa dữ liệu trang web?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{Đã cho phép <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> và <ph name="NUM_MORE" /> quyền khác}other{Đã cho phép <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> và <ph name="NUM_MORE" /> quyền khác}}</translation> <translation id="2434158240863470628">Quá trình tải xuống hoàn tất <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Quyền truy cập thông tin vị trí</translation> <translation id="2482878487686419369">Thông báo</translation> <translation id="2490684707762498678">Do <ph name="APP_NAME" /> quản lý</translation> <translation id="2498359688066513246">Trợ giúp và phản hồi</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> và <ph name="NUM_MORE" /> quyền khác}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> và <ph name="NUM_MORE" /> quyền khác}}</translation> <translation id="913657688200966289">Bật quyền cho <ph name="APP_NAME" /> trong phần <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Truy cập micrô của bạn</translation> <translation id="965817943346481315">Chặn nếu trang web hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm (khuyên dùng)</translation> <translation id="967624055006145463">Dữ liệu đã lưu trữ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index 0fbb6cb8..39dc69f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">允许全面控制 MIDI 设备</translation> <translation id="1509960214886564027">很多网站上的功能可能会无法正常运作</translation> <translation id="1620510694547887537">摄像头</translation> -<translation id="1647391597548383849">使用您的摄像头</translation> <translation id="1660204651932907780">允许网站播放声音(推荐)</translation> <translation id="1677097821151855053">系统会使用 Cookie 和其他网站数据来记住您,以便实现某些功能或目的(例如帮您登录或向您展示个性化广告)。如需管理所有网站的 Cookie,请参阅<ph name="BEGIN_LINK" />设置<ph name="END_LINK" />。</translation> <translation id="1688867105868176567">要清除网站数据吗?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{已授予“<ph name="PERMISSION_1" />”权限、“<ph name="PERMISSION_2" />”权限和另外 <ph name="NUM_MORE" /> 项权限}other{已授予“<ph name="PERMISSION_1" />”权限、“<ph name="PERMISSION_2" />”权限和另外 <ph name="NUM_MORE" /> 项权限}}</translation> <translation id="2434158240863470628">下载完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">位置信息使用权</translation> <translation id="2482878487686419369">通知</translation> <translation id="2490684707762498678">由 <ph name="APP_NAME" /> 管理</translation> <translation id="2498359688066513246">帮助和反馈</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">蓝牙</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{“<ph name="PERMISSION_1" />”权限、“<ph name="PERMISSION_2" />”权限和另外 <ph name="NUM_MORE" /> 项权限}other{“<ph name="PERMISSION_1" />”权限、“<ph name="PERMISSION_2" />”权限和另外 <ph name="NUM_MORE" /> 项权限}}</translation> <translation id="913657688200966289">在 <ph name="BEGIN_LINK" />Android 设置<ph name="END_LINK" />中为 <ph name="APP_NAME" /> 开启这些权限。</translation> -<translation id="945632385593298557">使用您的麦克风</translation> <translation id="965817943346481315">屏蔽会展示侵扰性或误导性广告的网站(推荐)</translation> <translation id="967624055006145463">已存储的数据</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index 38b737e..8cc3f6d8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">允許全權控制 MIDI 裝置。</translation> <translation id="1509960214886564027">很多網站的功能可能會無法正常運作</translation> <translation id="1620510694547887537">相機</translation> -<translation id="1647391597548383849">存取您的相機</translation> <translation id="1660204651932907780">允許網站播放音效 (建議)</translation> <translation id="1677097821151855053">系統會使用 Cookie 和其他網站資料記住您的身分,例如登入帳戶或個人化廣告。如要管理所有網站的 Cookie,請參閱「<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />」。</translation> <translation id="1688867105868176567">要清除網站資料嗎?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{已允許「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}other{已允許「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}}</translation> <translation id="2434158240863470628">下載完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">位置資料存取權</translation> <translation id="2482878487686419369">通知</translation> <translation id="2490684707762498678">由 <ph name="APP_NAME" /> 管理</translation> <translation id="2498359688066513246">說明和意見反映</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">藍牙</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}other{「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}}</translation> <translation id="913657688200966289">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 <ph name="APP_NAME" /> 啟用這些權限。</translation> -<translation id="945632385593298557">存取您的麥克風</translation> <translation id="965817943346481315">封鎖顯示滋擾性或誤導廣告網站上的廣告 (建議)</translation> <translation id="967624055006145463">已儲存的資料</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index 22e4a8d..2ceb70c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">允許完整控制 MIDI 裝置</translation> <translation id="1509960214886564027">許多網站的功能可能無法正常運作</translation> <translation id="1620510694547887537">攝影機</translation> -<translation id="1647391597548383849">存取您的攝影機</translation> <translation id="1660204651932907780">允許網站播放音訊 (建議)</translation> <translation id="1677097821151855053">系統會使用 Cookie 和其他網站資料來記住你,以便將你登入帳戶或是提供個人化廣告等服務。如要管理所有網站的 Cookie,請查看<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />。</translation> <translation id="1688867105868176567">要清除網站資料嗎?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{已允許「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}other{已允許「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}}</translation> <translation id="2434158240863470628">下載完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">位置資訊存取權</translation> <translation id="2482878487686419369">通知</translation> <translation id="2490684707762498678">由 <ph name="APP_NAME" /> 管理</translation> <translation id="2498359688066513246">說明與意見回饋</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">藍牙</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}other{「<ph name="PERMISSION_1" />」、「<ph name="PERMISSION_2" />」和另外 <ph name="NUM_MORE" /> 項權限}}</translation> <translation id="913657688200966289">請在 <ph name="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中啟用「<ph name="APP_NAME" />」的權限。</translation> -<translation id="945632385593298557">存取您的麥克風</translation> <translation id="965817943346481315">封鎖干擾性或誤導性的網站廣告 (建議)</translation> <translation id="967624055006145463">已儲存的資料</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb index 0eaebdec..7b62008 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -21,7 +21,6 @@ <translation id="1446450296470737166">Vumela ulawulo olugcwele lwamadivayisi we-MIDI</translation> <translation id="1509960214886564027">Izici ezikumasayithi amaningi zingase zinqamuke</translation> <translation id="1620510694547887537">Ikhamela</translation> -<translation id="1647391597548383849">Finyelela kukhamela yakho</translation> <translation id="1660204651932907780">Vumela amasayithi ukuthi adlale umsindo (kunconyiwe)</translation> <translation id="1677097821151855053">Amakhukhi nenye idatha yesayithi kusetshenziselwa ukukukhumbula, ngokwesibonelo ukungenisa ngemvume noma ukwenza izikhangiso zibe ngezakho. Ukuze uphathe amakhukhi awo wonke amasayithi, bona okuthi<ph name="BEGIN_LINK" />Amasethingi<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Sula idatha yesayithi?</translation> @@ -55,7 +54,6 @@ <translation id="2402980924095424747"><ph name="MEGABYTES" /> MB</translation> <translation id="2404630663942400771">{PERMISSIONS_SUMMARY_ALLOWED,plural, =1{I-<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, nezinye ezingu-<ph name="NUM_MORE" /> zivunyelwe}one{I-<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, nezinye ezingu-<ph name="NUM_MORE" /> zivunyelwe}other{I-<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, nezinye ezingu-<ph name="NUM_MORE" /> zivunyelwe}}</translation> <translation id="2434158240863470628">Ukulanda kuqedile <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> -<translation id="2440823041667407902">Ukufinyelela kundawo</translation> <translation id="2482878487686419369">Izaziso</translation> <translation id="2490684707762498678">Ilawulwa ngu-<ph name="APP_NAME" /></translation> <translation id="2498359688066513246">Usizo nempendulo</translation> @@ -303,7 +301,6 @@ <translation id="9074739597929991885">I-Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, nokungu-<ph name="NUM_MORE" /> ngaphezulu}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, nokungu-<ph name="NUM_MORE" /> ngaphezulu}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, nokungu-<ph name="NUM_MORE" /> ngaphezulu}}</translation> <translation id="913657688200966289">Vula izimvume ze-<ph name="APP_NAME" /> <ph name="BEGIN_LINK" />Kumasethingi e-Android<ph name="END_LINK" />.</translation> -<translation id="945632385593298557">Finyelela imakrofoni yakho</translation> <translation id="965817943346481315">Vimba uma isayithi libonisa izikhangiso ezingathandeki noma ezidukisayo (kunconyiwe)</translation> <translation id="967624055006145463">Idatha ilondoloziwe</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn index 10fbbe2..acb93800 100644 --- a/components/browser_ui/styles/android/BUILD.gn +++ b/components/browser_ui/styles/android/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/android/rules.gni") +import("//device/vr/buildflags/buildflags.gni") android_library("java") { sources = @@ -138,5 +139,9 @@ "java/res/values/values.xml", ] + if (enable_arcore) { + sources += [ "java/res-arcore/drawable/ic_ar_core_install.xml" ] + } + deps = [ "//ui/android:ui_java_resources" ] }
diff --git a/components/browser_ui/styles/android/java/res-arcore/drawable/ic_ar_core_install.xml b/components/browser_ui/styles/android/java/res-arcore/drawable/ic_ar_core_install.xml new file mode 100644 index 0000000..86608d27 --- /dev/null +++ b/components/browser_ui/styles/android/java/res-arcore/drawable/ic_ar_core_install.xml
@@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2020 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. --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:pathData="M0 0h24v24H0V0z"/> + <path + android:fillColor="@color/default_icon_color_blue" + android:pathData="M11 15h2v2h-2zm0-8h2v6h-2zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/> +</vector>
diff --git a/components/components_strings.grd b/components/components_strings.grd index faad5e4..47a1217c 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -330,6 +330,9 @@ <if expr="is_ios"> <part file="management_ios_strings.grdp" /> </if> + <if expr="enable_vr"> + <part file="webxr_strings.grdp" /> + </if> <!-- Generic terms --> <message name="IDS_CANCEL" desc="Used for Cancel on buttons"> @@ -365,6 +368,12 @@ <message name="IDS_MENU" desc="The accessible name for the Menu. This is used as the aria-roledescription for context menus."> Menu </message> + <message name="IDS_INSTALL" desc="Text to be displayed when an action will trigger an installation (of a component, app from the Play Store, etc.)."> + Install + </message> + <message name="IDS_UPDATE" desc="Text to be displayed when an action will trigger an update of an existing item (e.g. a component, app from the Play Store, etc.)."> + Update + </message> <if expr="is_android"> <message name="IDS_SHOW_CONTENT" desc="Generic label to show content for a feature. [CHAR-LIMIT=20]" formatter_data="android_java"> Show
diff --git a/chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_INSTALL_BUTTON.png.sha1 b/components/components_strings_grd/IDS_INSTALL.png.sha1 similarity index 100% rename from chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_INSTALL_BUTTON.png.sha1 rename to components/components_strings_grd/IDS_INSTALL.png.sha1
diff --git a/chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_UPDATE_BUTTON.png.sha1 b/components/components_strings_grd/IDS_UPDATE.png.sha1 similarity index 100% rename from chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_UPDATE_BUTTON.png.sha1 rename to components/components_strings_grd/IDS_UPDATE.png.sha1
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn index 2ff08f53..3c27ddd 100644 --- a/components/exo/BUILD.gn +++ b/components/exo/BUILD.gn
@@ -129,6 +129,7 @@ "//chromeos/constants", "//chromeos/crosapi/cpp", "//chromeos/ui/base", + "//chromeos/ui/frame", "//ui/events/ozone/layout", ] sources += [ @@ -302,6 +303,7 @@ "//ash/keyboard/ui", "//ash/public/cpp", "//chromeos/constants", + "//chromeos/ui/frame", "//ui/base:test_support", "//ui/base/cursor/mojom:cursor_type", "//ui/base/dragdrop/mojom:mojom_shared",
diff --git a/components/exo/DEPS b/components/exo/DEPS index 46b7ed2d..9b0c1e4 100644 --- a/components/exo/DEPS +++ b/components/exo/DEPS
@@ -5,6 +5,7 @@ "+chromeos/constants/chromeos_features.h", "+chromeos/crosapi/cpp/crosapi_constants.h", "+chromeos/ui/base/window_state_type.h", + "+chromeos/ui/frame/caption_buttons", "+components/viz/common", "+components/viz/host", "+device/gamepad",
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc index 467443f..5bbc164 100644 --- a/components/exo/client_controlled_shell_surface.cc +++ b/components/exo/client_controlled_shell_surface.cc
@@ -11,7 +11,6 @@ #include "ash/frame/non_client_frame_view_ash.h" #include "ash/frame/wide_frame_view.h" #include "ash/public/cpp/ash_features.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" #include "ash/public/cpp/default_frame_header.h" #include "ash/public/cpp/immersive/immersive_fullscreen_controller.h" #include "ash/public/cpp/rounded_corner_decorator.h" @@ -39,6 +38,7 @@ #include "base/trace_event/trace_event.h" #include "base/trace_event/traced_value.h" #include "chromeos/ui/base/window_state_type.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" #include "components/exo/shell_surface_util.h" #include "components/exo/surface.h" #include "components/exo/wm_helper.h" @@ -214,7 +214,7 @@ return window_state->IsPinned() || window_state->IsTrustedPinned(); } -class CaptionButtonModel : public ash::CaptionButtonModel { +class CaptionButtonModel : public chromeos::CaptionButtonModel { public: CaptionButtonModel(uint32_t visible_button_mask, uint32_t enabled_button_mask) : visible_button_mask_(visible_button_mask),
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc index 1c0e2b7..aafbbd3 100644 --- a/components/exo/client_controlled_shell_surface_unittest.cc +++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -8,8 +8,6 @@ #include "ash/frame/header_view.h" #include "ash/frame/non_client_frame_view_ash.h" #include "ash/frame/wide_frame_view.h" -#include "ash/public/cpp/caption_buttons/caption_button_model.h" -#include "ash/public/cpp/caption_buttons/frame_caption_button_container_view.h" #include "ash/public/cpp/test/shell_test_api.h" #include "ash/public/cpp/window_pin_type.h" #include "ash/public/cpp/window_properties.h" @@ -33,6 +31,8 @@ #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "cc/paint/display_item_list.h" +#include "chromeos/ui/frame/caption_buttons/caption_button_model.h" +#include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" #include "components/exo/buffer.h" #include "components/exo/display.h" #include "components/exo/pointer.h" @@ -1503,7 +1503,7 @@ ash::NonClientFrameViewAsh* frame_view = static_cast<ash::NonClientFrameViewAsh*>( shell_surface->GetWidget()->non_client_view()->frame_view()); - ash::FrameCaptionButtonContainerView* container = + chromeos::FrameCaptionButtonContainerView* container = static_cast<ash::HeaderView*>(frame_view->GetHeaderView()) ->caption_button_container(); @@ -1511,7 +1511,7 @@ for (auto visible : kAllButtons) { uint32_t visible_buttons = 1 << visible; shell_surface->SetFrameButtons(visible_buttons, 0); - const ash::CaptionButtonModel* model = container->model(); + const chromeos::CaptionButtonModel* model = container->model(); for (auto not_visible : kAllButtons) { if (not_visible != visible) EXPECT_FALSE(model->IsVisible(not_visible)); @@ -1524,7 +1524,7 @@ for (auto enabled : kAllButtons) { uint32_t enabled_buttons = 1 << enabled; shell_surface->SetFrameButtons(kAllButtonMask, enabled_buttons); - const ash::CaptionButtonModel* model = container->model(); + const chromeos::CaptionButtonModel* model = container->model(); for (auto not_enabled : kAllButtons) { if (not_enabled != enabled) EXPECT_FALSE(model->IsEnabled(not_enabled));
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java index ca2bdf4..0f49277 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -41,7 +41,8 @@ FeatureConstants.HOMEPAGE_PROMO_CARD_FEATURE, FeatureConstants.FEED_HEADER_MENU_FEATURE, FeatureConstants.CHROME_REENGAGEMENT_NOTIFICATION_1_FEATURE, FeatureConstants.CHROME_REENGAGEMENT_NOTIFICATION_2_FEATURE, - FeatureConstants.CHROME_REENGAGEMENT_NOTIFICATION_3_FEATURE}) + FeatureConstants.CHROME_REENGAGEMENT_NOTIFICATION_3_FEATURE, + FeatureConstants.PWA_INSTALL_AVAILABLE_FEATURE}) @Retention(RetentionPolicy.SOURCE) public @interface FeatureConstants { String DOWNLOAD_PAGE_FEATURE = "IPH_DownloadPage"; @@ -203,4 +204,9 @@ * An IPH feature to show the third re-engagement notification. */ String CHROME_REENGAGEMENT_NOTIFICATION_3_FEATURE = "IPH_ChromeReengagementNotification3"; + + /** + * An IPH feature to inform users that installing a PWA is an option. + */ + String PWA_INSTALL_AVAILABLE_FEATURE = "IPH_PwaInstallAvailable"; }
diff --git a/components/feature_engagement/public/event_constants.cc b/components/feature_engagement/public/event_constants.cc index 01ef02b..85734fe7 100644 --- a/components/feature_engagement/public/event_constants.cc +++ b/components/feature_engagement/public/event_constants.cc
@@ -45,6 +45,10 @@ const char kDiscoverFeedLoaded[] = "discover_feed_loaded"; #endif // defined(OS_IOS) +#if defined(OS_ANDROID) +const char kPwaInstallMenuSelected[] = "pwa_install_menu_clicked"; +#endif // defined(OS_ANDROID) + } // namespace events } // namespace feature_engagement
diff --git a/components/feature_engagement/public/event_constants.h b/components/feature_engagement/public/event_constants.h index 433e25f..1031f611 100644 --- a/components/feature_engagement/public/event_constants.h +++ b/components/feature_engagement/public/event_constants.h
@@ -80,6 +80,12 @@ extern const char kDiscoverFeedLoaded[]; #endif // defined(OS_IOS) +// Android. +#if defined(OS_ANDROID) +// The user has explicitly used the Install menu item under the App Menu. +extern const char kPwaInstallMenuSelected[]; +#endif // defined(OS_ANDROID) + } // namespace events } // namespace feature_engagement
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index a9502da..fdb77939 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -121,6 +121,8 @@ "IPH_ChromeReengagementNotification2", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kIPHChromeReengagementNotification3Feature{ "IPH_ChromeReengagementNotification3", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kIPHPwaInstallAvailableFeature{ + "IPH_PwaInstallAvailable", base::FEATURE_ENABLED_BY_DEFAULT}; #endif // defined(OS_ANDROID) #if defined(OS_IOS)
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index 1af890aa..eb61bb6 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -79,6 +79,7 @@ extern const base::Feature kIPHChromeReengagementNotification1Feature; extern const base::Feature kIPHChromeReengagementNotification2Feature; extern const base::Feature kIPHChromeReengagementNotification3Feature; +extern const base::Feature kIPHPwaInstallAvailableFeature; #endif // defined(OS_ANDROID) #if defined(OS_IOS)
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc index afbf477b..cb2466d 100644 --- a/components/feature_engagement/public/feature_list.cc +++ b/components/feature_engagement/public/feature_list.cc
@@ -46,6 +46,7 @@ &kIPHKeyboardAccessoryPasswordFillingFeature, &kIPHKeyboardAccessoryPaymentFillingFeature, &kIPHPreviewsOmniboxUIFeature, + &kIPHPwaInstallAvailableFeature, &kIPHQuietNotificationPromptsFeature, &kIPHTabGroupsQuicklyComparePagesFeature, &kIPHTabGroupsTapToSeeAnotherTabFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h index 7709c71..223d4a2 100644 --- a/components/feature_engagement/public/feature_list.h +++ b/components/feature_engagement/public/feature_list.h
@@ -94,6 +94,8 @@ DEFINE_VARIATION_PARAM(kIPHKeyboardAccessoryPaymentFillingFeature, "IPH_KeyboardAccessoryPaymentFilling"); DEFINE_VARIATION_PARAM(kIPHPreviewsOmniboxUIFeature, "IPH_PreviewsOmniboxUI"); +DEFINE_VARIATION_PARAM(kIPHPwaInstallAvailableFeature, + "IPH_PwaInstallAvailableFeature"); DEFINE_VARIATION_PARAM(kIPHQuietNotificationPromptsFeature, "IPH_QuietNotificationPrompts"); DEFINE_VARIATION_PARAM(kIPHTabGroupsQuicklyComparePagesFeature, @@ -184,6 +186,7 @@ VARIATION_ENTRY(kIPHKeyboardAccessoryPasswordFillingFeature), VARIATION_ENTRY(kIPHKeyboardAccessoryPaymentFillingFeature), VARIATION_ENTRY(kIPHPreviewsOmniboxUIFeature), + VARIATION_ENTRY(kIPHPwaInstallAvailableFeature), VARIATION_ENTRY(kIPHQuietNotificationPromptsFeature), VARIATION_ENTRY(kIPHTabGroupsQuicklyComparePagesFeature), VARIATION_ENTRY(kIPHTabGroupsTapToSeeAnotherTabFeature),
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc index 69f4aa8..5e7595a12 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -20,8 +20,10 @@ #include "components/history/core/browser/in_memory_history_backend.h" #include "components/history/core/test/test_history_database.h" #include "components/sync/model/data_batch.h" +#include "components/sync/model/mock_model_type_change_processor.h" #include "components/sync/model/recording_model_type_change_processor.h" #include "components/sync/model/sync_metadata_store.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using base::Time; @@ -34,7 +36,12 @@ using syncer::KeyAndData; using syncer::MetadataBatch; using syncer::MetadataChangeList; +using syncer::MockModelTypeChangeProcessor; using syncer::RecordingModelTypeChangeProcessor; +using testing::_; +using testing::AllOf; +using testing::NiceMock; +using testing::Pointee; namespace history { @@ -55,6 +62,24 @@ const char kURL[] = "http://pie.com/"; const char kURL2[] = "http://cookie.com/"; +// Action SaveArgPointeeMove<k>(pointer) saves the value pointed to by the k-th +// (0-based) argument of the mock function by moving it to *pointer. +ACTION_TEMPLATE(SaveArgPointeeMove, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_1_VALUE_PARAMS(pointer)) { + *pointer = std::move(*testing::get<k>(args)); +} + +// Matches that TypedUrlSpecifics has expected URL. +MATCHER_P(HasURLInSpecifics, url, "") { + return arg.specifics.typed_url().url() == url; +} + +// Matches that TypedUrlSpecifics has expected title. +MATCHER_P(HasTitleInSpecifics, title, "") { + return arg.specifics.typed_url().title() == title; +} + Time SinceEpoch(int64_t microseconds_since_epoch) { return Time::FromDeltaSinceWindowsEpoch( TimeDelta::FromMicroseconds(microseconds_since_epoch)); @@ -277,11 +302,11 @@ ASSERT_TRUE(test_dir_.CreateUniqueTempDir()); fake_history_backend_->Init( false, TestHistoryDatabaseParamsForPath(test_dir_.GetPath())); - std::unique_ptr<TypedURLSyncBridge> bridge = std::make_unique< - TypedURLSyncBridge>( - fake_history_backend_.get(), fake_history_backend_->db(), - RecordingModelTypeChangeProcessor::CreateProcessorAndAssignRawPointer( - &processor_)); + mock_processor_.DelegateCallsByDefaultTo(&processor_); + std::unique_ptr<TypedURLSyncBridge> bridge = + std::make_unique<TypedURLSyncBridge>( + fake_history_backend_.get(), fake_history_backend_->db(), + mock_processor_.CreateForwardingProcessor()); typed_url_sync_bridge_ = bridge.get(); typed_url_sync_bridge_->Init(); typed_url_sync_bridge_->history_backend_observer_.RemoveAll(); @@ -509,16 +534,20 @@ return bridge()->sync_metadata_database_; } - RecordingModelTypeChangeProcessor& processor() { return *processor_; } + RecordingModelTypeChangeProcessor& processor() { return processor_; } protected: base::test::SingleThreadTaskEnvironment task_environment_; base::ScopedTempDir test_dir_; scoped_refptr<TestHistoryBackend> fake_history_backend_; TypedURLSyncBridge* typed_url_sync_bridge_; - // A non-owning pointer to the processor given to the bridge. Will be null - // before being given to the bridge, to make ownership easier. - RecordingModelTypeChangeProcessor* processor_ = nullptr; + // TODO(crbug.com/791939): should be removed after moving to + // |mock_processor_|. + RecordingModelTypeChangeProcessor processor_; + + // |mock_processor_| is preferred to use instead of |processor_|. The + // |processor_| will be removed in following patches. + NiceMock<MockModelTypeChangeProcessor> mock_processor_; }; // Add two typed urls locally and verify bridge can get them from GetAllData. @@ -574,19 +603,16 @@ sync_pb::TypedUrlSpecifics* typed_url = entity_specifics.mutable_typed_url(); WriteToTypedUrlSpecifics(row, visits, typed_url); - StartSyncing({*typed_url}); - EXPECT_TRUE(processor().put_multimap().empty()); + EXPECT_CALL(mock_processor_, Put(_, _, _)).Times(0); // Even Sync already know the url, bridge still need to tell sync about // storage keys. - EXPECT_EQ(1u, processor().update_multimap().size()); - - // Verify processor receive correct upate storage key. - const auto& it = processor().update_multimap().begin(); - EXPECT_EQ(it->first, IntToStroageKey(1)); - EXPECT_TRUE(it->second->specifics.has_typed_url()); - EXPECT_EQ(it->second->specifics.typed_url().url(), kURL); - EXPECT_EQ(it->second->specifics.typed_url().title(), kTitle); + const std::string expected_storage_key = IntToStroageKey(1); + EXPECT_CALL(mock_processor_, + UpdateStorageKey( + AllOf(HasURLInSpecifics(kURL), HasTitleInSpecifics(kTitle)), + expected_storage_key, _)); + StartSyncing({*typed_url}); // Check that the local cache was is still correct. VerifyAllLocalHistoryData({*typed_url}); @@ -1686,26 +1712,26 @@ row = MakeTypedUrlRow(kURL, kTitle, 1, kExpiredVisit, false, &visits); fake_history_backend_->SetVisitsForUrl(&row, visits); - StartSyncing(std::vector<TypedUrlSpecifics>()); - // Check change processor did not receive expired typed URL. - const auto& changes_multimap = processor().put_multimap(); - ASSERT_EQ(0U, changes_multimap.size()); + EXPECT_CALL(mock_processor_, Put(_, _, _)).Times(0); + StartSyncing(std::vector<TypedUrlSpecifics>()); // Add a non expired typed URL to local. row = MakeTypedUrlRow(kURL, kTitle, 2, 1, false, &visits); fake_history_backend_->SetVisitsForUrl(&row, visits); changed_urls.push_back(row); + // Check change processor did not receive expired typed URL. + EntityData entity_data; + EXPECT_CALL(mock_processor_, Put(GetStorageKey(kURL), _, _)) + .WillOnce(SaveArgPointeeMove<1>(&entity_data)); // Notify typed url sync service of the update. bridge()->OnURLsModified(fake_history_backend_.get(), changed_urls, /*is_from_expiration=*/false); - // Check change processor did not receive expired typed URL. - ASSERT_EQ(1U, changes_multimap.size()); - // Get typed url specifics. Verify only a non-expired visit received. - sync_pb::TypedUrlSpecifics url_specifics = GetLastUpdateForURL(kURL); + const sync_pb::TypedUrlSpecifics& url_specifics = + entity_data.specifics.typed_url(); EXPECT_TRUE(URLsEqual(row, url_specifics)); ASSERT_EQ(1, url_specifics.visits_size());
diff --git a/components/infobars/android/infobar_android.cc b/components/infobars/android/infobar_android.cc index 5391689..a01a2ab2 100644 --- a/components/infobars/android/infobar_android.cc +++ b/components/infobars/android/infobar_android.cc
@@ -27,15 +27,7 @@ InfoBarAndroid::~InfoBarAndroid() { if (!java_info_bar_.is_null()) { JNIEnv* env = base::android::AttachCurrentThread(); - Java_InfoBar_onNativeDestroyed(env, java_info_bar_); - } -} - -void InfoBarAndroid::ReassignJavaInfoBar(InfoBarAndroid* replacement) { - DCHECK(replacement); - if (!java_info_bar_.is_null()) { - replacement->SetJavaInfoBar(java_info_bar_); - java_info_bar_.Reset(); + Java_InfoBar_resetNativeInfoBar(env, java_info_bar_); } } @@ -79,6 +71,7 @@ if (!java_info_bar_.is_null()) { JNIEnv* env = base::android::AttachCurrentThread(); Java_InfoBar_closeInfoBar(env, java_info_bar_); + Java_InfoBar_resetNativeInfoBar(env, java_info_bar_); java_info_bar_.Reset(nullptr); } }
diff --git a/components/infobars/android/infobar_android.h b/components/infobars/android/infobar_android.h index 4758cb7..14276d7 100644 --- a/components/infobars/android/infobar_android.h +++ b/components/infobars/android/infobar_android.h
@@ -45,10 +45,6 @@ const base::android::JavaRef<jobject>& GetJavaInfoBar(); bool HasSetJavaInfoBar() const; - // Tells the Java-side counterpart of this InfoBar to point to the replacement - // InfoBar instead of this one. - void ReassignJavaInfoBar(InfoBarAndroid* replacement); - int GetInfoBarIdentifier(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj); virtual void OnLinkClicked(JNIEnv* env,
diff --git a/components/infobars/android/java/src/org/chromium/components/infobars/InfoBar.java b/components/infobars/android/java/src/org/chromium/components/infobars/InfoBar.java index ec0122b1..cd62e4b8 100644 --- a/components/infobars/android/java/src/org/chromium/components/infobars/InfoBar.java +++ b/components/infobars/android/java/src/org/chromium/components/infobars/InfoBar.java
@@ -92,11 +92,12 @@ */ @CalledByNative private final void setNativeInfoBar(long nativeInfoBarPtr) { + assert nativeInfoBarPtr != 0; mNativeInfoBarPtr = nativeInfoBarPtr; } @CalledByNative - protected void onNativeDestroyed() { + protected void resetNativeInfoBar() { mNativeInfoBarPtr = 0; }
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc index f5d03a9..aff58eb 100644 --- a/components/omnibox/browser/zero_suggest_provider.cc +++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -364,7 +364,8 @@ // When running the REMOTE_NO_URL variant, we want to store suggestion // responses if non-empty. - if (result_type_running_ == REMOTE_NO_URL && !json_data.empty()) { + if (base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching) && + result_type_running_ == REMOTE_NO_URL && !json_data.empty()) { client()->GetPrefs()->SetString(omnibox::kZeroSuggestCachedResults, json_data); @@ -612,8 +613,10 @@ } void ZeroSuggestProvider::MaybeUseCachedSuggestions() { - if (result_type_running_ != REMOTE_NO_URL) + if (!base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching) || + result_type_running_ != REMOTE_NO_URL) { return; + } std::string json_data = client()->GetPrefs()->GetString(omnibox::kZeroSuggestCachedResults);
diff --git a/components/omnibox/browser/zero_suggest_provider_unittest.cc b/components/omnibox/browser/zero_suggest_provider_unittest.cc index 69d1da829e..11bf7fe 100644 --- a/components/omnibox/browser/zero_suggest_provider_unittest.cc +++ b/components/omnibox/browser/zero_suggest_provider_unittest.cc
@@ -564,8 +564,10 @@ base::RunLoop().RunUntilIdle(); EXPECT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(json_response, - prefs->GetString(omnibox::kZeroSuggestCachedResults)); + if (base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching)) { + EXPECT_EQ(json_response, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } } TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestHasCachedResults) { @@ -584,11 +586,13 @@ ASSERT_EQ(ZeroSuggestProvider::REMOTE_NO_URL, provider_->GetResultTypeRunningForTesting()); - // Expect that matches get populated synchronously out of the cache. - ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[0].contents); - EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[1].contents); - EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[2].contents); + if (base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching)) { + // Expect that matches get populated synchronously out of the cache. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[0].contents); + EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[1].contents); + EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[2].contents); + } GURL suggest_url = GetSuggestURL( metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS); @@ -600,15 +604,23 @@ base::RunLoop().RunUntilIdle(); - // Expect the same results after the response has been handled. - ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[0].contents); - EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[1].contents); - EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[2].contents); + if (base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching)) { + // Expect the same results after the response has been handled. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[0].contents); + EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[1].contents); + EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[2].contents); - // Expect the new results have been stored. - EXPECT_EQ(json_response2, - prefs->GetString(omnibox::kZeroSuggestCachedResults)); + // Expect the new results have been stored. + EXPECT_EQ(json_response2, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } else { + // Expect fresh results after the response has been handled. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(base::ASCIIToUTF16("search4"), provider_->matches()[0].contents); + EXPECT_EQ(base::ASCIIToUTF16("search5"), provider_->matches()[1].contents); + EXPECT_EQ(base::ASCIIToUTF16("search6"), provider_->matches()[2].contents); + } } TEST_F(ZeroSuggestProviderTest, TestPsuggestZeroSuggestReceivedEmptyResults) { @@ -627,11 +639,15 @@ ASSERT_EQ(ZeroSuggestProvider::REMOTE_NO_URL, provider_->GetResultTypeRunningForTesting()); - // Expect that matches get populated synchronously out of the cache. - ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match - EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[0].contents); - EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[1].contents); - EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[2].contents); + if (base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching)) { + // Expect that matches get populated synchronously out of the cache. + ASSERT_EQ(3U, provider_->matches().size()); // 3 results, no verbatim match + EXPECT_EQ(base::ASCIIToUTF16("search1"), provider_->matches()[0].contents); + EXPECT_EQ(base::ASCIIToUTF16("search2"), provider_->matches()[1].contents); + EXPECT_EQ(base::ASCIIToUTF16("search3"), provider_->matches()[2].contents); + } else { + ASSERT_TRUE(provider_->matches().empty()); + } GURL suggest_url = GetSuggestURL( metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS); @@ -644,7 +660,9 @@ // Expect that the matches have been cleared. ASSERT_TRUE(provider_->matches().empty()); - // Expect the new results have been stored. - EXPECT_EQ(empty_response, - prefs->GetString(omnibox::kZeroSuggestCachedResults)); + if (base::FeatureList::IsEnabled(omnibox::kOmniboxZeroSuggestCaching)) { + // Expect the new results have been stored. + EXPECT_EQ(empty_response, + prefs->GetString(omnibox::kZeroSuggestCachedResults)); + } }
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index df6dcd9..4e9a0f0 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -223,6 +223,11 @@ "OmniboxTrendingZeroPrefixSuggestionsOnNTP", base::FEATURE_DISABLED_BY_DEFAULT}; +// Used to enable/disable caching for remote zero-prefix suggestions. Caching is +// enabled by default. We will be experimenting with DISABLING this behavior. +const base::Feature kOmniboxZeroSuggestCaching{ + "OmniboxZeroSuggestCaching", base::FEATURE_ENABLED_BY_DEFAULT}; + // Enables on-focus suggestions on the Open Web, that are contextual to the // current URL. Will only work if user is signed-in and syncing, or is // otherwise eligible to send the current page URL to the suggest server.
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 81e63ef..87f7360 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -61,6 +61,7 @@ extern const base::Feature kOmniboxLocalZeroSuggestForAuthenticatedUsers; extern const base::Feature kOmniboxLocalZeroSuggestFrecencyRanking; extern const base::Feature kOmniboxTrendingZeroPrefixSuggestionsOnNTP; +extern const base::Feature kOmniboxZeroSuggestCaching; extern const base::Feature kOnFocusSuggestionsContextualWeb; extern const base::Feature kOnFocusSuggestionsContextualWebOnContent; extern const base::Feature kReactiveZeroSuggestionsOnNTPOmnibox;
diff --git a/components/policy/core/common/cloud/cloud_policy_client.cc b/components/policy/core/common/cloud/cloud_policy_client.cc index 009f97f..c71de1f0 100644 --- a/components/policy/core/common/cloud/cloud_policy_client.cc +++ b/components/policy/core/common/cloud/cloud_policy_client.cc
@@ -607,7 +607,8 @@ CHECK(is_registered()); CancelAppInstallReportUpload(); app_install_report_request_job_ = CreateNewRealtimeReportingJob( - std::move(report), service()->configuration()->GetReportingServerUrl(), + std::move(report), + service()->configuration()->GetRealtimeReportingServerUrl(), /* add_connector_url_params=*/false, std::move(callback)); DCHECK(app_install_report_request_job_); } @@ -627,7 +628,8 @@ CHECK(is_registered()); CancelExtensionInstallReportUpload(); extension_install_report_request_job_ = CreateNewRealtimeReportingJob( - std::move(report), service()->configuration()->GetReportingServerUrl(), + std::move(report), + service()->configuration()->GetRealtimeReportingServerUrl(), /* add_connector_url_params=*/false, std::move(callback)); DCHECK(extension_install_report_request_job_); }
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc index 99a2fbc..d754371 100644 --- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -1557,7 +1557,7 @@ TEST_F(CloudPolicyClientTest, RealtimeReportMerge) { auto config = std::make_unique<RealtimeReportingJobConfiguration>( client_.get(), DMAuth::FromDMToken(kDMToken), - service_.configuration()->GetReportingServerUrl(), false, + service_.configuration()->GetRealtimeReportingServerUrl(), false, RealtimeReportingJobConfiguration::Callback()); // Add one report to the config.
diff --git a/components/policy/core/common/cloud/device_management_service.h b/components/policy/core/common/cloud/device_management_service.h index be9ced1..08d5cae 100644 --- a/components/policy/core/common/cloud/device_management_service.h +++ b/components/policy/core/common/cloud/device_management_service.h
@@ -110,7 +110,10 @@ virtual std::string GetPlatformParameter() = 0; // Server at which to contact the real time reporting service. - virtual std::string GetReportingServerUrl() = 0; + virtual std::string GetRealtimeReportingServerUrl() = 0; + + // Server endpoint for encrypted events. + virtual std::string GetEncryptedReportingServerUrl() = 0; // Server at which to contact the real time reporting service for // enterprise connectors.
diff --git a/components/policy/core/common/cloud/mock_device_management_service.cc b/components/policy/core/common/cloud/mock_device_management_service.cc index d96331e..fb4401e 100644 --- a/components/policy/core/common/cloud/mock_device_management_service.cc +++ b/components/policy/core/common/cloud/mock_device_management_service.cc
@@ -97,7 +97,13 @@ return kPlatform; } -std::string MockDeviceManagementServiceConfiguration::GetReportingServerUrl() { +std::string +MockDeviceManagementServiceConfiguration::GetRealtimeReportingServerUrl() { + return server_url_; +} + +std::string +MockDeviceManagementServiceConfiguration::GetEncryptedReportingServerUrl() { return server_url_; }
diff --git a/components/policy/core/common/cloud/mock_device_management_service.h b/components/policy/core/common/cloud/mock_device_management_service.h index 0b4d9898..bbf9670 100644 --- a/components/policy/core/common/cloud/mock_device_management_service.h +++ b/components/policy/core/common/cloud/mock_device_management_service.h
@@ -31,7 +31,8 @@ std::string GetDMServerUrl() override; std::string GetAgentParameter() override; std::string GetPlatformParameter() override; - std::string GetReportingServerUrl() override; + std::string GetRealtimeReportingServerUrl() override; + std::string GetEncryptedReportingServerUrl() override; std::string GetReportingConnectorServerUrl() override; private:
diff --git a/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc b/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc index 79548bb..9387fb0b 100644 --- a/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc +++ b/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
@@ -69,12 +69,13 @@ #if defined(OS_CHROMEOS) fake_serial_number_(&fake_statistics_provider_), #endif - configuration_(&client_, - DMAuth::FromDMToken(kDummyToken), - service_.configuration()->GetReportingServerUrl(), - false, - base::BindOnce(&MockCallbackObserver::OnURLLoadComplete, - base::Unretained(&callback_observer_))) { + configuration_( + &client_, + DMAuth::FromDMToken(kDummyToken), + service_.configuration()->GetRealtimeReportingServerUrl(), + false, + base::BindOnce(&MockCallbackObserver::OnURLLoadComplete, + base::Unretained(&callback_observer_))) { } void SetUp() override {
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index d5f58dd..7b2487c 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1253,8 +1253,8 @@ Se esta política não for definida, a filtragem será omitida, e todos os servidores de impressão serão considerados.</translation> <translation id="2877225735001246144">Desativar consulta CNAME ao negociar a autenticação do Kerberos</translation> -<translation id="2886215882246310669">Controla se o <ph name="PRODUCT_OS_NAME" /> permite que novas contas de usuário do Family Link sejam adicionadas ao dispositivo. - Esta política só será usada junto com <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />. Ela permite mais contas do Family Link, além daquelas definidas na lista de permissões. +<translation id="2886215882246310669">Controla se o <ph name="PRODUCT_OS_NAME" /> permite que novas contas de usuários do Family Link sejam adicionadas ao dispositivo. + Esta política só será usada junto com <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />. Ela permite mais contas do Family Link, além das contas definidas na lista de permissões. Esta política não afeta o comportamento de outras políticas de login. Ela não terá nenhum efeito quando: - a adição de novos usuários ao dispositivo estiver desativada com a política <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" />; - a adição de todos os usuários for permitida com a política <ph name="DEVICE_USER_ALLOWLIST_POLICY_NAME" />. @@ -1289,7 +1289,7 @@ <translation id="2919544577647246857">Define a lista de usuários que têm permissão para fazer login no dispositivo. As entradas são feitas no formato <ph name="USER_ALLOWLIST_ENTRY_FORMAT" />, como <ph name="USER_WHITELIST_ENTRY_EXAMPLE" />. Para permitir usuários arbitrários em um domínio, use entradas no formato <ph name="USER_ALLOWLIST_ENTRY_WILDCARD" />. Se esta política não for configurada, não haverá restrições quanto aos usuários autorizados a fazer login. Ainda assim, a criação de novos usuários exigirá que a política <ph name="DEVICE_ALLOW_NEW_USERS_POLICY_NAME" /> seja configurada de forma adequada. - Se <ph name="DEVICE_FAMILY_LINK_ACCOUNTS_ALLOWED_POLICY_NAME" /> estiver ativada, outros usuários do Family Link também poderão ser adicionados, além das contas já definidas nesta política.</translation> + Se <ph name="DEVICE_FAMILY_LINK_ACCOUNTS_ALLOWED_POLICY_NAME" /> estiver ativada, contas de usuários do Family Link também poderão ser adicionadas ao dispositivo, além das contas já definidas nesta política.</translation> <translation id="2921222258441684334">Se a política for definida como 1, os sites poderão rastrear a localização física dos usuários como o estado padrão. Se a política for definida como 2, será negado o rastreamento como padrão. É possível definir a política para perguntar sempre que um site quiser rastrear a localização física dos usuários. Se a política não for definida, a <ph name="ASK_GEOLOCATION_POLICY_NAME" /> será aplicada, mas os usuários poderão mudar essa configuração.</translation> @@ -4690,7 +4690,7 @@ Se esta política não for definida, os atalhos de recursos de acessibilidade serão ativados por padrão na tela de login.</translation> <translation id="7777535871204167559">Tratar dispositivos de armazenamento externo como somente leitura</translation> <translation id="7788511847830146438">Por perfil</translation> -<translation id="780629758750905699">Permitir outras contas do Family Link no dispositivo</translation> +<translation id="780629758750905699">Permitir adicionar contas do Family Link no dispositivo</translation> <translation id="7807139251387225825">Lista de tipos a serem excluídos da sincronização</translation> <translation id="7818131573217430250">Definir o estado padrão do modo de alto contraste na tela de login</translation> <translation id="7823902813460802031">Se a política for definida como "Ativada", o <ph name="PRODUCT_OS_NAME" /> impedirá que o dispositivo entre no modo de desenvolvedor.
diff --git a/components/prerender/browser/prerender_util.h b/components/prerender/browser/prerender_util.h index 038940b..126324f17 100644 --- a/components/prerender/browser/prerender_util.h +++ b/components/prerender/browser/prerender_util.h
@@ -20,12 +20,6 @@ // Indicates whether the URL provided is a GWS origin. bool IsGoogleOriginURL(const GURL& origin_url); -// Report a URL was canceled due to trying to handle an external URL. -void ReportPrerenderExternalURL(); - -// Report a URL was canceled due to unsupported prerender scheme. -void ReportUnsupportedPrerenderScheme(const GURL& url); - // Records the metrics for the nostate prefetch to an event with UKM source ID // |source_id|. void RecordNoStatePrefetchMetrics(
diff --git a/components/resources/BUILD.gn b/components/resources/BUILD.gn index f424b172..af42533 100644 --- a/components/resources/BUILD.gn +++ b/components/resources/BUILD.gn
@@ -113,6 +113,9 @@ "android/permissions_resource_id.h", "android/sms_resource_id.h", "android/theme_resources.h", + "android/webxr_resource_id.h", ] + + public_deps = [ "//device/vr/buildflags" ] } }
diff --git a/components/resources/android/DEPS b/components/resources/android/DEPS new file mode 100644 index 0000000..91a8218 --- /dev/null +++ b/components/resources/android/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+device/vr/buildflags/buildflags.h", +]
diff --git a/components/resources/android/theme_resources.h b/components/resources/android/theme_resources.h index 58d8e2a..90a4797 100644 --- a/components/resources/android/theme_resources.h +++ b/components/resources/android/theme_resources.h
@@ -18,6 +18,7 @@ #include "components/resources/android/page_info_resource_id.h" #include "components/resources/android/permissions_resource_id.h" #include "components/resources/android/sms_resource_id.h" +#include "components/resources/android/webxr_resource_id.h" ANDROID_COMPONENTS_RESOURCE_ID_MAX, };
diff --git a/components/resources/android/webxr_resource_id.h b/components/resources/android/webxr_resource_id.h new file mode 100644 index 0000000..063c40fb --- /dev/null +++ b/components/resources/android/webxr_resource_id.h
@@ -0,0 +1,30 @@ +// Copyright 2020 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. + +// This file maps permissions resource IDs to Android resource IDs. + +// Presence of regular include guards is checked by: +// 1. cpplint +// 2. a custom presubmit in src/PRESUBMIT.py +// 3. clang (but it only checks the guard is correct if present) +// Disable the first two with these magic comments: +// NOLINT(build/header_guard) +// no-include-guard-because-multiply-included + +#include "device/vr/buildflags/buildflags.h" + +// LINK_RESOURCE_ID is used for IDs that come from a .grd file. +#ifndef LINK_RESOURCE_ID +#error "LINK_RESOURCE_ID should be defined before including this file" +#endif +// DECLARE_RESOURCE_ID is used for IDs that don't have .grd entries, and +// are only declared in this file. +#ifndef DECLARE_RESOURCE_ID +#error "DECLARE_RESOURCE_ID should be defined before including this file" +#endif + +#if BUILDFLAG(ENABLE_ARCORE) +DECLARE_RESOURCE_ID(IDR_ANDROID_AR_CORE_INSALL_ICON, + R.drawable.ic_ar_core_install) +#endif // ENABLE_ARCORE
diff --git a/components/security_interstitials/content/BUILD.gn b/components/security_interstitials/content/BUILD.gn index 5a9ab5e..f722af2 100644 --- a/components/security_interstitials/content/BUILD.gn +++ b/components/security_interstitials/content/BUILD.gn
@@ -27,6 +27,8 @@ "insecure_form_blocking_page.h", "insecure_form_navigation_throttle.cc", "insecure_form_navigation_throttle.h", + "insecure_form_tab_storage.cc", + "insecure_form_tab_storage.h", "known_interception_disclosure_ui.cc", "known_interception_disclosure_ui.h", "legacy_tls_blocking_page.cc",
diff --git a/components/security_interstitials/content/insecure_form_navigation_throttle.cc b/components/security_interstitials/content/insecure_form_navigation_throttle.cc index 9da53694..36699f9 100644 --- a/components/security_interstitials/content/insecure_form_navigation_throttle.cc +++ b/components/security_interstitials/content/insecure_form_navigation_throttle.cc
@@ -7,6 +7,7 @@ #include "base/feature_list.h" #include "components/prefs/pref_service.h" #include "components/security_interstitials/content/insecure_form_blocking_page.h" +#include "components/security_interstitials/content/insecure_form_tab_storage.h" #include "components/security_interstitials/content/security_interstitial_tab_helper.h" #include "components/security_interstitials/core/features.h" #include "components/security_interstitials/core/pref_names.h" @@ -51,6 +52,13 @@ return content::NavigationThrottle::PROCEED; } + // If user has just chosen to proceed on an interstitial, we don't show + // another one. + InsecureFormTabStorage* tab_storage = + InsecureFormTabStorage::GetOrCreate(contents); + if (tab_storage->IsProceeding()) + return content::NavigationThrottle::PROCEED; + std::unique_ptr<InsecureFormBlockingPage> blocking_page = blocking_page_factory_->CreateInsecureFormBlockingPage(contents, handle->GetURL()); @@ -66,6 +74,17 @@ return WillStartRequest(); } +content::NavigationThrottle::ThrottleCheckResult +InsecureFormNavigationThrottle::WillProcessResponse() { + // If there is an InsecureFormTabStorage associated to |web_contents_|, clear + // the IsProceeding flag. + InsecureFormTabStorage* tab_storage = InsecureFormTabStorage::FromWebContents( + navigation_handle()->GetWebContents()); + if (tab_storage) + tab_storage->SetIsProceeding(false); + return content::NavigationThrottle::PROCEED; +} + const char* InsecureFormNavigationThrottle::GetNameForLogging() { return "InsecureFormNavigationThrottle"; }
diff --git a/components/security_interstitials/content/insecure_form_navigation_throttle.h b/components/security_interstitials/content/insecure_form_navigation_throttle.h index fac9d37..5cc296a 100644 --- a/components/security_interstitials/content/insecure_form_navigation_throttle.h +++ b/components/security_interstitials/content/insecure_form_navigation_throttle.h
@@ -26,6 +26,7 @@ // content::NavigationThrottle: ThrottleCheckResult WillStartRequest() override; ThrottleCheckResult WillRedirectRequest() override; + ThrottleCheckResult WillProcessResponse() override; const char* GetNameForLogging() override; static std::unique_ptr<InsecureFormNavigationThrottle>
diff --git a/components/security_interstitials/content/insecure_form_tab_storage.cc b/components/security_interstitials/content/insecure_form_tab_storage.cc new file mode 100644 index 0000000..1219d6240 --- /dev/null +++ b/components/security_interstitials/content/insecure_form_tab_storage.cc
@@ -0,0 +1,30 @@ +// Copyright 2020 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. + +#include "components/security_interstitials/content/insecure_form_tab_storage.h" + +#include "base/memory/ptr_util.h" +#include "content/public/browser/web_contents.h" + +namespace security_interstitials { + +// Arbitrary but unique key required for SupportsUserData. +const void* const kInsecureFormTabStorageKey = &kInsecureFormTabStorageKey; + +InsecureFormTabStorage::~InsecureFormTabStorage() = default; + +// static +InsecureFormTabStorage* InsecureFormTabStorage::GetOrCreate( + content::WebContents* web_contents) { + InsecureFormTabStorage* storage = FromWebContents(web_contents); + if (!storage) { + CreateForWebContents(web_contents); + storage = FromWebContents(web_contents); + } + return storage; +} + +WEB_CONTENTS_USER_DATA_KEY_IMPL(InsecureFormTabStorage) + +} // namespace security_interstitials \ No newline at end of file
diff --git a/components/security_interstitials/content/insecure_form_tab_storage.h b/components/security_interstitials/content/insecure_form_tab_storage.h new file mode 100644 index 0000000..fda0549c --- /dev/null +++ b/components/security_interstitials/content/insecure_form_tab_storage.h
@@ -0,0 +1,47 @@ +// Copyright 2020 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 COMPONENTS_SECURITY_INTERSTITIALS_CONTENT_INSECURE_FORM_TAB_STORAGE_H_ +#define COMPONENTS_SECURITY_INTERSTITIALS_CONTENT_INSECURE_FORM_TAB_STORAGE_H_ + +#include "base/macros.h" +#include "content/public/browser/web_contents_user_data.h" + +namespace content { +class WebContents; +} // namespace content + +namespace security_interstitials { + +// A short-lived, per tab storage for mixed form interstitials, that stores a +// flag while proceeding, so a new interstitial is not shown immediately. +class InsecureFormTabStorage + : public content::WebContentsUserData<InsecureFormTabStorage> { + public: + ~InsecureFormTabStorage() override; + + // Disallow copy and assign. + InsecureFormTabStorage(const InsecureFormTabStorage&) = delete; + InsecureFormTabStorage& operator=(const InsecureFormTabStorage&) = delete; + + // Returns the InsecureFormTabStorage associated to |web_contents|, or creates + // one if there is none. + static InsecureFormTabStorage* GetOrCreate( + content::WebContents* web_contents); + + void SetIsProceeding(bool is_proceeding) { is_proceeding_ = is_proceeding; } + bool IsProceeding() const { return is_proceeding_; } + + private: + explicit InsecureFormTabStorage(content::WebContents* contents) {} + friend class content::WebContentsUserData<InsecureFormTabStorage>; + WEB_CONTENTS_USER_DATA_KEY_DECL(); + + // Flag stores whether we are in the middle of a proceed action. + bool is_proceeding_ = false; +}; + +} // namespace security_interstitials + +#endif // COMPONENTS_SECURITY_INTERSTITIALS_CONTENT_INSECURE_FORM_TAB_STORAGE_H_ \ No newline at end of file
diff --git a/components/strings/BUILD.gn b/components/strings/BUILD.gn index ead8a5b..253da98 100644 --- a/components/strings/BUILD.gn +++ b/components/strings/BUILD.gn
@@ -4,6 +4,7 @@ import("//build/config/locales.gni") import("//components/feed/features.gni") +import("//device/vr/buildflags/buildflags.gni") import("//ppapi/buildflags/buildflags.gni") import("//printing/buildflags/buildflags.gni") import("//tools/grit/grit_rule.gni") @@ -29,9 +30,11 @@ grit("components_strings") { source = "../components_strings.grd" defines = [ + "enable_arcore=$enable_arcore", "enable_plugins=$enable_plugins", "enable_print_preview=$enable_print_preview", "enable_feed_v1=$enable_feed_v1", + "enable_vr=$enable_vr", ] outputs = [ "grit/components_strings.h" ]
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 2cf7350..a38c579 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -170,7 +170,7 @@ <p>Juster datoen og tiden i sektionen <strong>Generelt</strong> i appen <strong>Indstillinger</strong>.</p></translation> <translation id="1569487616857761740">Angiv udløbsdato</translation> <translation id="1581080074034554886">CVC</translation> -<translation id="1583429793053364125">Der opstod en fejl ved visningen af denne webside.</translation> +<translation id="1583429793053364125">Noget gik galt ved visningen af denne webside.</translation> <translation id="1586541204584340881">Hvilke udvidelser, du har installeret</translation> <translation id="1588438908519853928">Normal</translation> <translation id="1592005682883173041">Lokal dataadgang</translation> @@ -1756,7 +1756,7 @@ <translation id="8041940743680923270">Brug global standard (spørg)</translation> <translation id="8042918947222776840">Vælg afhentningsmetode</translation> <translation id="8057711352706143257">"<ph name="SOFTWARE_NAME" />" er ikke konfigureret korrekt. Problemet kan normalt løses ved at afinstallere "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation> -<translation id="8066955247577885446">Der opstod en fejl.</translation> +<translation id="8066955247577885446">Noget gik galt.</translation> <translation id="8067872629359326442">Du har lige angivet din adgangskode på et vildledende website. Chromium kan hjælpe. Klik på Beskyt konto for at ændre din adgangskode og underrette Google om, at din konto muligvis er kompromitteret.</translation> <translation id="8074253406171541171">10x13 (Envelope)</translation> <translation id="8078141288243656252">Der kan ikke annoteres ved rotering</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index f5500f7..c2374dd6 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -1548,7 +1548,7 @@ <translation id="7337706099755338005">Nicht auf Ihrer Plattform verfügbar.</translation> <translation id="733923710415886693">Das Serverzertifikat wurde nicht über die Zertifikatstransparenz offengelegt.</translation> <translation id="734600844861828519">11x15</translation> -<translation id="7346048084945669753">Ist verbunden:</translation> +<translation id="7346048084945669753">Ist zugehörig:</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7353601530677266744">Befehlszeile</translation> <translation id="7359588939039777303">Werbung blockiert.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 96a13b8..917c87f3 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1158,7 +1158,7 @@ <translation id="560412284261940334">ניהול אינו נתמך</translation> <translation id="5605670050355397069">Ledger</translation> <translation id="5607240918979444548">Architecture-C</translation> -<translation id="5608165884683734521">האתר הזה עשוי להיות מזויף או לשמש להונאה ההמלצה של Chrome היא לצאת ממנו עכשיו.</translation> +<translation id="5608165884683734521">האתר הזה עשוי להיות מזויף או לשמש להונאה. ההמלצה של Chrome היא לצאת ממנו עכשיו.</translation> <translation id="5610142619324316209">לבדוק את החיבור</translation> <translation id="5610807607761827392">ב<ph name="BEGIN_LINK" />הגדרות<ph name="END_LINK" /> תוכל לנהל את האפשרויות של כרטיסים וכתובות.</translation> <translation id="561165882404867731">ניתן לתרגם את הדף הזה באמצעות Google Translate</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 4220ec02..59f2872 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -22,6 +22,7 @@ <translation id="1058479211578257048">കാർഡുകൾ സംരക്ഷിക്കുന്നു...</translation> <translation id="10614374240317010">ഒരിക്കലും സംരക്ഷിച്ചില്ല</translation> <translation id="1062160989074299343">Prc10 (എൻവലപ്പ്)</translation> +<translation id="1066573427009091463"><ph name="PERCENT" /> ക്യാഷ് ബാക്ക്</translation> <translation id="106701514854093668">ഡെസ്ക്ടോപ്പ് ബുക്ക്മാർക്കുകൾ</translation> <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" /> ഭാഷയിലുള്ള പേജുകൾ ഒരിക്കലും വിവർത്തനം ചെയ്യരുത്</translation> <translation id="1070901266639972381">രാത്രി</translation> @@ -494,6 +495,7 @@ <translation id="2955913368246107853">ഫൈന്ഡ് ബാര് അടയ്ക്കുക</translation> <translation id="2969319727213777354">സുരക്ഷിത കണക്ഷൻ സ്ഥാപിക്കുന്നതിന്, നിങ്ങളുടെ ക്ലോക്ക് ശരിയായി സജ്ജീകരിക്കേണ്ടതുണ്ട്. വെബ്സൈറ്റുകൾ സ്വയം തിരിച്ചറിയുന്നതിന് ഉപയോഗിക്കുന്ന സർട്ടിഫിക്കറ്റുകൾ, നിർദ്ദിഷ്ട സമയ പരിധിയിൽ മാത്രം സാധുതയുള്ളതിനാലാണിത്. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ക്ലോക്ക് തെറ്റായിരിക്കുന്നതിനാൽ, Google Chrome-ന് ഈ സർട്ടിഫിക്കറ്റുകൾ പരിശോധിച്ചുറപ്പിക്കാനാവില്ല.</translation> <translation id="2972581237482394796">&വീണ്ടും ചെയ്യുക</translation> +<translation id="2975775789586780239"><ph name="DISCOUNT" /> കിഴിവ്</translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, നിലവിൽ തിരഞ്ഞെടുത്തു. <ph name="ROW_CONTENT" /></translation> <translation id="2985306909656435243">പ്രവർത്തനക്ഷമമാക്കിയെങ്കിൽ, വേഗത്തിൽ ഫോം പൂരിപ്പിക്കാൻ Chromium ഈ ഉപകരണത്തിൽ നിങ്ങളുടെ കാർഡിന്റെ ഒരു പകർപ്പ് സൂക്ഷിക്കും.</translation> <translation id="2985398929374701810">ശരിയായ വിലാസം നല്കുക</translation> @@ -1885,6 +1887,7 @@ <translation id="8685155993131031756">Prc-16K</translation> <translation id="8688672835843460752">ലഭ്യമാണ്</translation> <translation id="868922510921656628">ഓരോ സെറ്റിലെയും പേജുകൾ</translation> +<translation id="8697373104056314601">Chrome-ന്റെ ഏറ്റവും ഉയർന്ന സുരക്ഷ നേടാൻ, <ph name="BEGIN_ENHANCED_PROTECTION_LINK" />മെച്ചപ്പെടുത്തിയ പരിരക്ഷ ഓണാക്കുക<ph name="END_ENHANCED_PROTECTION_LINK" />.</translation> <translation id="869891660844655955">കാലഹരണപ്പെടല് തീയതി</translation> <translation id="8699041776323235191">HID ഉപകരണം</translation> <translation id="8703575177326907206"><ph name="DOMAIN" /> ലേക്കുള്ള നിങ്ങളുടെ കണക്ഷന് എന്ക്രിപ്റ്റ് ചെയ്തിട്ടില്ല.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 03862bb..724af89 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -22,6 +22,7 @@ <translation id="1058479211578257048">Ukladajú sa karty…</translation> <translation id="10614374240317010">Nikdy neukladať</translation> <translation id="1062160989074299343">Prc10 (obálka)</translation> +<translation id="1066573427009091463">Vrátime <ph name="PERCENT" /> z ceny nákupu</translation> <translation id="106701514854093668">Záložky v počítači</translation> <translation id="1068672505746868501">Nikdy neprekladať stránky v jazyku <ph name="SOURCE_LANGUAGE" /></translation> <translation id="1070901266639972381">Noc</translation> @@ -491,6 +492,7 @@ <translation id="2955913368246107853">Zatvoriť panel pre vyhľadávanie</translation> <translation id="2969319727213777354">Ak chcete nadviazať zabezpečené pripojenie, vaše hodiny musia byť nastavené správne. Je to preto, že certifikáty, ktoré webové stránky používajú na vlastnú identifikáciu, sú platné iba určitý čas. Keďže nie sú hodiny vášho zariadenia nastavené správne, Chrome nemôže tieto certifikáty overiť.</translation> <translation id="2972581237482394796">&Dopredu</translation> +<translation id="2975775789586780239">Zľava <ph name="DISCOUNT" /></translation> <translation id="2977665033722899841"><ph name="ROW_NAME" />, aktuálne vybraté. <ph name="ROW_CONTENT" /></translation> <translation id="2985306909656435243">Ak túto možnosť povolíte, Chromium uloží na tomto zariadení kópiu karty, aby ste mohli rýchlejšie vypĺňať formuláre.</translation> <translation id="2985398929374701810">Zadajte platnú adresu</translation> @@ -1878,6 +1880,7 @@ <translation id="8685155993131031756">Prc-16K</translation> <translation id="8688672835843460752">K dispozícii</translation> <translation id="868922510921656628">Počet strán v súprave</translation> +<translation id="8697373104056314601">Ak chcete získať najvyšší stupeň zabezpečenia Chromu, <ph name="BEGIN_ENHANCED_PROTECTION_LINK" />zapnite rozšírenú ochranu<ph name="END_ENHANCED_PROTECTION_LINK" />.</translation> <translation id="869891660844655955">Koniec platnosti</translation> <translation id="8699041776323235191">Zariadenie HID</translation> <translation id="8703575177326907206">Vaše pripojenie k doméne <ph name="DOMAIN" /> sa nešifruje.</translation>
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index 0b451a7..d09a73d3 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -36,8 +36,6 @@ "engine/cycle/commit_counters.h", "engine/cycle/model_neutral_state.cc", "engine/cycle/model_neutral_state.h", - "engine/cycle/status_counters.cc", - "engine/cycle/status_counters.h", "engine/cycle/sync_cycle_snapshot.cc", "engine/cycle/sync_cycle_snapshot.h", "engine/cycle/update_counters.cc",
diff --git a/components/sync/driver/data_type_controller.h b/components/sync/driver/data_type_controller.h index 060a320..8688e515f 100644 --- a/components/sync/driver/data_type_controller.h +++ b/components/sync/driver/data_type_controller.h
@@ -15,7 +15,6 @@ #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "components/sync/base/model_type.h" -#include "components/sync/engine/cycle/status_counters.h" #include "components/sync/engine/shutdown_reason.h" #include "components/sync/model/data_type_error_handler.h" @@ -41,8 +40,8 @@ FAILED // The controller was started but encountered an error. }; - // Returned from RegisterWithBackend. - enum RegisterWithBackendResult { + // Returned from ActivateDataType. + enum ActivateDataTypeResult { // Indicates that the initial download for this type is already complete, or // wasn't needed in the first place (e.g. for proxy types). TYPE_ALREADY_DOWNLOADED, @@ -61,9 +60,6 @@ base::OnceCallback<void(const ModelType, std::unique_ptr<base::ListValue>)>; - using StatusCountersCallback = - base::OnceCallback<void(ModelType, const StatusCounters&)>; - using TypeMap = std::map<ModelType, std::unique_ptr<DataTypeController>>; using TypeVector = std::vector<std::unique_ptr<DataTypeController>>; @@ -79,11 +75,10 @@ virtual void LoadModels(const ConfigureContext& configure_context, const ModelLoadCallback& model_load_callback) = 0; - // Registers with sync backend if needed. This function is called by - // DataTypeManager before downloading initial data. Returns whether the - // initial download for this type is already complete. - // TODO(crbug.com/647505): Rename this function to ActivateDataType(). - virtual RegisterWithBackendResult RegisterWithBackend( + // Called by DataTypeManager once the local model has loaded, but before + // downloading initial data (if necessary). Returns whether the initial + // download for this type is already complete. + virtual ActivateDataTypeResult ActivateDataType( ModelTypeConfigurer* configurer) = 0; // Called by DataTypeManager to deactivate the controlled data type. @@ -125,12 +120,6 @@ // Used for populating nodes in Sync Node Browser of chrome://sync-internals. virtual void GetAllNodes(AllNodesCallback callback) = 0; - // Collects StatusCounters for this datatype and passes them to |callback|. - // Used to display entity counts in chrome://sync-internals. Can be called - // only if state() != NOT_RUNNING. - // TODO(crbug.com/1102849): Remove, not used anymore. - virtual void GetStatusCounters(StatusCountersCallback callback) = 0; - // Records entities count and estimated memory usage of the type into // histograms. Can be called only if state() != NOT_RUNNING. virtual void RecordMemoryUsageAndCountsHistograms() = 0;
diff --git a/components/sync/driver/data_type_manager_impl.cc b/components/sync/driver/data_type_manager_impl.cc index a33fcd5..66b9712 100644 --- a/components/sync/driver/data_type_manager_impl.cc +++ b/components/sync/driver/data_type_manager_impl.cc
@@ -194,18 +194,18 @@ Restart(); } -void DataTypeManagerImpl::RegisterTypesWithBackend() { +void DataTypeManagerImpl::ActivateDataTypes() { for (ModelType type : last_enabled_types_) { const auto& dtc_iter = controllers_->find(type); if (dtc_iter == controllers_->end()) continue; DataTypeController* dtc = dtc_iter->second.get(); if (dtc->state() == DataTypeController::MODEL_LOADED) { - // Only call RegisterWithBackend for types that completed LoadModels + // Only call ActivateDataType for types that completed LoadModels // successfully. Such types shouldn't be in an error state at the same // time. DCHECK(!data_type_status_table_.GetFailedTypes().Has(dtc->type())); - switch (dtc->RegisterWithBackend(configurer_)) { + switch (dtc->ActivateDataType(configurer_)) { case DataTypeController::TYPE_ALREADY_DOWNLOADED: // Proxy types (as opposed to protocol types) don't actually have any // data, so keep proxy types out of |downloaded_types_|. @@ -348,7 +348,7 @@ // TODO(pavely): By now some of datatypes in |download_types_queue_| could // have failed loading and should be excluded from configuration. I need to // adjust |download_types_queue_| for such types. - RegisterTypesWithBackend(); + ActivateDataTypes(); StartNextDownload(ModelTypeSet()); }
diff --git a/components/sync/driver/data_type_manager_impl.h b/components/sync/driver/data_type_manager_impl.h index 8a3a64d5..894e8f8e 100644 --- a/components/sync/driver/data_type_manager_impl.h +++ b/components/sync/driver/data_type_manager_impl.h
@@ -160,8 +160,8 @@ void ConfigureImpl(ModelTypeSet desired_types, const ConfigureContext& context); - // Calls data type controllers of requested types to register with backend. - void RegisterTypesWithBackend(); + // Calls data type controllers of requested types to activate. + void ActivateDataTypes(); DataTypeConfigStateMap BuildDataTypeConfigStateMap( const ModelTypeSet& types_being_configured) const;
diff --git a/components/sync/driver/data_type_manager_impl_unittest.cc b/components/sync/driver/data_type_manager_impl_unittest.cc index 58932a8..438e7bfd 100644 --- a/components/sync/driver/data_type_manager_impl_unittest.cc +++ b/components/sync/driver/data_type_manager_impl_unittest.cc
@@ -1313,12 +1313,12 @@ // Bookmarks model isn't loaded yet and it is required to complete before // call to configure. Ensure that configure wasn't called. EXPECT_EQ(0, configurer_.configure_call_count()); - EXPECT_EQ(0, GetController(BOOKMARKS)->register_with_backend_call_count()); + EXPECT_EQ(0, GetController(BOOKMARKS)->activate_call_count()); // Finishing model load should trigger configure. GetController(BOOKMARKS)->model()->SimulateModelStartFinished(); EXPECT_EQ(1, configurer_.configure_call_count()); - EXPECT_EQ(1, GetController(BOOKMARKS)->register_with_backend_call_count()); + EXPECT_EQ(1, GetController(BOOKMARKS)->activate_call_count()); FinishDownload(ModelTypeSet(), ModelTypeSet()); // control types FinishDownload(ModelTypeSet(BOOKMARKS), ModelTypeSet()); @@ -1327,8 +1327,8 @@ } // Test that when encryption fails for a given type, the corresponding -// controller is not told to register with its backend. -TEST_F(SyncDataTypeManagerImplTest, RegisterWithBackendOnEncryptionError) { +// data type is not activated. +TEST_F(SyncDataTypeManagerImplTest, ActivateDataTypeOnEncryptionError) { AddController(BOOKMARKS); AddController(PASSWORDS); GetController(BOOKMARKS)->model()->EnableManualModelStart(); @@ -1341,17 +1341,17 @@ EXPECT_EQ(DataTypeController::NOT_RUNNING, GetController(BOOKMARKS)->state()); EXPECT_EQ(DataTypeController::MODEL_STARTING, GetController(PASSWORDS)->state()); - EXPECT_EQ(0, GetController(BOOKMARKS)->register_with_backend_call_count()); - EXPECT_EQ(0, GetController(PASSWORDS)->register_with_backend_call_count()); + EXPECT_EQ(0, GetController(BOOKMARKS)->activate_call_count()); + EXPECT_EQ(0, GetController(PASSWORDS)->activate_call_count()); GetController(PASSWORDS)->model()->SimulateModelStartFinished(); - EXPECT_EQ(0, GetController(BOOKMARKS)->register_with_backend_call_count()); - EXPECT_EQ(1, GetController(PASSWORDS)->register_with_backend_call_count()); + EXPECT_EQ(0, GetController(BOOKMARKS)->activate_call_count()); + EXPECT_EQ(1, GetController(PASSWORDS)->activate_call_count()); } -// Test that RegisterWithBackend is not called for datatypes that failed +// Test that ActivateDataType is not called for datatypes that failed // LoadModels(). -TEST_F(SyncDataTypeManagerImplTest, RegisterWithBackendAfterLoadModelsError) { +TEST_F(SyncDataTypeManagerImplTest, ActivateDataTypeAfterLoadModelsError) { // Initiate configuration for two datatypes but block them at LoadModels. AddController(BOOKMARKS); AddController(PASSWORDS); @@ -1369,9 +1369,9 @@ ModelError(FROM_HERE, "test error")); GetController(PASSWORDS)->model()->SimulateModelStartFinished(); - // RegisterWithBackend should be called for passwords, but not bookmarks. - EXPECT_EQ(0, GetController(BOOKMARKS)->register_with_backend_call_count()); - EXPECT_EQ(1, GetController(PASSWORDS)->register_with_backend_call_count()); + // ActivateDataType should be called for passwords, but not bookmarks. + EXPECT_EQ(0, GetController(BOOKMARKS)->activate_call_count()); + EXPECT_EQ(1, GetController(PASSWORDS)->activate_call_count()); } // Test that Stop with DISABLE_SYNC calls DTC Stop with CLEAR_METADATA for
diff --git a/components/sync/driver/fake_data_type_controller.cc b/components/sync/driver/fake_data_type_controller.cc index 7a6304b..24b14eb9 100644 --- a/components/sync/driver/fake_data_type_controller.cc +++ b/components/sync/driver/fake_data_type_controller.cc
@@ -39,10 +39,10 @@ return precondition_state_; } -DataTypeController::RegisterWithBackendResult -FakeDataTypeController::RegisterWithBackend(ModelTypeConfigurer* configurer) { - ++register_with_backend_call_count_; - return ModelTypeController::RegisterWithBackend(configurer); +DataTypeController::ActivateDataTypeResult +FakeDataTypeController::ActivateDataType(ModelTypeConfigurer* configurer) { + ++activate_call_count_; + return ModelTypeController::ActivateDataType(configurer); } } // namespace syncer
diff --git a/components/sync/driver/fake_data_type_controller.h b/components/sync/driver/fake_data_type_controller.h index 4bcb6e6..9b7b26c 100644 --- a/components/sync/driver/fake_data_type_controller.h +++ b/components/sync/driver/fake_data_type_controller.h
@@ -25,18 +25,16 @@ // |enable_transport_only_model| is set upon construction. FakeModelTypeControllerDelegate* model(SyncMode sync_mode = SyncMode::kFull); - int register_with_backend_call_count() const { - return register_with_backend_call_count_; - } + int activate_call_count() const { return activate_call_count_; } // ModelTypeController overrides. PreconditionState GetPreconditionState() const override; - RegisterWithBackendResult RegisterWithBackend( + ActivateDataTypeResult ActivateDataType( ModelTypeConfigurer* configurer) override; private: PreconditionState precondition_state_ = PreconditionState::kPreconditionsMet; - int register_with_backend_call_count_ = 0; + int activate_call_count_ = 0; }; } // namespace syncer
diff --git a/components/sync/driver/model_type_controller.cc b/components/sync/driver/model_type_controller.cc index 15939731..2c3cec5e 100644 --- a/components/sync/driver/model_type_controller.cc +++ b/components/sync/driver/model_type_controller.cc
@@ -120,8 +120,8 @@ base::AsWeakPtr(this))); } -DataTypeController::RegisterWithBackendResult -ModelTypeController::RegisterWithBackend(ModelTypeConfigurer* configurer) { +DataTypeController::ActivateDataTypeResult +ModelTypeController::ActivateDataType(ModelTypeConfigurer* configurer) { DCHECK(CalledOnValidThread()); DCHECK(configurer); DCHECK(activation_response_); @@ -214,11 +214,6 @@ delegate_->GetAllNodesForDebugging(std::move(callback)); } -void ModelTypeController::GetStatusCounters(StatusCountersCallback callback) { - DCHECK(delegate_); - delegate_->GetStatusCountersForDebugging(std::move(callback)); -} - void ModelTypeController::RecordMemoryUsageAndCountsHistograms() { DCHECK(delegate_); delegate_->RecordMemoryUsageAndCountsHistograms();
diff --git a/components/sync/driver/model_type_controller.h b/components/sync/driver/model_type_controller.h index 3d8ff8de..5fb62c3 100644 --- a/components/sync/driver/model_type_controller.h +++ b/components/sync/driver/model_type_controller.h
@@ -41,20 +41,19 @@ // Steals the activation response, only used for Nigori. // TODO(crbug.com/967677): Once all datatypes are in USS, we should redesign - // or remove RegisterWithBackend, and expose the activation response via + // or remove ActivateDataType, and expose the activation response via // LoadModels(), which is more natural in USS. std::unique_ptr<DataTypeActivationResponse> ActivateManuallyForNigori(); // DataTypeController implementation. void LoadModels(const ConfigureContext& configure_context, const ModelLoadCallback& model_load_callback) override; - RegisterWithBackendResult RegisterWithBackend( + ActivateDataTypeResult ActivateDataType( ModelTypeConfigurer* configurer) override; void DeactivateDataType(ModelTypeConfigurer* configurer) override; void Stop(ShutdownReason shutdown_reason, StopCallback callback) override; State state() const override; void GetAllNodes(AllNodesCallback callback) override; - void GetStatusCounters(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; ModelTypeControllerDelegate* GetDelegateForTesting(SyncMode sync_mode);
diff --git a/components/sync/driver/model_type_controller_unittest.cc b/components/sync/driver/model_type_controller_unittest.cc index 55cf069..6cf7151 100644 --- a/components/sync/driver/model_type_controller_unittest.cc +++ b/components/sync/driver/model_type_controller_unittest.cc
@@ -52,8 +52,6 @@ StartCallback callback)); MOCK_METHOD1(OnSyncStopping, void(SyncStopMetadataFate metadata_fate)); MOCK_METHOD1(GetAllNodesForDebugging, void(AllNodesCallback callback)); - MOCK_METHOD1(GetStatusCountersForDebugging, - void(StatusCountersCallback callback)); MOCK_METHOD0(RecordMemoryUsageAndCountsHistograms, void()); }; @@ -177,11 +175,11 @@ return true; } - void RegisterWithBackend(bool expect_downloaded) { + void ActivateDataType(bool expect_downloaded) { auto result = expect_downloaded ? DataTypeController::TYPE_ALREADY_DOWNLOADED : DataTypeController::TYPE_NOT_YET_DOWNLOADED; - EXPECT_EQ(result, controller_.RegisterWithBackend(&configurer_)); + EXPECT_EQ(result, controller_.ActivateDataType(&configurer_)); // ModelTypeProcessorProxy does posting of tasks. base::RunLoop().RunUntilIdle(); } @@ -240,7 +238,7 @@ base::HistogramTester histogram_tester; ASSERT_TRUE(LoadModels()); EXPECT_EQ(DataTypeController::MODEL_LOADED, controller()->state()); - RegisterWithBackend(/*expect_downloaded=*/false); + ActivateDataType(/*expect_downloaded=*/false); EXPECT_TRUE(processor()->is_connected()); EXPECT_EQ(DataTypeController::RUNNING, controller()->state()); histogram_tester.ExpectTotalCount(kStartFailuresHistogram, 0); @@ -250,7 +248,7 @@ base::HistogramTester histogram_tester; ASSERT_TRUE(LoadModels(/*initial_sync_done=*/true)); EXPECT_EQ(DataTypeController::MODEL_LOADED, controller()->state()); - RegisterWithBackend(/*expect_downloaded=*/true); + ActivateDataType(/*expect_downloaded=*/true); EXPECT_TRUE(processor()->is_connected()); histogram_tester.ExpectTotalCount(kStartFailuresHistogram, 0); } @@ -284,7 +282,7 @@ TEST_F(ModelTypeControllerTest, Stop) { ASSERT_TRUE(LoadModels()); - RegisterWithBackend(/*expect_downloaded=*/false); + ActivateDataType(/*expect_downloaded=*/false); EXPECT_TRUE(processor()->is_connected()); DeactivateDataTypeAndStop(STOP_SYNC); EXPECT_EQ(DataTypeController::NOT_RUNNING, controller()->state()); @@ -653,7 +651,7 @@ std::move(start_callback).Run(std::move(activation_response)); ASSERT_EQ(DataTypeController::MODEL_LOADED, controller()->state()); - RegisterWithBackend(/*expect_downloaded=*/false); + ActivateDataType(/*expect_downloaded=*/false); ASSERT_EQ(DataTypeController::RUNNING, controller()->state()); // Now trigger the run-time error.
diff --git a/components/sync/driver/syncable_service_based_model_type_controller.cc b/components/sync/driver/syncable_service_based_model_type_controller.cc index 1e92152..02b66ff 100644 --- a/components/sync/driver/syncable_service_based_model_type_controller.cc +++ b/components/sync/driver/syncable_service_based_model_type_controller.cc
@@ -52,10 +52,6 @@ GetBridgeDelegate()->GetAllNodesForDebugging(std::move(callback)); } - void GetStatusCountersForDebugging(StatusCountersCallback callback) override { - GetBridgeDelegate()->GetStatusCountersForDebugging(std::move(callback)); - } - void RecordMemoryUsageAndCountsHistograms() override { GetBridgeDelegate()->RecordMemoryUsageAndCountsHistograms(); }
diff --git a/components/sync/engine/cycle/status_counters.cc b/components/sync/engine/cycle/status_counters.cc deleted file mode 100644 index f401a4c6..0000000 --- a/components/sync/engine/cycle/status_counters.cc +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2014 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. - -#include "components/sync/engine/cycle/status_counters.h" - -#include "base/json/json_string_value_serializer.h" - -namespace syncer { - -StatusCounters::StatusCounters() - : num_entries(0), num_entries_and_tombstones(0) {} - -StatusCounters::~StatusCounters() {} - -std::unique_ptr<base::DictionaryValue> StatusCounters::ToValue() const { - std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue()); - value->SetInteger("numEntries", num_entries); - value->SetInteger("numEntriesAndTombstones", num_entries_and_tombstones); - return value; -} - -std::string StatusCounters::ToString() const { - std::string result; - std::unique_ptr<base::DictionaryValue> value = ToValue(); - JSONStringValueSerializer serializer(&result); - serializer.Serialize(*value); - return result; -} - -} // namespace syncer
diff --git a/components/sync/engine/cycle/status_counters.h b/components/sync/engine/cycle/status_counters.h deleted file mode 100644 index da7d983..0000000 --- a/components/sync/engine/cycle/status_counters.h +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2014 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 COMPONENTS_SYNC_ENGINE_CYCLE_STATUS_COUNTERS_H_ -#define COMPONENTS_SYNC_ENGINE_CYCLE_STATUS_COUNTERS_H_ - -#include <stddef.h> - -#include <memory> -#include <string> - -#include "base/values.h" - -namespace syncer { - -// A class to maintain counts related to the current status of a sync type. -struct StatusCounters { - StatusCounters(); - ~StatusCounters(); - - std::unique_ptr<base::DictionaryValue> ToValue() const; - std::string ToString() const; - - size_t num_entries; - size_t num_entries_and_tombstones; -}; - -} // namespace syncer - -#endif // COMPONENTS_SYNC_ENGINE_CYCLE_STATUS_COUNTERS_H_
diff --git a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc index 1379dce..28f7d70 100644 --- a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc +++ b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.cc
@@ -123,6 +123,4 @@ emitted_update_counters_ = update_counters_; } -void DataTypeDebugInfoEmitter::EmitStatusCountersUpdate() {} - } // namespace syncer
diff --git a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h index 41246b3..d48a2f8 100644 --- a/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h +++ b/components/sync/engine_impl/cycle/data_type_debug_info_emitter.h
@@ -55,11 +55,6 @@ // Triggers an update counters update to registered observers. void EmitUpdateCountersUpdate(); - // Triggers a status counters update to registered observers. The default - // implementation does nothing and is present only to make this class - // non-abstract and thus unit-testable. - virtual void EmitStatusCountersUpdate(); - protected: const ModelType type_;
diff --git a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc index db2b7a2..53d27e1 100644 --- a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc +++ b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.cc
@@ -11,11 +11,4 @@ NonBlockingTypeDebugInfoEmitter::~NonBlockingTypeDebugInfoEmitter() {} -void NonBlockingTypeDebugInfoEmitter::EmitStatusCountersUpdate() { - // TODO(gangwu): Allow driving emission of status counters from here. This is - // tricky because we do not have access to ClientTagBasedModelTypeProcessor or - // ModelTypeStore currently. This method is fairly redundant since counters - // are also emitted from the UI thread, unclear how important this is. -} - } // namespace syncer
diff --git a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h index 48afd776..1deebc7 100644 --- a/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h +++ b/components/sync/engine_impl/cycle/non_blocking_type_debug_info_emitter.h
@@ -16,9 +16,6 @@ ~NonBlockingTypeDebugInfoEmitter() override; - // Triggers a status counters update to registered observers. - void EmitStatusCountersUpdate() override; - private: DISALLOW_COPY_AND_ASSIGN(NonBlockingTypeDebugInfoEmitter); };
diff --git a/components/sync/engine_impl/loopback_server/loopback_server.h b/components/sync/engine_impl/loopback_server/loopback_server.h index 897cb395..3b5a5e9e 100644 --- a/components/sync/engine_impl/loopback_server/loopback_server.h +++ b/components/sync/engine_impl/loopback_server/loopback_server.h
@@ -39,7 +39,7 @@ // Called after the server has processed a successful commit. The types // updated as part of the commit are passed in |committed_model_types|. - virtual void OnCommit(const std::string& committer_id, + virtual void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) = 0; // Called when a page URL is committed via SESSIONS and the user has
diff --git a/components/sync/engine_impl/model_type_worker.cc b/components/sync/engine_impl/model_type_worker.cc index 083f7cc..18412d3 100644 --- a/components/sync/engine_impl/model_type_worker.cc +++ b/components/sync/engine_impl/model_type_worker.cc
@@ -377,7 +377,6 @@ UpdateCounters* counters = debug_info_emitter_->GetMutableUpdateCounters(); counters->num_updates_applied += num_updates_applied; debug_info_emitter_->EmitUpdateCountersUpdate(); - debug_info_emitter_->EmitStatusCountersUpdate(); pending_updates_.clear(); }
diff --git a/components/sync/engine_impl/non_blocking_type_commit_contribution.cc b/components/sync/engine_impl/non_blocking_type_commit_contribution.cc index 4d97964..07d6cbe 100644 --- a/components/sync/engine_impl/non_blocking_type_commit_contribution.cc +++ b/components/sync/engine_impl/non_blocking_type_commit_contribution.cc
@@ -198,7 +198,6 @@ cleaned_up_ = true; debug_info_emitter_->EmitCommitCountersUpdate(); - debug_info_emitter_->EmitStatusCountersUpdate(); } size_t NonBlockingTypeCommitContribution::GetNumEntries() const {
diff --git a/components/sync/model/fake_model_type_controller_delegate.cc b/components/sync/model/fake_model_type_controller_delegate.cc index 65347ed..957a0b7 100644 --- a/components/sync/model/fake_model_type_controller_delegate.cc +++ b/components/sync/model/fake_model_type_controller_delegate.cc
@@ -8,7 +8,6 @@ #include "base/callback.h" #include "base/run_loop.h" -#include "components/sync/engine/cycle/status_counters.h" #include "components/sync/engine/data_type_activation_response.h" #include "components/sync/model/data_type_activation_request.h" @@ -85,11 +84,6 @@ std::move(callback).Run(type_, std::make_unique<base::ListValue>()); } -void FakeModelTypeControllerDelegate::GetStatusCountersForDebugging( - StatusCountersCallback callback) { - std::move(callback).Run(type_, StatusCounters()); -} - void FakeModelTypeControllerDelegate::RecordMemoryUsageAndCountsHistograms() {} base::WeakPtr<ModelTypeControllerDelegate>
diff --git a/components/sync/model/fake_model_type_controller_delegate.h b/components/sync/model/fake_model_type_controller_delegate.h index cf33bbb..c283a8de 100644 --- a/components/sync/model/fake_model_type_controller_delegate.h +++ b/components/sync/model/fake_model_type_controller_delegate.h
@@ -41,7 +41,6 @@ StartCallback callback) override; void OnSyncStopping(SyncStopMetadataFate metadata_fate) override; void GetAllNodesForDebugging(AllNodesCallback callback) override; - void GetStatusCountersForDebugging(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; base::WeakPtr<ModelTypeControllerDelegate> GetWeakPtr();
diff --git a/components/sync/model/model_type_controller_delegate.h b/components/sync/model/model_type_controller_delegate.h index 712365d7..8518f1e2 100644 --- a/components/sync/model/model_type_controller_delegate.h +++ b/components/sync/model/model_type_controller_delegate.h
@@ -12,7 +12,6 @@ #include "base/values.h" #include "components/sync/base/model_type.h" #include "components/sync/base/sync_stop_metadata_fate.h" -#include "components/sync/engine/cycle/status_counters.h" #include "components/sync/engine/data_type_activation_response.h" #include "components/sync/model/model_error.h" @@ -29,8 +28,6 @@ base::OnceCallback<void(ModelType, std::unique_ptr<base::ListValue>)>; using StartCallback = base::OnceCallback<void(std::unique_ptr<DataTypeActivationResponse>)>; - using StatusCountersCallback = - base::OnceCallback<void(ModelType, const StatusCounters&)>; virtual ~ModelTypeControllerDelegate() = default; @@ -49,11 +46,6 @@ // Used for populating nodes in Sync Node Browser of chrome://sync-internals. virtual void GetAllNodesForDebugging(AllNodesCallback callback) = 0; - // Returns StatusCounters for the type to |callback|. - // Used for updating data type counters in chrome://sync-internals. - virtual void GetStatusCountersForDebugging( - StatusCountersCallback callback) = 0; - // Records entities count and estimated memory usage of the type into // histograms. virtual void RecordMemoryUsageAndCountsHistograms() = 0;
diff --git a/components/sync/model/recording_model_type_change_processor.cc b/components/sync/model/recording_model_type_change_processor.cc index 0be034b8..8a36f00 100644 --- a/components/sync/model/recording_model_type_change_processor.cc +++ b/components/sync/model/recording_model_type_change_processor.cc
@@ -61,15 +61,4 @@ return ""; } -// static -std::unique_ptr<ModelTypeChangeProcessor> -RecordingModelTypeChangeProcessor::CreateProcessorAndAssignRawPointer( - RecordingModelTypeChangeProcessor** processor_address) { - auto processor = std::make_unique<RecordingModelTypeChangeProcessor>(); - *processor_address = processor.get(); - // Not all compilers are smart enough to up cast during copy elision, so we - // explicitly create a correctly typed unique_ptr. - return base::WrapUnique(processor.release()); -} - } // namespace syncer
diff --git a/components/sync/model/recording_model_type_change_processor.h b/components/sync/model/recording_model_type_change_processor.h index e66f46d..97a9f4c 100644 --- a/components/sync/model/recording_model_type_change_processor.h +++ b/components/sync/model/recording_model_type_change_processor.h
@@ -61,13 +61,6 @@ MetadataBatch* metadata() const { return metadata_.get(); } - // Constructs the processor and assigns its raw pointer to the given address. - // This way, the tests can keep the raw pointer for verifying expectations - // while the unique pointer is owned by the bridge being tested. - static std::unique_ptr<ModelTypeChangeProcessor> - CreateProcessorAndAssignRawPointer( - RecordingModelTypeChangeProcessor** processor_address); - private: std::multimap<std::string, std::unique_ptr<EntityData>> put_multimap_; std::multimap<std::string, std::unique_ptr<EntityData>> update_multimap_;
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc index 9a371e8..fec3dd6a 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -1142,16 +1142,6 @@ DCHECK(!entity_tracker_); } -void ClientTagBasedModelTypeProcessor::GetStatusCountersForDebugging( - StatusCountersCallback callback) { - StatusCounters counters; - if (entity_tracker_) { - counters.num_entries_and_tombstones = entity_tracker_->size(); - counters.num_entries = entity_tracker_->CountNonTombstoneEntries(); - } - std::move(callback).Run(type_, counters); -} - void ClientTagBasedModelTypeProcessor::RecordMemoryUsageAndCountsHistograms() { SyncRecordModelTypeMemoryHistogram(type_, EstimateMemoryUsage()); const size_t non_tombstone_entries_count =
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.h b/components/sync/model_impl/client_tag_based_model_type_processor.h index 17b3300..2cfa68e 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor.h +++ b/components/sync/model_impl/client_tag_based_model_type_processor.h
@@ -17,7 +17,6 @@ #include "components/sync/base/client_tag_hash.h" #include "components/sync/base/model_type.h" #include "components/sync/base/sync_stop_metadata_fate.h" -#include "components/sync/engine/cycle/status_counters.h" #include "components/sync/engine/model_type_processor.h" #include "components/sync/engine/non_blocking_sync_common.h" #include "components/sync/model/data_batch.h" @@ -103,7 +102,6 @@ StartCallback callback) override; void OnSyncStopping(SyncStopMetadataFate metadata_fate) override; void GetAllNodesForDebugging(AllNodesCallback callback) override; - void GetStatusCountersForDebugging(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; // Returns the estimate of dynamically allocated memory in bytes.
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc index d9178f9c..e0f8289c 100644 --- a/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc +++ b/components/sync/model_impl/client_tag_based_model_type_processor_unittest.cc
@@ -74,12 +74,6 @@ *dst = std::move(src); } -void CaptureStatusCounters(StatusCounters* dst, - ModelType model_type, - const StatusCounters& counters) { - *dst = counters; -} - class TestModelTypeSyncBridge : public FakeModelTypeSyncBridge { public: explicit TestModelTypeSyncBridge(bool commit_only, @@ -2194,10 +2188,6 @@ worker()->AckOnePendingCommit(); // Check the processor tracks the entity. - StatusCounters status_counters; - type_processor()->GetStatusCountersForDebugging( - base::BindOnce(&CaptureStatusCounters, &status_counters)); - ASSERT_EQ(1u, status_counters.num_entries); ASSERT_NE(nullptr, GetEntityForStorageKey(kKey1)); // The bridge deletes the data locally and does not want to sync the deletion. @@ -2207,9 +2197,6 @@ // The deletion is not synced up. worker()->VerifyPendingCommits({}); // The processor tracks no entity any more. - type_processor()->GetStatusCountersForDebugging( - base::BindOnce(&CaptureStatusCounters, &status_counters)); - EXPECT_EQ(status_counters.num_entries, 0U); EXPECT_EQ(nullptr, GetEntityForStorageKey(kKey1)); } @@ -2226,10 +2213,6 @@ // No deletion is not synced up. worker()->VerifyPendingCommits({}); // The processor tracks no entity. - StatusCounters status_counters; - type_processor()->GetStatusCountersForDebugging( - base::BindOnce(&CaptureStatusCounters, &status_counters)); - EXPECT_EQ(status_counters.num_entries, 0U); EXPECT_EQ(nullptr, GetEntityForStorageKey(kKey1)); } @@ -2245,10 +2228,6 @@ worker()->AckOnePendingCommit(); // Check the processor tracks the entity. - StatusCounters status_counters; - type_processor()->GetStatusCountersForDebugging( - base::BindOnce(&CaptureStatusCounters, &status_counters)); - ASSERT_EQ(1u, status_counters.num_entries); ASSERT_NE(nullptr, GetEntityForStorageKey(kKey1)); // The bridge deletes the data locally and does not want to sync the deletion. @@ -2258,9 +2237,6 @@ // The deletion is not synced up. worker()->VerifyPendingCommits({}); // The processor tracks no entity any more. - type_processor()->GetStatusCountersForDebugging( - base::BindOnce(&CaptureStatusCounters, &status_counters)); - EXPECT_EQ(status_counters.num_entries, 0U); EXPECT_EQ(nullptr, GetEntityForStorageKey(kKey1)); }
diff --git a/components/sync/model_impl/forwarding_model_type_controller_delegate.cc b/components/sync/model_impl/forwarding_model_type_controller_delegate.cc index 072d1df0..dbee450e 100644 --- a/components/sync/model_impl/forwarding_model_type_controller_delegate.cc +++ b/components/sync/model_impl/forwarding_model_type_controller_delegate.cc
@@ -34,11 +34,6 @@ other_->GetAllNodesForDebugging(std::move(callback)); } -void ForwardingModelTypeControllerDelegate::GetStatusCountersForDebugging( - StatusCountersCallback callback) { - other_->GetStatusCountersForDebugging(std::move(callback)); -} - void ForwardingModelTypeControllerDelegate:: RecordMemoryUsageAndCountsHistograms() { other_->RecordMemoryUsageAndCountsHistograms();
diff --git a/components/sync/model_impl/forwarding_model_type_controller_delegate.h b/components/sync/model_impl/forwarding_model_type_controller_delegate.h index 89bd950..207f415 100644 --- a/components/sync/model_impl/forwarding_model_type_controller_delegate.h +++ b/components/sync/model_impl/forwarding_model_type_controller_delegate.h
@@ -28,7 +28,6 @@ StartCallback callback) override; void OnSyncStopping(SyncStopMetadataFate metadata_fate) override; void GetAllNodesForDebugging(AllNodesCallback callback) override; - void GetStatusCountersForDebugging(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; private:
diff --git a/components/sync/model_impl/proxy_model_type_controller_delegate.cc b/components/sync/model_impl/proxy_model_type_controller_delegate.cc index 7dd02f3b..4d3cb9c9 100644 --- a/components/sync/model_impl/proxy_model_type_controller_delegate.cc +++ b/components/sync/model_impl/proxy_model_type_controller_delegate.cc
@@ -29,15 +29,6 @@ delegate->GetAllNodesForDebugging(std::move(callback_bound_to_ui_thread)); } -void GetStatusCountersForDebuggingHelperOnModelThread( - ProxyModelTypeControllerDelegate::StatusCountersCallback - callback_bound_to_ui_thread, - base::WeakPtr<ModelTypeControllerDelegate> delegate) { - DCHECK(delegate); - delegate->GetStatusCountersForDebugging( - std::move(callback_bound_to_ui_thread)); -} - void StopSyncHelperOnModelThread( SyncStopMetadataFate metadata_fate, base::WeakPtr<ModelTypeControllerDelegate> delegate) { @@ -95,13 +86,6 @@ BindToCurrentSequence(std::move(callback)))); } -void ProxyModelTypeControllerDelegate::GetStatusCountersForDebugging( - StatusCountersCallback callback) { - PostTask(FROM_HERE, - base::BindOnce(&GetStatusCountersForDebuggingHelperOnModelThread, - BindToCurrentSequence(std::move(callback)))); -} - void ProxyModelTypeControllerDelegate::RecordMemoryUsageAndCountsHistograms() { PostTask( FROM_HERE,
diff --git a/components/sync/model_impl/proxy_model_type_controller_delegate.h b/components/sync/model_impl/proxy_model_type_controller_delegate.h index 53670ce1..6bfea31d 100644 --- a/components/sync/model_impl/proxy_model_type_controller_delegate.h +++ b/components/sync/model_impl/proxy_model_type_controller_delegate.h
@@ -34,7 +34,6 @@ StartCallback callback) override; void OnSyncStopping(SyncStopMetadataFate metadata_fate) override; void GetAllNodesForDebugging(AllNodesCallback callback) override; - void GetStatusCountersForDebugging(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; private:
diff --git a/components/sync/nigori/nigori_model_type_processor.cc b/components/sync/nigori/nigori_model_type_processor.cc index 07d2f385..3e21f4ff 100644 --- a/components/sync/nigori/nigori_model_type_processor.cc +++ b/components/sync/nigori/nigori_model_type_processor.cc
@@ -262,15 +262,6 @@ std::move(callback).Run(syncer::NIGORI, std::move(all_nodes)); } -void NigoriModelTypeProcessor::GetStatusCountersForDebugging( - StatusCountersCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - StatusCounters counters; - counters.num_entries = entity_ ? 1 : 0; - counters.num_entries_and_tombstones = counters.num_entries; - std::move(callback).Run(syncer::NIGORI, counters); -} - void NigoriModelTypeProcessor::RecordMemoryUsageAndCountsHistograms() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); size_t memory_usage = 0; @@ -391,6 +382,10 @@ return model_type_state_; } +bool NigoriModelTypeProcessor::HasEntityForTest() const { + return entity_ != nullptr; +} + bool NigoriModelTypeProcessor::IsTrackingMetadata() { return model_type_state_.initial_sync_done(); }
diff --git a/components/sync/nigori/nigori_model_type_processor.h b/components/sync/nigori/nigori_model_type_processor.h index 62d2abc..a3ef36f 100644 --- a/components/sync/nigori/nigori_model_type_processor.h +++ b/components/sync/nigori/nigori_model_type_processor.h
@@ -45,7 +45,6 @@ StartCallback callback) override; void OnSyncStopping(SyncStopMetadataFate metadata_fate) override; void GetAllNodesForDebugging(AllNodesCallback callback) override; - void GetStatusCountersForDebugging(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; // NigoriLocalChangeProcessor implementation. @@ -60,6 +59,8 @@ bool IsConnectedForTest() const; const sync_pb::ModelTypeState& GetModelTypeStateForTest(); + // Whether |entity_| is non-null. + bool HasEntityForTest() const; private: // Returns true if the handshake with sync thread is complete.
diff --git a/components/sync/nigori/nigori_model_type_processor_unittest.cc b/components/sync/nigori/nigori_model_type_processor_unittest.cc index cb4bc17..6d5fb2e5 100644 --- a/components/sync/nigori/nigori_model_type_processor_unittest.cc +++ b/components/sync/nigori/nigori_model_type_processor_unittest.cc
@@ -149,17 +149,6 @@ NigoriModelTypeProcessor* processor() { return &processor_; } - bool ProcessorHasEntity() { - StatusCounters status_counters; - base::MockCallback< - syncer::ModelTypeControllerDelegate::StatusCountersCallback> - status_callback; - EXPECT_CALL(status_callback, Run) - .WillOnce(testing::SaveArg<1>(&status_counters)); - processor()->GetStatusCountersForDebugging(status_callback.Get()); - return status_counters.num_entries > 0; - } - private: testing::NiceMock<MockNigoriSyncBridge> mock_nigori_sync_bridge_; std::unique_ptr<testing::NiceMock<MockCommitQueue>> mock_commit_queue_; @@ -515,7 +504,7 @@ TEST_F(NigoriModelTypeProcessorTest, ShouldResetDataOnCacheGuidMismatch) { SimulateModelReadyToSync(/*initial_sync_done=*/true); - ASSERT_TRUE(ProcessorHasEntity()); + ASSERT_TRUE(processor()->HasEntityForTest()); syncer::DataTypeActivationRequest request; request.error_handler = base::DoNothing(); @@ -532,7 +521,7 @@ EXPECT_EQ(processor()->GetModelTypeStateForTest().cache_guid(), kOtherCacheGuid); - EXPECT_FALSE(ProcessorHasEntity()); + EXPECT_FALSE(processor()->HasEntityForTest()); // Check that sync can be started. const std::string kDecryptorTokenKeyName = "key_name"; @@ -555,7 +544,7 @@ switches::kSyncNigoriRemoveMetadataOnCacheGuidMismatch); SimulateModelReadyToSync(/*initial_sync_done=*/true); - ASSERT_TRUE(ProcessorHasEntity()); + ASSERT_TRUE(processor()->HasEntityForTest()); syncer::DataTypeActivationRequest request; request.error_handler = base::DoNothing(); @@ -571,7 +560,7 @@ EXPECT_TRUE(processor()->IsTrackingMetadata()); EXPECT_EQ(processor()->GetModelTypeStateForTest().cache_guid(), kCacheGuid); - EXPECT_TRUE(ProcessorHasEntity()); + EXPECT_TRUE(processor()->HasEntityForTest()); } TEST_F(NigoriModelTypeProcessorTest, ShouldDisconnectWhenMergeSyncDataFails) {
diff --git a/components/sync/test/fake_server/fake_server.cc b/components/sync/test/fake_server/fake_server.cc index 94a527dc..c421391 100644 --- a/components/sync/test/fake_server/fake_server.cc +++ b/components/sync/test/fake_server/fake_server.cc
@@ -80,14 +80,17 @@ }; std::unique_ptr<sync_pb::DataTypeProgressMarker> -RemoveWalletProgressMarkerIfExists(sync_pb::ClientToServerMessage* message) { +RemoveFullUpdateTypeProgressMarkerIfExists( + ModelType model_type, + sync_pb::ClientToServerMessage* message) { + DCHECK(model_type == syncer::AUTOFILL_WALLET_DATA || + model_type == syncer::AUTOFILL_WALLET_OFFER); google::protobuf::RepeatedPtrField<sync_pb::DataTypeProgressMarker>* progress_markers = message->mutable_get_updates()->mutable_from_progress_marker(); for (int index = 0; index < progress_markers->size(); ++index) { if (syncer::GetModelTypeFromSpecificsFieldNumber( - progress_markers->Get(index).data_type_id()) == - syncer::AUTOFILL_WALLET_DATA) { + progress_markers->Get(index).data_type_id()) == model_type) { auto result = std::make_unique<sync_pb::DataTypeProgressMarker>( progress_markers->Get(index)); progress_markers->erase(progress_markers->begin() + index); @@ -97,20 +100,22 @@ return nullptr; } -void VerifyNoWalletDataProgressMarkerExists( +void VerifyNoProgressMarkerExistsInResponseForFullUpdateType( sync_pb::GetUpdatesResponse* gu_response) { for (const sync_pb::DataTypeProgressMarker& marker : gu_response->new_progress_marker()) { - DCHECK_NE( - syncer::GetModelTypeFromSpecificsFieldNumber(marker.data_type_id()), - syncer::AUTOFILL_WALLET_DATA); + ModelType type = + syncer::GetModelTypeFromSpecificsFieldNumber(marker.data_type_id()); + // Verified there is no progress marker for the full sync type we cared + // about. + DCHECK(type != syncer::AUTOFILL_WALLET_DATA && + type != syncer::AUTOFILL_WALLET_OFFER); } } // Returns a hash representing |entities| including each entity's ID and // version, in a way that the order of the entities is irrelevant. -uint64_t ComputeWalletEntitiesHash( - const std::vector<sync_pb::SyncEntity>& entities) { +uint64_t ComputeEntitiesHash(const std::vector<sync_pb::SyncEntity>& entities) { // Make sure to pick a token that will be consistent across clients when // receiving the same data. We sum up the hashes which has the nice side // effect of being independent of the order. @@ -124,14 +129,14 @@ // Encodes a hash and timestamp in a string that is meant to be used as progress // marker token. -std::string PackWalletProgressMarkerToken(const HashAndTime& hash_and_time) { +std::string PackProgressMarkerToken(const HashAndTime& hash_and_time) { return base::NumberToString(hash_and_time.hash) + " " + base::NumberToString( hash_and_time.time.ToDeltaSinceWindowsEpoch().InMicroseconds()); } -// Reverse for PackWalletProgressMarkerToken. -HashAndTime UnpackWalletProgressMarkerToken(const std::string& token) { +// Reverse for PackProgressMarkerToken. +HashAndTime UnpackProgressMarkerToken(const std::string& token) { // The hash is stored as a first piece of the string (space delimited), the // second piece is the timestamp. HashAndTime hash_and_time; @@ -152,31 +157,25 @@ return hash_and_time; } -void PopulateWalletResults( +void PopulateFullUpdateTypeResults( const std::vector<sync_pb::SyncEntity>& entities, - const sync_pb::DataTypeProgressMarker& old_wallet_marker, + const sync_pb::DataTypeProgressMarker& old_marker, sync_pb::GetUpdatesResponse* gu_response) { - // The response from the loopback server should never have an existing - // progress marker for wallet data (because FakeServer removes it from the - // request). - VerifyNoWalletDataProgressMarkerExists(gu_response); - sync_pb::DataTypeProgressMarker* new_wallet_marker = + sync_pb::DataTypeProgressMarker* new_marker = gu_response->add_new_progress_marker(); - new_wallet_marker->set_data_type_id( - GetSpecificsFieldNumberFromModelType(syncer::AUTOFILL_WALLET_DATA)); + new_marker->set_data_type_id(old_marker.data_type_id()); - uint64_t hash = ComputeWalletEntitiesHash(entities); + uint64_t hash = ComputeEntitiesHash(entities); // We also include information about the fetch time in the token. This is // in-line with the server behavior and -- as it keeps changing -- allows // integration tests to wait for a GetUpdates call to finish, even if they // don't contain data updates. - new_wallet_marker->set_token( - PackWalletProgressMarkerToken({hash, base::Time::Now()})); + new_marker->set_token(PackProgressMarkerToken({hash, base::Time::Now()})); - if (!old_wallet_marker.has_token() || - !AreWalletDataProgressMarkersEquivalent(old_wallet_marker, - *new_wallet_marker)) { + if (!old_marker.has_token() || + !AreFullUpdateTypeDataProgressMarkersEquivalent(old_marker, + *new_marker)) { // New data available; include new elements and tell the client to drop all // previous data. int64_t version = @@ -188,10 +187,9 @@ } // Set the GC directive to implement non-incremental reads. - new_wallet_marker->mutable_gc_directive()->set_type( + new_marker->mutable_gc_directive()->set_type( sync_pb::GarbageCollectionDirective::VERSION_WATERMARK); - new_wallet_marker->mutable_gc_directive()->set_version_watermark(version - - 1); + new_marker->mutable_gc_directive()->set_version_watermark(version - 1); } } @@ -204,11 +202,11 @@ } // namespace -bool AreWalletDataProgressMarkersEquivalent( +bool AreFullUpdateTypeDataProgressMarkersEquivalent( const sync_pb::DataTypeProgressMarker& marker1, const sync_pb::DataTypeProgressMarker& marker2) { - return UnpackWalletProgressMarkerToken(marker1.token()).hash == - UnpackWalletProgressMarkerToken(marker2.token()).hash; + return UnpackProgressMarkerToken(marker1.token()).hash == + UnpackProgressMarkerToken(marker2.token()).hash; } net::HttpStatusCode FakeServer::HandleCommand(const std::string& request, @@ -282,27 +280,43 @@ // Don't care. } - // The loopback server does not know how to handle Wallet requests -- and - // should not. The FakeServer is handling those instead. The loopback server - // has a strong expectations about how progress tokens are structured. To - // not interfere with this, we remove wallet progress markers before passing - // the request to the loopback server. - sync_pb::ClientToServerMessage message_without_wallet = message; + // The loopback server does not know how to handle Wallet or Offer requests + // -- and should not. The FakeServer is handling those instead. The + // loopback server has a strong expectations about how progress tokens are + // structured. To not interfere with this, we remove progress markers for + // full-update types before passing the request to the loopback server. + sync_pb::ClientToServerMessage message_without_full_update_type = message; std::unique_ptr<sync_pb::DataTypeProgressMarker> wallet_marker = - RemoveWalletProgressMarkerIfExists(&message_without_wallet); - + RemoveFullUpdateTypeProgressMarkerIfExists( + syncer::AUTOFILL_WALLET_DATA, &message_without_full_update_type); + std::unique_ptr<sync_pb::DataTypeProgressMarker> offer_marker = + RemoveFullUpdateTypeProgressMarkerIfExists( + syncer::AUTOFILL_WALLET_OFFER, &message_without_full_update_type); net::HttpStatusCode http_status_code = - SendToLoopbackServer(message_without_wallet, response); + SendToLoopbackServer(message_without_full_update_type, response); if (response->has_get_updates() && disallow_sending_encryption_keys_) { response->mutable_get_updates()->clear_encryption_keys(); } - if (wallet_marker != nullptr && http_status_code == net::HTTP_OK && + if (http_status_code == net::HTTP_OK && message.message_contents() == sync_pb::ClientToServerMessage::GET_UPDATES) { - PopulateWalletResults(wallet_entities_, *wallet_marker, - response->mutable_get_updates()); + // The response from the loopback server should never have an existing + // progress marker for full-update types (because FakeServer removes it from + // the request). + VerifyNoProgressMarkerExistsInResponseForFullUpdateType( + response->mutable_get_updates()); + + if (wallet_marker != nullptr) { + PopulateFullUpdateTypeResults(wallet_entities_, *wallet_marker, + response->mutable_get_updates()); + } + + if (offer_marker != nullptr) { + PopulateFullUpdateTypeResults(offer_entities_, *offer_marker, + response->mutable_get_updates()); + } } if (http_status_code == net::HTTP_OK && @@ -381,47 +395,78 @@ void FakeServer::InjectEntity(std::unique_ptr<LoopbackServerEntity> entity) { DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(entity->GetModelType() != syncer::AUTOFILL_WALLET_DATA) - << "Wallet data must be injected via SetWalletData()"; + DCHECK(entity->GetModelType() != syncer::AUTOFILL_WALLET_DATA && + entity->GetModelType() != syncer::AUTOFILL_WALLET_OFFER) + << "Wallet/Offer data must be injected via " + "SetWalletData()/SetOfferData()."; const ModelType model_type = entity->GetModelType(); loopback_server_->SaveEntity(std::move(entity)); // Notify observers so invalidations are mimic-ed. - OnCommit(/*committer_id=*/std::string(), + OnCommit(/*committer_invalidator_client_id=*/std::string(), /*committed_model_types=*/{model_type}); } base::Time FakeServer::SetWalletData( const std::vector<sync_pb::SyncEntity>& wallet_entities) { + DCHECK(!wallet_entities.empty()); + ModelType model_type = + GetModelTypeFromSpecifics(wallet_entities[0].specifics()); + DCHECK(model_type == syncer::AUTOFILL_WALLET_DATA); wallet_entities_ = wallet_entities; const base::Time now = base::Time::Now(); const int64_t version = (now - base::Time::UnixEpoch()).InMilliseconds(); for (sync_pb::SyncEntity& entity : wallet_entities_) { - DCHECK_EQ(GetModelTypeFromSpecifics(entity.specifics()), - syncer::AUTOFILL_WALLET_DATA); DCHECK(!entity.has_client_defined_unique_tag()) - << "The sync server doesn not provide a client tag for wallet entries"; + << "The sync server doesn not provide a client tag for wallet entries."; DCHECK(!entity.id_string().empty()) << "server id required!"; - // The version is overriden during serving of the entities, but is useful + // The version is overridden during serving of the entities, but is useful // here to influence the entities' hash. entity.set_version(version); } - OnCommit(/*committer_id=*/std::string(), + OnCommit(/*committer_invalidator_client_id=*/std::string(), /*committed_model_types=*/{syncer::AUTOFILL_WALLET_DATA}); return now; } +base::Time FakeServer::SetOfferData( + const std::vector<sync_pb::SyncEntity>& offer_entities) { + DCHECK(!offer_entities.empty()); + ModelType model_type = + GetModelTypeFromSpecifics(offer_entities[0].specifics()); + DCHECK(model_type == syncer::AUTOFILL_WALLET_OFFER); + offer_entities_ = offer_entities; + + const base::Time now = base::Time::Now(); + const int64_t version = (now - base::Time::UnixEpoch()).InMilliseconds(); + + for (sync_pb::SyncEntity& entity : offer_entities_) { + DCHECK(!entity.has_client_defined_unique_tag()) + << "The sync server doesn not provide a client tag for offer entries."; + DCHECK(!entity.id_string().empty()) << "server id required!"; + + // The version is overridden during serving of the entities, but is useful + // here to influence the entities' hash. + entity.set_version(version); + } + + OnCommit(/*committer_id=*/std::string(), + /*committed_model_types=*/{syncer::AUTOFILL_WALLET_OFFER}); + + return now; +} + // static -base::Time FakeServer::GetWalletProgressMarkerTimestamp( +base::Time FakeServer::GetProgressMarkerTimestamp( const sync_pb::DataTypeProgressMarker& progress_marker) { - return UnpackWalletProgressMarkerToken(progress_marker.token()).time; + return UnpackProgressMarkerToken(progress_marker.token()).time; } bool FakeServer::ModifyEntitySpecifics( @@ -432,8 +477,9 @@ } // Notify observers so invalidations are mimic-ed. - OnCommit(/*committer_id=*/std::string(), /*committed_model_types=*/{ - GetModelTypeFromSpecifics(updated_specifics)}); + OnCommit( + /*committer_invalidator_client_id=*/std::string(), + /*committed_model_types=*/{GetModelTypeFromSpecifics(updated_specifics)}); return true; } @@ -448,7 +494,7 @@ } // Notify observers so invalidations are mimic-ed. - OnCommit(/*committer_id=*/std::string(), + OnCommit(/*committer_invalidator_client_id=*/std::string(), /*committed_model_types=*/{syncer::BOOKMARKS}); return true; @@ -556,10 +602,10 @@ observers_.RemoveObserver(observer); } -void FakeServer::OnCommit(const std::string& committer_id, +void FakeServer::OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) { for (auto& observer : observers_) - observer.OnCommit(committer_id, committed_model_types); + observer.OnCommit(committer_invalidator_client_id, committed_model_types); } void FakeServer::OnHistoryCommit(const std::string& url) {
diff --git a/components/sync/test/fake_server/fake_server.h b/components/sync/test/fake_server/fake_server.h index 8283d423..e55d8b6b 100644 --- a/components/sync/test/fake_server/fake_server.h +++ b/components/sync/test/fake_server/fake_server.h
@@ -38,7 +38,7 @@ // is in-line with the server behavior and -- as it keeps changing -- allows // integration tests to wait for a GetUpdates call to finish, even if they don't // contain data updates. -bool AreWalletDataProgressMarkersEquivalent( +bool AreFullUpdateTypeDataProgressMarkersEquivalent( const sync_pb::DataTypeProgressMarker& marker1, const sync_pb::DataTypeProgressMarker& marker2); @@ -52,7 +52,7 @@ // Called after FakeServer has processed a successful commit. The types // updated as part of the commit are passed in |committed_model_types|. - virtual void OnCommit(const std::string& committer_id, + virtual void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) = 0; }; @@ -111,14 +111,24 @@ // // The returned value represents the timestamp of the write, such that any // progress marker greater or equal to this timestamp must have processed the - // changes. See GetWalletProgressMarkerTimestamp() below. + // changes. See GetProgressMarkerTimestamp() below. base::Time SetWalletData( const std::vector<sync_pb::SyncEntity>& wallet_entities); - // Allows the caller to know the wallet timestamp corresponding to + // Sets the Autofill offer data to be served in following GetUpdates + // requests (any further GetUpdates response will be empty, indicating no + // change, if the client already has received |offer_entities|). + // + // The returned value represents the timestamp of the write, such that any + // progress marker greater or equal to this timestamp must have processed the + // changes. See GetProgressMarkerTimestamp() below. + base::Time SetOfferData( + const std::vector<sync_pb::SyncEntity>& offer_entities); + + // Allows the caller to know the timestamp corresponding to // |progress_marker| as annotated by the FakeServer during the GetUpdates // request that returned the progress marker. - static base::Time GetWalletProgressMarkerTimestamp( + static base::Time GetProgressMarkerTimestamp( const sync_pb::DataTypeProgressMarker& progress_marker); // Modifies the entity on the server with the given |id|. The entity's @@ -204,7 +214,7 @@ void TriggerMigrationDoneError(syncer::ModelTypeSet types); // Implement LoopbackServer::ObserverForTests: - void OnCommit(const std::string& committer_id, + void OnCommit(const std::string& committer_invalidator_client_id, syncer::ModelTypeSet committed_model_types) override; void OnHistoryCommit(const std::string& url) override; @@ -297,6 +307,10 @@ // the FakeServer handles those itself. std::vector<sync_pb::SyncEntity> wallet_entities_; + // The LoopbackServer does not know how to handle offer data properly, so + // the FakeServer handles those itself. + std::vector<sync_pb::SyncEntity> offer_entities_; + // Creates WeakPtr versions of the current FakeServer. This must be the last // data member! base::WeakPtrFactory<FakeServer> weak_ptr_factory_{this};
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index fd9a7ee4..5cf50e9 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -22,7 +22,6 @@ #include "components/sync/base/model_type.h" #include "components/sync/base/time.h" #include "components/sync/engine/commit_queue.h" -#include "components/sync/engine/cycle/status_counters.h" #include "components/sync/engine/model_type_processor_proxy.h" #include "components/sync/model/data_type_activation_request.h" #include "components/sync/protocol/bookmark_model_metadata.pb.h" @@ -566,27 +565,12 @@ AppendNodeAndChildrenForDebugging(child.get(), i++, all_nodes); } -void BookmarkModelTypeProcessor::GetStatusCountersForDebugging( - StatusCountersCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - syncer::StatusCounters counters; - if (bookmark_tracker_) { - counters.num_entries = - bookmark_tracker_->TrackedBookmarksCountForDebugging(); - counters.num_entries_and_tombstones = - counters.num_entries + - bookmark_tracker_->TrackedUncommittedTombstonesCountForDebugging(); - } - std::move(callback).Run(syncer::BOOKMARKS, counters); -} - void BookmarkModelTypeProcessor::RecordMemoryUsageAndCountsHistograms() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); SyncRecordModelTypeMemoryHistogram(syncer::BOOKMARKS, EstimateMemoryUsage()); if (bookmark_tracker_) { SyncRecordModelTypeCountHistogram( - syncer::BOOKMARKS, - bookmark_tracker_->TrackedBookmarksCountForDebugging()); + syncer::BOOKMARKS, bookmark_tracker_->TrackedBookmarksCount()); } else { SyncRecordModelTypeCountHistogram(syncer::BOOKMARKS, 0); }
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.h b/components/sync_bookmarks/bookmark_model_type_processor.h index 8674485..da6bb55b 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.h +++ b/components/sync_bookmarks/bookmark_model_type_processor.h
@@ -57,7 +57,6 @@ StartCallback start_callback) override; void OnSyncStopping(syncer::SyncStopMetadataFate metadata_fate) override; void GetAllNodesForDebugging(AllNodesCallback callback) override; - void GetStatusCountersForDebugging(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; // Encodes all sync metadata into a string, representing a state that can be
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc index ff551d5f..9651f2e 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -626,22 +626,6 @@ } TEST_F(BookmarkModelTypeProcessorTest, - ShouldReportNoCountersWhenModelIsNotLoaded) { - SimulateOnSyncStarting(); - ASSERT_THAT(processor()->GetTrackerForTest(), IsNull()); - syncer::StatusCounters status_counters; - // Assign an arbitrary non-zero number to the |num_entries| to be able to - // check that actually a 0 has been written to it later. - status_counters.num_entries = 1000; - processor()->GetStatusCountersForDebugging( - base::BindLambdaForTesting([&](syncer::ModelType model_type, - const syncer::StatusCounters& counters) { - status_counters = counters; - })); - EXPECT_EQ(0u, status_counters.num_entries); -} - -TEST_F(BookmarkModelTypeProcessorTest, ShouldNotCommitEntitiesWithoutLoadedFavicons) { base::test::ScopedFeatureList features; features.InitAndEnableFeature( @@ -700,7 +684,7 @@ ASSERT_EQ(0u, bookmark_client()->GetTasksCount()); EXPECT_CALL(callback, Run(_)); - processor()->GetLocalChanges(/*max_entities=*/10, callback.Get()); + processor()->GetLocalChanges(/*max_entries=*/10, callback.Get()); EXPECT_TRUE(callback_result.empty()); EXPECT_TRUE(node->is_favicon_loading()); @@ -708,7 +692,7 @@ GURL(kIconUrl)); ASSERT_TRUE(node->is_favicon_loaded()); EXPECT_CALL(callback, Run(_)); - processor()->GetLocalChanges(/*max_entities=*/10, callback.Get()); + processor()->GetLocalChanges(/*max_entries=*/10, callback.Get()); EXPECT_FALSE(callback_result.empty()); }
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.cc b/components/sync_bookmarks/synced_bookmark_tracker.cc index 88e24eb..7640beaf 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker.cc +++ b/components/sync_bookmarks/synced_bookmark_tracker.cc
@@ -879,16 +879,15 @@ return memory_usage; } +size_t SyncedBookmarkTracker::TrackedBookmarksCount() const { + return bookmark_node_to_entities_map_.size(); +} + size_t SyncedBookmarkTracker::TrackedEntitiesCountForTest() const { return sync_id_to_entities_map_.size(); } -size_t SyncedBookmarkTracker::TrackedBookmarksCountForDebugging() const { - return bookmark_node_to_entities_map_.size(); -} - -size_t SyncedBookmarkTracker::TrackedUncommittedTombstonesCountForDebugging() - const { +size_t SyncedBookmarkTracker::TrackedUncommittedTombstonesCountForTest() const { return ordered_local_tombstones_.size(); }
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.h b/components/sync_bookmarks/synced_bookmark_tracker.h index d0d209c..5798cfc 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker.h +++ b/components/sync_bookmarks/synced_bookmark_tracker.h
@@ -270,15 +270,15 @@ // Returns the estimate of dynamically allocated memory in bytes. size_t EstimateMemoryUsage() const; + // Returns number of tracked bookmarks that aren't deleted. + size_t TrackedBookmarksCount() const; + // Returns number of tracked entities. Used only in test. size_t TrackedEntitiesCountForTest() const; - // Returns number of tracked bookmarks that aren't deleted. - size_t TrackedBookmarksCountForDebugging() const; - // Returns number of bookmarks that have been deleted but the server hasn't // confirmed the deletion yet. - size_t TrackedUncommittedTombstonesCountForDebugging() const; + size_t TrackedUncommittedTombstonesCountForTest() const; // Clears the specifics hash for |entity|, useful for testing. void ClearSpecificsHashForTest(const Entity* entity);
diff --git a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc index 49e9168..f5c9062 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc +++ b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
@@ -463,20 +463,20 @@ tracker->Add(&node, kSyncId, kServerVersion, kModificationTime, unique_position, specifics); - ASSERT_THAT(tracker->TrackedUncommittedTombstonesCountForDebugging(), Eq(0U)); + ASSERT_THAT(tracker->TrackedUncommittedTombstonesCountForTest(), Eq(0U)); // Delete the bookmark, leading to a pending deletion (local tombstone). tracker->MarkDeleted(tracker->GetEntityForSyncId(kSyncId)); ASSERT_THAT(entity->bookmark_node(), IsNull()); ASSERT_TRUE(entity->metadata()->is_deleted()); - ASSERT_THAT(tracker->TrackedUncommittedTombstonesCountForDebugging(), Eq(1U)); + ASSERT_THAT(tracker->TrackedUncommittedTombstonesCountForTest(), Eq(1U)); // Undelete it. tracker->UndeleteTombstoneForBookmarkNode(entity, &node); EXPECT_THAT(entity->bookmark_node(), NotNull()); EXPECT_FALSE(entity->metadata()->is_deleted()); - EXPECT_THAT(tracker->TrackedUncommittedTombstonesCountForDebugging(), Eq(0U)); + EXPECT_THAT(tracker->TrackedUncommittedTombstonesCountForTest(), Eq(0U)); } TEST(SyncedBookmarkTrackerTest,
diff --git a/components/sync_sessions/proxy_tabs_data_type_controller.cc b/components/sync_sessions/proxy_tabs_data_type_controller.cc index 846635e..19dc01f1 100644 --- a/components/sync_sessions/proxy_tabs_data_type_controller.cc +++ b/components/sync_sessions/proxy_tabs_data_type_controller.cc
@@ -6,6 +6,7 @@ #include <utility> +#include "base/values.h" #include "components/sync/driver/configure_context.h" #include "components/sync/engine/model_type_configurer.h" @@ -29,8 +30,8 @@ model_load_callback.Run(type(), syncer::SyncError()); } -syncer::DataTypeController::RegisterWithBackendResult -ProxyTabsDataTypeController::RegisterWithBackend( +syncer::DataTypeController::ActivateDataTypeResult +ProxyTabsDataTypeController::ActivateDataType( syncer::ModelTypeConfigurer* configurer) { DCHECK(configurer); DCHECK_EQ(MODEL_LOADED, state_); @@ -72,12 +73,6 @@ std::move(callback).Run(type(), std::make_unique<base::ListValue>()); } -void ProxyTabsDataTypeController::GetStatusCounters( - StatusCountersCallback callback) { - syncer::StatusCounters counters; - std::move(callback).Run(type(), counters); -} - void ProxyTabsDataTypeController::RecordMemoryUsageAndCountsHistograms() {} } // namespace sync_sessions
diff --git a/components/sync_sessions/proxy_tabs_data_type_controller.h b/components/sync_sessions/proxy_tabs_data_type_controller.h index aa82a74..1df714f5 100644 --- a/components/sync_sessions/proxy_tabs_data_type_controller.h +++ b/components/sync_sessions/proxy_tabs_data_type_controller.h
@@ -26,14 +26,13 @@ // DataTypeController interface. void LoadModels(const syncer::ConfigureContext& configure_context, const ModelLoadCallback& model_load_callback) override; - RegisterWithBackendResult RegisterWithBackend( + ActivateDataTypeResult ActivateDataType( syncer::ModelTypeConfigurer* configurer) override; void Stop(syncer::ShutdownReason shutdown_reason, StopCallback callback) override; State state() const override; void DeactivateDataType(syncer::ModelTypeConfigurer* configurer) override; void GetAllNodes(AllNodesCallback callback) override; - void GetStatusCounters(StatusCountersCallback callback) override; void RecordMemoryUsageAndCountsHistograms() override; private:
diff --git a/components/webxr/OWNERS b/components/webxr/OWNERS index 0890a7e8..ef5e626 100644 --- a/components/webxr/OWNERS +++ b/components/webxr/OWNERS
@@ -2,4 +2,4 @@ bialpio@chromium.org # TEAM: xr-dev@chromium.org -# COMPONENT: Blink>WebXR +# COMPONENT: Internals>XR
diff --git a/components/webxr/android/BUILD.gn b/components/webxr/android/BUILD.gn new file mode 100644 index 0000000..67d3785 --- /dev/null +++ b/components/webxr/android/BUILD.gn
@@ -0,0 +1,84 @@ +# Copyright 2020 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. + +import("//build/config/android/rules.gni") +import("//device/vr/buildflags/buildflags.gni") + +assert(enable_vr) + +source_set("android") { + sources = [ + "xr_install_infobar.cc", + "xr_install_infobar.h", + ] + + if (enable_arcore) { + sources += [ + "arcore_install_helper.cc", + "arcore_install_helper.h", + ] + } + + deps = [ + "//base", + "//components/infobars/core", + "//components/resources:android_resources", + "//components/strings", + "//content/public/browser", + "//ui/base", + ] + + if (enable_arcore) { + deps += [ ":ar_jni_headers" ] + } + + libs = [ "android" ] +} + +android_library("ar_java_base") { + deps = [ + ":webxr_android_enums_java", + "//base:base_java", + "//base:jni_java", + "//content/public/android:content_java", + "//third_party/android_deps:androidx_annotation_annotation_java", + "//third_party/android_deps:androidx_appcompat_appcompat_java", + "//third_party/android_deps:androidx_appcompat_appcompat_resources_java", + "//ui/android:ui_java", + ] + + sources = [ + "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java", + "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java", + ] + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + resources_package = "org.chromium.components.webxr" +} + +android_library("ar_java") { + deps = [ + ":ar_java_base", + ":webxr_android_enums_java", + "//base:base_java", + "//third_party/arcore-android-sdk-client:com_google_ar_core_java", + ] + + sources = [ "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShimImpl.java" ] +} + +if (enable_arcore) { + generate_jni("ar_jni_headers") { + sources = [ "//components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java" ] + } +} + +java_cpp_enum("webxr_android_enums") { + sources = [ "arcore_install_helper.h" ] +} + +android_library("webxr_android_enums_java") { + deps = [ "//third_party/android_deps:androidx_annotation_annotation_java" ] + + srcjar_deps = [ ":webxr_android_enums" ] +}
diff --git a/components/webxr/android/DEPS b/components/webxr/android/DEPS new file mode 100644 index 0000000..2b9956d2 --- /dev/null +++ b/components/webxr/android/DEPS
@@ -0,0 +1,8 @@ +include_rules = [ + "+components/infobars", + "+components/resources/android/theme_resources.h", + "+components/strings/grit/components_strings.h", + "+content/public/android/java/src/org/chromium/content_public", + "+ui/android", + "+ui/base", +]
diff --git a/chrome/browser/android/vr/arcore_device/arcore_install_helper.cc b/components/webxr/android/arcore_install_helper.cc similarity index 78% rename from chrome/browser/android/vr/arcore_device/arcore_install_helper.cc rename to components/webxr/android/arcore_install_helper.cc index 2351475..4d2ea4f 100644 --- a/chrome/browser/android/vr/arcore_device/arcore_install_helper.cc +++ b/components/webxr/android/arcore_install_helper.cc
@@ -2,45 +2,46 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr/arcore_device/arcore_install_helper.h" +#include "components/webxr/android/arcore_install_helper.h" #include <memory> #include <utility> #include "base/bind.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/android/android_theme_resources.h" -#include "chrome/browser/android/vr/android_vr_utils.h" -#include "chrome/browser/android/vr/ar_jni_headers/ArCoreInstallUtils_jni.h" -#include "chrome/browser/android/vr/arcore_device/arcore_device_provider.h" -#include "chrome/browser/android/vr/xr_install_infobar.h" -#include "chrome/grit/generated_resources.h" #include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar_delegate.h" #include "components/infobars/core/infobar_manager.h" -#include "device/vr/android/arcore/arcore_device_provider_factory.h" +#include "components/resources/android/theme_resources.h" +#include "components/strings/grit/components_strings.h" +#include "components/webxr/android/ar_jni_headers/ArCoreInstallUtils_jni.h" +#include "components/webxr/android/xr_install_infobar.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" using base::android::AttachCurrentThread; -namespace vr { - +namespace webxr { namespace { -class ArCoreDeviceProviderFactoryImpl - : public device::ArCoreDeviceProviderFactory { - public: - ArCoreDeviceProviderFactoryImpl() = default; - ~ArCoreDeviceProviderFactoryImpl() override = default; - std::unique_ptr<device::VRDeviceProvider> CreateDeviceProvider() override; +content::WebContents* GetWebContents(int render_process_id, + int render_frame_id) { + content::RenderFrameHost* render_frame_host = + content::RenderFrameHost::FromID(render_process_id, render_frame_id); + DCHECK(render_frame_host); - private: - DISALLOW_COPY_AND_ASSIGN(ArCoreDeviceProviderFactoryImpl); -}; + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(render_frame_host); + DCHECK(web_contents); -std::unique_ptr<device::VRDeviceProvider> -ArCoreDeviceProviderFactoryImpl::CreateDeviceProvider() { - return std::make_unique<device::ArCoreDeviceProvider>(); + return web_contents; } +base::android::ScopedJavaLocalRef<jobject> GetJavaWebContents( + int render_process_id, + int render_frame_id) { + return GetWebContents(render_process_id, render_frame_id) + ->GetJavaWebContents(); +} } // namespace ArCoreInstallHelper::ArCoreInstallHelper() { @@ -117,12 +118,12 @@ case ArCoreAvailability::kUnknownTimedOut: case ArCoreAvailability::kSupportedNotInstalled: { message_text = IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT; - button_text = IDS_AR_CORE_CHECK_INFOBAR_INSTALL_BUTTON; + button_text = IDS_INSTALL; break; } case ArCoreAvailability::kSupportedApkTooOld: { message_text = IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT; - button_text = IDS_AR_CORE_CHECK_INFOBAR_UPDATE_BUTTON; + button_text = IDS_UPDATE; break; } case ArCoreAvailability::kSupportedInstalled: @@ -139,7 +140,7 @@ // TODO(ijamardo, https://crbug.com/838833): Add icon for AR info bar. auto delegate = std::make_unique<XrInstallInfoBar>( infobars::InfoBarDelegate::InfoBarIdentifier::AR_CORE_UPGRADE_ANDROID, - IDR_ERROR_OUTLINE_GOOGBLUE_24DP, message_text, button_text, + IDR_ANDROID_AR_CORE_INSALL_ICON, message_text, button_text, base::BindOnce(&ArCoreInstallHelper::OnInfoBarResponse, weak_ptr_factory_.GetWeakPtr(), render_process_id, render_frame_id)); @@ -176,10 +177,4 @@ } } -static void JNI_ArCoreInstallUtils_InstallArCoreDeviceProviderFactory( - JNIEnv* env) { - device::ArCoreDeviceProviderFactory::Install( - std::make_unique<ArCoreDeviceProviderFactoryImpl>()); -} - -} // namespace vr +} // namespace webxr
diff --git a/chrome/browser/android/vr/arcore_device/arcore_install_helper.h b/components/webxr/android/arcore_install_helper.h similarity index 85% rename from chrome/browser/android/vr/arcore_device/arcore_install_helper.h rename to components/webxr/android/arcore_install_helper.h index 911f9e6..0497131 100644 --- a/chrome/browser/android/vr/arcore_device/arcore_install_helper.h +++ b/components/webxr/android/arcore_install_helper.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_INSTALL_HELPER_H_ -#define CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_INSTALL_HELPER_H_ +#ifndef COMPONENTS_WEBXR_ANDROID_ARCORE_INSTALL_HELPER_H_ +#define COMPONENTS_WEBXR_ANDROID_ARCORE_INSTALL_HELPER_H_ #include "base/android/jni_android.h" #include "base/android/scoped_java_ref.h" @@ -14,11 +14,11 @@ class InfoBarManager; } -namespace vr { +namespace webxr { // Equivalent of ArCoreApk.Availability enum. // For detailed description, please see: // https://developers.google.com/ar/reference/java/arcore/reference/com/google/ar/core/ArCoreApk.Availability -// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.vr +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.webxr enum class ArCoreAvailability : int { kSupportedApkTooOld = 0, kSupportedInstalled = 1, @@ -61,6 +61,6 @@ base::WeakPtrFactory<ArCoreInstallHelper> weak_ptr_factory_{this}; }; -} // namespace vr +} // namespace webxr -#endif // CHROME_BROWSER_ANDROID_VR_ARCORE_DEVICE_ARCORE_INSTALL_HELPER_H_ +#endif // COMPONENTS_WEBXR_ANDROID_ARCORE_INSTALL_HELPER_H_
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java similarity index 95% rename from chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java rename to components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java index d9b6e17..dfee1ee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreInstallUtils.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.vr; +package org.chromium.components.webxr; import android.app.Activity; import android.app.Application; @@ -21,7 +21,7 @@ /** * Installs AR DFM and ArCore runtimes. */ -@JNINamespace("vr") +@JNINamespace("webxr") public class ArCoreInstallUtils { /** * Helper class to store a reference to the ArCoreInstallUtils instance and activity @@ -99,7 +99,7 @@ try { sArCoreInstance = - (ArCoreShim) Class.forName("org.chromium.chrome.browser.vr.ArCoreShimImpl") + (ArCoreShim) Class.forName("org.chromium.components.webxr.ArCoreShimImpl") .newInstance(); } catch (ClassNotFoundException e) { throw new RuntimeException(e); @@ -217,13 +217,8 @@ sInstallRequest = null; } - public static void installArCoreDeviceProviderFactory() { - ArCoreInstallUtilsJni.get().installArCoreDeviceProviderFactory(); - } - @NativeMethods /* package */ interface ArInstallHelperNative { void onRequestInstallSupportedArCoreResult(long nativeArCoreInstallHelper, boolean success); - void installArCoreDeviceProviderFactory(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShim.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java similarity index 97% rename from chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShim.java rename to components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java index 94822f6..0def5be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShim.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShim.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.vr; +package org.chromium.components.webxr; import android.app.Activity; import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShimImpl.java similarity index 94% rename from chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java rename to components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShimImpl.java index 333c197..0de050c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreShimImpl.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreShimImpl.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.vr; +package org.chromium.components.webxr; import android.app.Activity; import android.content.Context; @@ -11,11 +11,11 @@ import org.chromium.base.StrictModeContext; import org.chromium.base.annotations.UsedByReflection; -import org.chromium.chrome.browser.vr.ArCoreShim.InstallStatus; +import org.chromium.components.webxr.ArCoreShim.InstallStatus; -@UsedByReflection("ArCoreJavaUtils.java") +@UsedByReflection("ArCoreInstallUtils.java") class ArCoreShimImpl implements ArCoreShim { - @UsedByReflection("ArCoreJavaUtils.java") + @UsedByReflection("ArCoreInstallUtils.java") public ArCoreShimImpl() {} @Override
diff --git a/chrome/browser/android/vr/xr_install_infobar.cc b/components/webxr/android/xr_install_infobar.cc similarity index 93% rename from chrome/browser/android/vr/xr_install_infobar.cc rename to components/webxr/android/xr_install_infobar.cc index fac5467..475d0b21 100644 --- a/chrome/browser/android/vr/xr_install_infobar.cc +++ b/components/webxr/android/xr_install_infobar.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/vr/xr_install_infobar.h" +#include "components/webxr/android/xr_install_infobar.h" #include "base/callback.h" #include "base/strings/string16.h" @@ -10,7 +10,7 @@ #include "components/infobars/core/infobar_delegate.h" #include "ui/base/l10n/l10n_util.h" -namespace vr { +namespace webxr { XrInstallInfoBar::XrInstallInfoBar( InfoBarIdentifier identifier, @@ -61,4 +61,4 @@ void XrInstallInfoBar::InfoBarDismissed() { std::move(install_callback_).Run(false); } -} // namespace vr +} // namespace webxr
diff --git a/chrome/browser/android/vr/xr_install_infobar.h b/components/webxr/android/xr_install_infobar.h similarity index 89% rename from chrome/browser/android/vr/xr_install_infobar.h rename to components/webxr/android/xr_install_infobar.h index 99c453f..370e434 100644 --- a/chrome/browser/android/vr/xr_install_infobar.h +++ b/components/webxr/android/xr_install_infobar.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ANDROID_VR_XR_INSTALL_INFOBAR_H_ -#define CHROME_BROWSER_ANDROID_VR_XR_INSTALL_INFOBAR_H_ +#ifndef COMPONENTS_WEBXR_ANDROID_XR_INSTALL_INFOBAR_H_ +#define COMPONENTS_WEBXR_ANDROID_XR_INSTALL_INFOBAR_H_ #include "base/callback.h" #include "base/strings/string16.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "components/infobars/core/infobar_delegate.h" -namespace vr { +namespace webxr { // An interface derived from InfoBarDelegate implemented by objects wishing to // control a ConfirmInfoBar. @@ -49,6 +49,6 @@ const int ok_button_id_; base::OnceCallback<void(bool)> install_callback_; }; -} // namespace vr +} // namespace webxr -#endif // CHROME_BROWSER_ANDROID_VR_XR_INSTALL_INFOBAR_H_ +#endif // COMPONENTS_WEBXR_ANDROID_XR_INSTALL_INFOBAR_H_
diff --git a/components/webxr_strings.grdp b/components/webxr_strings.grdp new file mode 100644 index 0000000..5b4e140 --- /dev/null +++ b/components/webxr_strings.grdp
@@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- WebXR specific strings (included from components_strings.grd). --> +<grit-part> + <if expr="enable_arcore"> + <!-- ARCore check infobar --> + <message name="IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT" desc="Text to be displayed in the ARCore check infobar. When a WebXR page is loaded, if ARCore is needed to display AR content and it is not installed, an infobar will be shown to the user prompting them to install ARCore."> + To view augmented reality content, install ARCore + </message> + <message name="IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT" desc="Text to be displayed in the ARCore check infobar. When a WebXR page is loaded, if ARCore is needed to display AR content and the installed ARCore is not up to date to the version needed by the implementation, an infobar will be shown to the user prompting them to update ARCore."> + To view augmented reality content, update ARCore + </message> + </if> +</grit-part>
diff --git a/chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT.png.sha1 b/components/webxr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT.png.sha1 similarity index 100% rename from chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT.png.sha1 rename to components/webxr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_INSTALL_TEXT.png.sha1
diff --git a/chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT.png.sha1 b/components/webxr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT.png.sha1 similarity index 100% rename from chrome/app/vr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT.png.sha1 rename to components/webxr_strings_grdp/IDS_AR_CORE_CHECK_INFOBAR_UPDATE_TEXT.png.sha1
diff --git a/components/webxr_strings_grdp/OWNERS b/components/webxr_strings_grdp/OWNERS new file mode 100644 index 0000000..8c91bd77 --- /dev/null +++ b/components/webxr_strings_grdp/OWNERS
@@ -0,0 +1,2 @@ +file://components/webxr/OWNERS +# COMPONENT: Internals>XR
diff --git a/components/webxr_strings_grdp/README.md b/components/webxr_strings_grdp/README.md new file mode 100644 index 0000000..119d8b9 --- /dev/null +++ b/components/webxr_strings_grdp/README.md
@@ -0,0 +1,5 @@ +This directory of image SHA-1 hashes is used to improve translations of UI +strings through context images for translators. + +See also: [Chrome Translation Screenshots - Instructions & FAQ +](https://docs.google.com/document/d/1nwYWDny20icMSpLUuV_LgrlbWKrYpbXOERUIZNH636o/edit#heading=h.2t7lc4cxo2au)
diff --git a/content/browser/accessibility/accessibility_action_browsertest.cc b/content/browser/accessibility/accessibility_action_browsertest.cc index be1b8ea..3f24d421 100644 --- a/content/browser/accessibility/accessibility_action_browsertest.cc +++ b/content/browser/accessibility/accessibility_action_browsertest.cc
@@ -79,7 +79,9 @@ AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + horizontal_alignment == ax::mojom::ScrollAlignment::kNone + ? ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED + : ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED); ui::AXActionData action_data; action_data.target_node_id = node->GetData().id; action_data.action = ax::mojom::Action::kScrollToMakeVisible; @@ -92,10 +94,12 @@ waiter.WaitForNotification(); } - void ScrollToTop() { + void ScrollToTop(bool will_scroll_horizontally = false) { AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + will_scroll_horizontally + ? ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED + : ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED); BrowserAccessibility* document = GetManager()->GetRoot(); ui::AXActionData action_data; action_data.target_node_id = document->GetData().id; @@ -260,7 +264,7 @@ AccessibilityNotificationWaiter waiter2( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED); ui::AXActionData data; data.action = ax::mojom::Action::kScrollDown; @@ -929,8 +933,7 @@ EXPECT_GE(bounds.x(), doc_right_third.x()); EXPECT_LE(bounds.x(), doc_right_third.right()); EXPECT_FALSE(doc_bounds.Contains(bounds)); - - ScrollToTop(); + ScrollToTop(true /* horizontally scrolls */); bounds = target_node->GetUnclippedScreenBoundsRect(); EXPECT_FALSE(doc_bounds.Contains(bounds));
diff --git a/content/browser/accessibility/accessibility_tree_formatter_android.cc b/content/browser/accessibility/accessibility_tree_formatter_android.cc index 6b4ca89..cb63d72 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_android.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_android.cc
@@ -93,7 +93,7 @@ const AXTreeSelector& selector) override; void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; + std::vector<AXPropertyFilter>* property_filters) override; private: base::FilePath::StringType GetExpectedFileSuffix() override; @@ -160,12 +160,12 @@ } void AccessibilityTreeFormatterAndroid::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { AddPropertyFilter(property_filters, "hint=*"); - AddPropertyFilter(property_filters, "interesting", PropertyFilter::DENY); + AddPropertyFilter(property_filters, "interesting", AXPropertyFilter::DENY); AddPropertyFilter(property_filters, "has_character_locations", - PropertyFilter::DENY); - AddPropertyFilter(property_filters, "has_image", PropertyFilter::DENY); + AXPropertyFilter::DENY); + AddPropertyFilter(property_filters, "has_image", AXPropertyFilter::DENY); } void AccessibilityTreeFormatterAndroid::RecursiveBuildAccessibilityTree(
diff --git a/content/browser/accessibility/accessibility_tree_formatter_base.cc b/content/browser/accessibility/accessibility_tree_formatter_base.cc index 1918f7b..0f71f03 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_base.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_base.cc
@@ -39,7 +39,7 @@ // static PropertyNode PropertyNode::FromPropertyFilter( - const AccessibilityTreeFormatter::PropertyFilter& filter) { + const ui::AXPropertyFilter& filter) { // Property invocation: property_str expected format is // prop_name or prop_name(arg1, ... argN). PropertyNode root; @@ -265,23 +265,6 @@ // AccessibilityTreeFormatter // -AccessibilityTreeFormatter::PropertyFilter::PropertyFilter( - const PropertyFilter&) = default; - -AccessibilityTreeFormatter::PropertyFilter::PropertyFilter( - const std::string& str, - Type type) - : match_str(str), type(type) { - size_t index = str.find(';'); - if (index != std::string::npos) { - filter_str = str.substr(0, index); - if (index + 1 < str.length()) { - match_str = str.substr(index + 1, std::string::npos); - } - } - property_str = match_str.substr(0, match_str.find('=')); -} - AccessibilityTreeFormatter::TestPass AccessibilityTreeFormatter::GetTestPass( size_t index) { std::vector<content::AccessibilityTreeFormatter::TestPass> passes = @@ -294,7 +277,7 @@ std::string AccessibilityTreeFormatterBase::DumpAccessibilityTreeFromManager( BrowserAccessibilityManager* ax_mgr, bool internal, - std::vector<PropertyFilter> property_filters) { + std::vector<AXPropertyFilter> property_filters) { std::unique_ptr<AccessibilityTreeFormatter> formatter; if (internal) formatter = std::make_unique<AccessibilityTreeFormatterBlink>(); @@ -310,7 +293,7 @@ } bool AccessibilityTreeFormatter::MatchesPropertyFilters( - const std::vector<PropertyFilter>& property_filters, + const std::vector<AXPropertyFilter>& property_filters, const std::string& text, bool default_result) { bool allow = default_result; @@ -326,13 +309,13 @@ filter.match_str[filter.match_str.length() - 1] != '*' && base::MatchPattern(text, filter.match_str + "=*"))) { switch (filter.type) { - case PropertyFilter::ALLOW_EMPTY: + case AXPropertyFilter::ALLOW_EMPTY: allow = true; break; - case PropertyFilter::ALLOW: + case AXPropertyFilter::ALLOW: allow = (!base::MatchPattern(text, "*=''")); break; - case PropertyFilter::DENY: + case AXPropertyFilter::DENY: allow = false; break; } @@ -428,7 +411,7 @@ } void AccessibilityTreeFormatterBase::SetPropertyFilters( - const std::vector<PropertyFilter>& property_filters) { + const std::vector<AXPropertyFilter>& property_filters) { property_filters_ = property_filters; } @@ -462,11 +445,11 @@ } switch (filter.type) { - case PropertyFilter::ALLOW_EMPTY: - case PropertyFilter::ALLOW: + case AXPropertyFilter::ALLOW_EMPTY: + case AXPropertyFilter::ALLOW: list.push_back(std::move(property_node)); break; - case PropertyFilter::DENY: + case AXPropertyFilter::DENY: break; default: break; @@ -477,7 +460,7 @@ bool AccessibilityTreeFormatterBase::HasMatchAllPropertyFilter() const { for (const auto& filter : property_filters_) { - if (filter.type == PropertyFilter::ALLOW && filter.match_str == "*") { + if (filter.type == AXPropertyFilter::ALLOW && filter.match_str == "*") { return true; } } @@ -537,13 +520,13 @@ } void AccessibilityTreeFormatterBase::AddPropertyFilter( - std::vector<PropertyFilter>* property_filters, + std::vector<AXPropertyFilter>* property_filters, std::string filter, - PropertyFilter::Type type) { - property_filters->push_back(PropertyFilter(filter, type)); + AXPropertyFilter::Type type) { + property_filters->push_back(AXPropertyFilter(filter, type)); } void AccessibilityTreeFormatterBase::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) {} + std::vector<AXPropertyFilter>* property_filters) {} } // namespace content
diff --git a/content/browser/accessibility/accessibility_tree_formatter_base.h b/content/browser/accessibility/accessibility_tree_formatter_base.h index b5b0fd4..21cbac8 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_base.h +++ b/content/browser/accessibility/accessibility_tree_formatter_base.h
@@ -37,8 +37,7 @@ class CONTENT_EXPORT PropertyNode final { public: // Parses a property node from a string. - static PropertyNode FromPropertyFilter( - const AccessibilityTreeFormatter::PropertyFilter& filter); + static PropertyNode FromPropertyFilter(const ui::AXPropertyFilter& filter); PropertyNode(); PropertyNode(PropertyNode&&); @@ -107,7 +106,7 @@ static std::string DumpAccessibilityTreeFromManager( BrowserAccessibilityManager* ax_mgr, bool internal, - std::vector<PropertyFilter> property_filters); + std::vector<AXPropertyFilter> property_filters); // Populates the given DictionaryValue with the accessibility tree. // The dictionary contains a key/value pair for each attribute of the node, @@ -135,7 +134,7 @@ // AccessibilityTreeFormatter overrides. void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; + std::vector<AXPropertyFilter>* property_filters) override; std::unique_ptr<base::DictionaryValue> FilterAccessibilityTree( const base::DictionaryValue& dict) override; void FormatAccessibilityTree(const base::DictionaryValue& tree_node, @@ -143,7 +142,7 @@ void FormatAccessibilityTreeForTesting(ui::AXPlatformNodeDelegate* root, std::string* contents) override; void SetPropertyFilters( - const std::vector<PropertyFilter>& property_filters) override; + const std::vector<AXPropertyFilter>& property_filters) override; void SetNodeFilters(const std::vector<NodeFilter>& node_filters) override; void set_show_ids(bool show_ids) override; base::FilePath::StringType GetVersionSpecificExpectedFileSuffix() override; @@ -194,9 +193,9 @@ bool WriteAttribute(bool include_by_default, const std::string& attr, std::string* line); - void AddPropertyFilter(std::vector<PropertyFilter>* property_filters, + void AddPropertyFilter(std::vector<AXPropertyFilter>* property_filters, std::string filter, - PropertyFilter::Type type = PropertyFilter::ALLOW); + AXPropertyFilter::Type type = AXPropertyFilter::ALLOW); bool show_ids() { return show_ids_; } private: @@ -210,7 +209,7 @@ // Property filters used when formatting the accessibility tree as text. // Any property which matches a property filter will be skipped. - std::vector<PropertyFilter> property_filters_; + std::vector<AXPropertyFilter> property_filters_; // Node filters used when formatting the accessibility tree as text. // Any node which matches a node wilder will be skipped, along with all its
diff --git a/content/browser/accessibility/accessibility_tree_formatter_base_unittest.cc b/content/browser/accessibility/accessibility_tree_formatter_base_unittest.cc index fb57124..04d9cf83 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_base_unittest.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_base_unittest.cc
@@ -31,8 +31,7 @@ }; PropertyNode Parse(const char* input) { - AccessibilityTreeFormatter::PropertyFilter filter( - input, AccessibilityTreeFormatter::PropertyFilter::ALLOW); + ui::AXPropertyFilter filter(input, ui::AXPropertyFilter::ALLOW); return PropertyNode::FromPropertyFilter(filter); }
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc index 8c69fe8..42beea84 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -160,7 +160,7 @@ AccessibilityTreeFormatterBlink::~AccessibilityTreeFormatterBlink() {} void AccessibilityTreeFormatterBlink::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { // Noisy, perhaps add later: // editable, focus*, horizontal, linked, richlyEditable, vertical // Too flaky: hovered, offscreen @@ -172,7 +172,7 @@ AddPropertyFilter(property_filters, "required"); AddPropertyFilter(property_filters, "select*"); AddPropertyFilter(property_filters, "selectedFromFocus=*", - PropertyFilter::DENY); + AXPropertyFilter::DENY); AddPropertyFilter(property_filters, "visited"); // Other attributes AddPropertyFilter(property_filters, "busy=true"); @@ -189,7 +189,7 @@ AddPropertyFilter(property_filters, "invalidState=*"); AddPropertyFilter(property_filters, "ignored*"); AddPropertyFilter(property_filters, "invalidState=false", - PropertyFilter::DENY); // Don't show false value + AXPropertyFilter::DENY); // Don't show false value AddPropertyFilter(property_filters, "roleDescription=*"); AddPropertyFilter(property_filters, "errormessageId=*"); }
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.h b/content/browser/accessibility/accessibility_tree_formatter_blink.h index 2bc1577b..2dc546e 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_blink.h +++ b/content/browser/accessibility/accessibility_tree_formatter_blink.h
@@ -29,7 +29,7 @@ const AXTreeSelector& selector) override; void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; + std::vector<AXPropertyFilter>* property_filters) override; static std::unique_ptr<AccessibilityTreeFormatter> CreateBlink();
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/content/browser/accessibility/accessibility_tree_formatter_mac.mm index 3c3ecde..5792496 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm +++ b/content/browser/accessibility/accessibility_tree_formatter_mac.mm
@@ -60,7 +60,7 @@ ~AccessibilityTreeFormatterMac() override; void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; + std::vector<AXPropertyFilter>* property_filters) override; std::unique_ptr<base::DictionaryValue> BuildAccessibilityTree( BrowserAccessibility* root) override; @@ -136,7 +136,7 @@ AccessibilityTreeFormatterMac::~AccessibilityTreeFormatterMac() {} void AccessibilityTreeFormatterMac::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { static NSArray* default_attributes = [@[ @"AXAutocompleteValue=*", @"AXDescription=*", @"AXRole=*", @"AXTitle=*", @"AXTitleUIElement=*", @"AXHelp=*", @"AXValue=*"
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm b/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm index ad13e45..1f8ec9b 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm +++ b/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm
@@ -63,11 +63,11 @@ std::unique_ptr<AccessibilityTreeFormatter> formatter = AccessibilityTreeFormatter::Create(); - std::vector<AccessibilityTreeFormatter::PropertyFilter> property_filters; + std::vector<ui::AXPropertyFilter> property_filters; for (const char* filter : filters) { - property_filters.push_back(AccessibilityTreeFormatter::PropertyFilter( - filter, AccessibilityTreeFormatter::PropertyFilter::ALLOW_EMPTY)); + property_filters.push_back( + ui::AXPropertyFilter(filter, ui::AXPropertyFilter::ALLOW_EMPTY)); } formatter->AddDefaultFilters(&property_filters);
diff --git a/content/browser/accessibility/accessibility_tree_formatter_uia_win.cc b/content/browser/accessibility/accessibility_tree_formatter_uia_win.cc index 2a316617..845cd90 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_uia_win.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_uia_win.cc
@@ -276,7 +276,7 @@ AccessibilityTreeFormatterUia::~AccessibilityTreeFormatterUia() {} void AccessibilityTreeFormatterUia::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { // Too noisy: IsKeyboardFocusable, IsDataValidForForm, UIA_ScrollPatternId, // Value.IsReadOnly @@ -321,7 +321,7 @@ // UIA_ValuePatternId AddPropertyFilter(property_filters, "Value.Value=*"); AddPropertyFilter(property_filters, "Value.Value='http*'", - PropertyFilter::DENY); + AXPropertyFilter::DENY); // UIA_WindowPatternId AddPropertyFilter(property_filters, "Window.IsModal=*"); }
diff --git a/content/browser/accessibility/accessibility_tree_formatter_uia_win.h b/content/browser/accessibility/accessibility_tree_formatter_uia_win.h index 7c1f8307..1be2b71 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_uia_win.h +++ b/content/browser/accessibility/accessibility_tree_formatter_uia_win.h
@@ -30,7 +30,7 @@ // AccessibilityTreeFormatterBase: void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; + std::vector<AXPropertyFilter>* property_filters) override; base::FilePath::StringType GetExpectedFileSuffix() override; base::FilePath::StringType GetVersionSpecificExpectedFileSuffix() override; std::unique_ptr<base::DictionaryValue> BuildAccessibilityTree(
diff --git a/content/browser/accessibility/accessibility_tree_formatter_win.cc b/content/browser/accessibility/accessibility_tree_formatter_win.cc index bbd05cf9..788c0b1c 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_win.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_win.cc
@@ -55,7 +55,7 @@ static void SetUpCommandLineForTestPass(base::CommandLine* command_line); void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; + std::vector<AXPropertyFilter>* property_filters) override; private: void RecursiveBuildAccessibilityTree( @@ -126,7 +126,7 @@ } void AccessibilityTreeFormatterWin::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { // Too noisy: HOTTRACKED, LINKED, SELECTABLE, IA2_STATE_EDITABLE, // IA2_STATE_OPAQUE, IA2_STATE_SELECTAbLE_TEXT, // IA2_STATE_SINGLE_LINE, IA2_STATE_VERTICAL. @@ -167,9 +167,9 @@ AddPropertyFilter(property_filters, "IA2_STATE_STALE"); AddPropertyFilter(property_filters, "IA2_STATE_TRANSIENT"); // Reduce flakiness. - AddPropertyFilter(property_filters, "FOCUSED", PropertyFilter::DENY); - AddPropertyFilter(property_filters, "HOTTRACKED", PropertyFilter::DENY); - AddPropertyFilter(property_filters, "OFFSCREEN", PropertyFilter::DENY); + AddPropertyFilter(property_filters, "FOCUSED", AXPropertyFilter::DENY); + AddPropertyFilter(property_filters, "HOTTRACKED", AXPropertyFilter::DENY); + AddPropertyFilter(property_filters, "OFFSCREEN", AXPropertyFilter::DENY); } AccessibilityTreeFormatterWin::AccessibilityTreeFormatterWin() {
diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index 9f06d74..43ba6f18 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc
@@ -144,8 +144,8 @@ AccessibilityTreeFormatter::Create()); DCHECK(formatter); formatter->set_show_ids(true); - formatter->SetPropertyFilters({AccessibilityTreeFormatter::PropertyFilter( - "*", AccessibilityTreeFormatter::PropertyFilter::ALLOW)}); + formatter->SetPropertyFilters( + {ui::AXPropertyFilter("*", ui::AXPropertyFilter::ALLOW)}); std::string str; formatter->FormatAccessibilityTreeForTesting( @@ -4190,9 +4190,9 @@ image_name.Release(); // Cllicking the image will change its name. EXPECT_HRESULT_SUCCEEDED(image_action->doAction(0)); - AccessibilityNotificationWaiter waiter(shell()->web_contents(), - ui::kAXModeComplete, - ax::mojom::Event::kTextChanged); + AccessibilityNotificationWaiter waiter( + shell()->web_contents(), ui::kAXModeComplete, + ui::AXEventGenerator::Event::NAME_CHANGED); waiter.WaitForNotification(); EXPECT_HRESULT_SUCCEEDED( image->get_accName(childid_self, image_name.Receive())); @@ -4430,7 +4430,7 @@ // center of the window. AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED); ASSERT_HRESULT_SUCCEEDED(target->scrollTo(IA2_SCROLL_TYPE_ANYWHERE)); waiter.WaitForNotification(); @@ -4448,7 +4448,7 @@ // center of the window. AccessibilityNotificationWaiter waiter2( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED); ASSERT_HRESULT_SUCCEEDED(target2->scrollTo(IA2_SCROLL_TYPE_ANYWHERE)); waiter2.WaitForNotification(); @@ -4596,7 +4596,7 @@ AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED); EXPECT_HRESULT_SUCCEEDED(scroll_provider->Scroll( ScrollAmount_SmallIncrement, ScrollAmount_NoAmount)); @@ -4609,7 +4609,7 @@ AccessibilityNotificationWaiter waiter2( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED); EXPECT_HRESULT_SUCCEEDED(scroll_provider->SetScrollPercent(0.0, 0.0)); waiter2.WaitForNotification(); @@ -4636,7 +4636,7 @@ AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED); EXPECT_HRESULT_SUCCEEDED(scroll_provider->Scroll( ScrollAmount_NoAmount, ScrollAmount_SmallIncrement)); @@ -4649,7 +4649,7 @@ AccessibilityNotificationWaiter waiter2( shell()->web_contents(), ui::kAXModeComplete, - ax::mojom::Event::kScrollPositionChanged); + ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED); EXPECT_HRESULT_SUCCEEDED(scroll_provider->SetScrollPercent(0.0, 0.0)); waiter2.WaitForNotification();
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc index 955fbdb2..802633f 100644 --- a/content/browser/accessibility/browser_accessibility_android.cc +++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -556,8 +556,9 @@ } base::string16 BrowserAccessibilityAndroid::GetStateDescription() const { - // For multiselectable state, generate a state description - if (IsMultiselectable()) + // For multiselectable state, generate a state description. We do not set a + // state description for pop up/<select> to prevent double utterances. + if (IsMultiselectable() && GetRole() != ax::mojom::Role::kPopUpButton) return GetMultiselectableStateDescription(); // For Toggle buttons, we will append "on"/"off" in the state description. @@ -569,6 +570,14 @@ if (IsCheckable() && !IsReportingCheckable()) return GetCheckboxStateDescription(); + // For list boxes, use state description to communicate child item count. + if (GetRole() == ax::mojom::Role::kListBox) + return GetListBoxStateDescription(); + + // For list box items, use state description to communicate index of item. + if (GetRole() == ax::mojom::Role::kListBoxOption) + return GetListBoxItemStateDescription(); + // Otherwise we will not use state description return base::string16(); } @@ -623,6 +632,44 @@ return content_client->GetLocalizedString(IDS_AX_CHECKBOX_PARTIALLY_CHECKED); } +base::string16 BrowserAccessibilityAndroid::GetListBoxStateDescription() const { + content::ContentClient* content_client = content::GetContentClient(); + + // For empty list boxes, we will return an empty string. + int item_count = GetItemCount(); + if (!item_count) + return base::string16(); + + // Otherwise, we will communicate "x items" as the state description. + return base::ReplaceStringPlaceholders( + content_client->GetLocalizedString(IDS_AX_LIST_BOX_STATE_DESCRIPTION), + base::NumberToString16(item_count), nullptr); +} + +base::string16 BrowserAccessibilityAndroid::GetListBoxItemStateDescription() + const { + content::ContentClient* content_client = content::GetContentClient(); + + BrowserAccessibilityAndroid* parent = + static_cast<BrowserAccessibilityAndroid*>(PlatformGetParent()); + + // If we cannot find the parent collection, escape with an empty string. + if (!parent) + return base::string16(); + + // For list box items, we will communicate "in list, item x of y". We add + // one (1) to our index to offset from counting at 0. + int item_index = GetItemIndex() + 1; + int item_count = parent->GetItemCount(); + + return base::ReplaceStringPlaceholders( + content_client->GetLocalizedString( + IDS_AX_LIST_BOX_ITEM_STATE_DESCRIPTION), + std::vector<base::string16>({base::NumberToString16(item_index), + base::NumberToString16(item_count)}), + nullptr); +} + std::string BrowserAccessibilityAndroid::GetRoleString() const { return ui::ToString(GetRole()); }
diff --git a/content/browser/accessibility/browser_accessibility_android.h b/content/browser/accessibility/browser_accessibility_android.h index 1443d5a..cc6f164 100644 --- a/content/browser/accessibility/browser_accessibility_android.h +++ b/content/browser/accessibility/browser_accessibility_android.h
@@ -95,6 +95,8 @@ base::string16 GetMultiselectableStateDescription() const; base::string16 GetToggleButtonStateDescription() const; base::string16 GetCheckboxStateDescription() const; + base::string16 GetListBoxStateDescription() const; + base::string16 GetListBoxItemStateDescription() const; base::string16 GetRoleDescription() const;
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index 6fc6d9a..1e727c6 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -248,6 +248,7 @@ case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: case ui::AXEventGenerator::Event::EXPANDED: + case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: case ui::AXEventGenerator::Event::ENABLED_CHANGED: case ui::AXEventGenerator::Event::FOCUS_CHANGED: case ui::AXEventGenerator::Event::FLOW_FROM_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc index b95c41e5..b90e88ff 100644 --- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc +++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -225,6 +225,7 @@ case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED: case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED: case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: + case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: case ui::AXEventGenerator::Event::FOCUS_CHANGED: case ui::AXEventGenerator::Event::FLOW_FROM_CHANGED: case ui::AXEventGenerator::Event::FLOW_TO_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm index 84c58c7..0a45c3f 100644 --- a/content/browser/accessibility/browser_accessibility_manager_mac.mm +++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -424,6 +424,7 @@ case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED: case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: + case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: case ui::AXEventGenerator::Event::ENABLED_CHANGED: case ui::AXEventGenerator::Event::FOCUS_CHANGED: case ui::AXEventGenerator::Event::FLOW_FROM_CHANGED:
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc index 2ebf927..81c472d 100644 --- a/content/browser/accessibility/browser_accessibility_manager_win.cc +++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -135,7 +135,10 @@ FireWinAccessibilityEvent(EVENT_SYSTEM_SCROLLINGSTART, node); break; case ax::mojom::Event::kTextChanged: - HandleTextChangedEvent(*node); + // TODO(crbug.com/1049261) Remove when Views are exposed in the AXTree + // which will fire generated text-changed events. + if (!node->IsWebContent()) + HandleTextChangedEvent(*node); break; case ax::mojom::Event::kTextSelectionChanged: HandleTextSelectionChangedEvent(*node); @@ -237,6 +240,9 @@ case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: HandleAriaPropertiesChangedEvent(*node); break; + case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: + HandleTextChangedEvent(*node); + break; case ui::AXEventGenerator::Event::ENABLED_CHANGED: FireUiaPropertyChangedEvent(UIA_IsEnabledPropertyId, node); HandleAriaPropertiesChangedEvent(*node); @@ -323,7 +329,10 @@ HandleAriaPropertiesChangedEvent(*node); break; case ui::AXEventGenerator::Event::NAME_CHANGED: - FireUiaPropertyChangedEvent(UIA_NamePropertyId, node); + if (ui::IsText(node->GetRole())) + HandleTextChangedEvent(*node); + else + FireUiaPropertyChangedEvent(UIA_NamePropertyId, node); // Only fire name changes when the name comes from an attribute, otherwise // name changes are redundant with text removed/inserted events. if (node->GetData().GetNameFrom() != ax::mojom::NameFrom::kContents)
diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc index 5c76edd..4e6f8e4 100644 --- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc +++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" +#include "base/timer/elapsed_timer.h" #include "build/build_config.h" #include "build/chromecast_buildflags.h" #include "content/browser/accessibility/browser_accessibility.h" @@ -39,6 +40,14 @@ #include "ui/base/win/atl_module.h" #endif +#if defined(NDEBUG) && !defined(ADDRESS_SANITIZER) && \ + !defined(LEAK_SANITIZER) && !defined(MEMORY_SANITIZER) && \ + !defined(THREAD_SANITIZER) && !defined(UNDEFINED_SANITIZER) +#define IS_FAST_BUILD +#endif + +constexpr int kDelayForDeferredUpdatesAfterPageLoad = 150; + namespace content { class CrossPlatformAccessibilityBrowserTest : public ContentBrowserTest { @@ -1426,9 +1435,16 @@ } }; +// TODO(http://crbug.com/1137425): Re-enable the test after it gets fixed on +// Android O. +#if defined(OS_ANDROID) +#define MAYBE_ImplicitRootScroller DISABLED_ImplicitRootScroller +#else +#define MAYBE_ImplicitRootScroller ImplicitRootScroller +#endif IN_PROC_BROWSER_TEST_F( CrossPlatformAccessibilityBrowserTestWithImplicitRootScrolling, - ImplicitRootScroller) { + MAYBE_ImplicitRootScroller) { LoadInitialAccessibilityTreeFromHtmlFilePath( "/accessibility/scrolling/implicit-root-scroller.html"); @@ -1456,4 +1472,172 @@ EXPECT_GT(bounds.y(), 0); } +IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, + NonInteractiveChangesAreBatched) { + // Ensure that normal DOM changes are batched together, and do not occur + // more than once every kDelayForDeferredUpdatesAfterPageLoad. + const char url_str[] = + R"HTML(data:text/html, + <!doctype html> + <body><div id=foo></div> + <script> + const startTime = performance.now(); + const fooElem = document.getElementById('foo'); + function addChild() { + const newChild = document.createElement('div'); + newChild.innerHTML = '<button>x</button>'; + fooElem.appendChild(newChild); + if (performance.now() - startTime < 1000) + requestAnimationFrame(addChild); + else + document.close(); + } + addChild(); + </script> + </body></html>)HTML"; + GURL url(url_str); + + // Load the document and wait for it + { + AccessibilityNotificationWaiter waiter(shell()->web_contents(), + ui::kAXModeComplete, + ax::mojom::Event::kLoadComplete); + EXPECT_TRUE(NavigateToURL(shell(), url)); + waiter.WaitForNotification(); + } + base::ElapsedTimer timer; + int num_batches = 0; + + { + AccessibilityNotificationWaiter waiter(shell()->web_contents(), + ui::kAXModeComplete, + ax::mojom::Event::kLayoutComplete); + // Run test for 1 second, counting the number of layout completes. + while (timer.Elapsed().InMilliseconds() < 1000) { + waiter.WaitForNotificationWithTimeout( + base::TimeDelta::FromMilliseconds(1000) - timer.Elapsed()); + ++num_batches; + } + } + + // In practice, num_batches lines up nicely with the top end expected, + // so if kDelayForDeferredUpdatesAfterPageLoad == 150, 6-7 batches are likely. + EXPECT_GT(num_batches, 1); + EXPECT_LE(num_batches, 1000 / kDelayForDeferredUpdatesAfterPageLoad + 1); +} + +#if defined(IS_FAST_BUILD) // Avoid flakiness on slower debug/sanitizer builds. +IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, + DocumentSelectionChangesAreNotBatched) { + // Ensure that document selection changes are not batched, and occur faster + // than once per kDelayForDeferredUpdatesAfterPageLoad. + const char url_str[] = + R"HTML(data:text/html, + <!doctype html> + <body><div id=foo></div> + <script> + const startTime = performance.now(); + const fooElem = document.getElementById('foo'); + function addChild() { + const newChild = document.createElement('div'); + newChild.innerHTML = '<button>x</button>'; + fooElem.appendChild(newChild); + window.getSelection().selectAllChildren(newChild); + if (performance.now() - startTime < 1000) + requestAnimationFrame(addChild); + else + document.close(); + } + addChild(); + </script> + </body></html>)HTML"; + GURL url(url_str); + + // Load the document and wait for it + { + AccessibilityNotificationWaiter waiter(shell()->web_contents(), + ui::kAXModeComplete, + ax::mojom::Event::kLoadComplete); + EXPECT_TRUE(NavigateToURL(shell(), url)); + waiter.WaitForNotification(); + } + + base::ElapsedTimer timer; + int num_batches = 0; + + { + AccessibilityNotificationWaiter waiter(shell()->web_contents(), + ui::kAXModeComplete, + ax::mojom::Event::kLayoutComplete); + // Run test for 1 second, counting the number of layout completes. + while (timer.Elapsed().InMilliseconds() < 1000) { + waiter.WaitForNotificationWithTimeout( + base::TimeDelta::FromMilliseconds(1000) - timer.Elapsed()); + ++num_batches; + } + } + + // In practice, num_batches is about 50 on a fast Linux box. + EXPECT_GT(num_batches, 1000 / kDelayForDeferredUpdatesAfterPageLoad); +} +#endif // IS_FAST_BUILD + +#if defined(IS_FAST_BUILD) // Avoid flakiness on slower debug/sanitizer builds. +IN_PROC_BROWSER_TEST_F(CrossPlatformAccessibilityBrowserTest, + ActiveDescendantChangesAreNotBatched) { + // Ensure that active descendant changes are not batched, and occur faster + // than once per kDelayForDeferredUpdatesAfterPageLoad. + const char url_str[] = + R"HTML(data:text/html, + <!doctype html> + <body><div id=foo tabindex=0 autofocus></div> + <script> + const startTime = performance.now(); + const fooElem = document.getElementById('foo'); + let count = 0; + function addChild() { + const newChild = document.createElement('div'); + ++count; + newChild.innerHTML = '<button id=' + count + '>x</button>'; + fooElem.appendChild(newChild); + fooElem.setAttribute('aria-activedescendant', count); + if (performance.now() - startTime < 1000) + requestAnimationFrame(addChild); + else + document.close(); + } + addChild(); + </script> + </body></html>)HTML"; + GURL url(url_str); + + // Load the document and wait for it + { + AccessibilityNotificationWaiter waiter(shell()->web_contents(), + ui::kAXModeComplete, + ax::mojom::Event::kLoadComplete); + EXPECT_TRUE(NavigateToURL(shell(), url)); + waiter.WaitForNotification(); + } + + base::ElapsedTimer timer; + int num_batches = 0; + + { + AccessibilityNotificationWaiter waiter( + shell()->web_contents(), ui::kAXModeComplete, + ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED); + // Run test for 1 second, counting the number of active descendant changes. + while (timer.Elapsed().InMilliseconds() < 1000) { + waiter.WaitForNotificationWithTimeout( + base::TimeDelta::FromMilliseconds(1000) - timer.Elapsed()); + ++num_batches; + } + } + + // In practice, num_batches is about 50 on a fast Linux box. + EXPECT_GT(num_batches, 1000 / kDelayForDeferredUpdatesAfterPageLoad); +} +#endif // IS_FAST_BUILD + } // namespace content
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.cc b/content/browser/accessibility/dump_accessibility_browsertest_base.cc index 663d5ae..7f9146d4 100644 --- a/content/browser/accessibility/dump_accessibility_browsertest_base.cc +++ b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
@@ -76,7 +76,7 @@ } // namespace -typedef AccessibilityTreeFormatter::PropertyFilter PropertyFilter; +using ui::AXPropertyFilter; typedef AccessibilityTreeFormatter::NodeFilter NodeFilter; DumpAccessibilityTestBase::DumpAccessibilityTestBase() @@ -140,8 +140,8 @@ std::string DumpAccessibilityTestBase::DumpUnfilteredAccessibilityTreeAsString() { std::unique_ptr<AccessibilityTreeFormatter> formatter(formatter_factory_()); - std::vector<PropertyFilter> property_filters; - property_filters.emplace_back("*", PropertyFilter::ALLOW); + std::vector<AXPropertyFilter> property_filters; + property_filters.emplace_back("*", AXPropertyFilter::ALLOW); formatter->SetPropertyFilters(property_filters); formatter->set_show_ids(true); std::string ax_tree_dump; @@ -169,13 +169,15 @@ const std::string& until_str = formatter_->GetRunUntilEventString(); const std::string& default_action_on_str = "@DEFAULT-ACTION-ON:"; if (base::StartsWith(line, allow_empty_str, base::CompareCase::SENSITIVE)) { - property_filters_.emplace_back( - line.substr(allow_empty_str.size()), PropertyFilter::ALLOW_EMPTY); + property_filters_.emplace_back(line.substr(allow_empty_str.size()), + AXPropertyFilter::ALLOW_EMPTY); } else if (base::StartsWith(line, allow_str, base::CompareCase::SENSITIVE)) { - property_filters_.emplace_back(line.substr(allow_str.size()), PropertyFilter::ALLOW); + property_filters_.emplace_back(line.substr(allow_str.size()), + AXPropertyFilter::ALLOW); } else if (base::StartsWith(line, deny_str, base::CompareCase::SENSITIVE)) { - property_filters_.emplace_back(line.substr(deny_str.size()), PropertyFilter::DENY); + property_filters_.emplace_back(line.substr(deny_str.size()), + AXPropertyFilter::DENY); } else if (base::StartsWith(line, deny_node_str, base::CompareCase::SENSITIVE)) { const auto& node_filter = line.substr(deny_node_str.size());
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.h b/content/browser/accessibility/dump_accessibility_browsertest_base.h index bd6c50a..f6193e6 100644 --- a/content/browser/accessibility/dump_accessibility_browsertest_base.h +++ b/content/browser/accessibility/dump_accessibility_browsertest_base.h
@@ -58,8 +58,7 @@ // Add the default filters that are applied to all tests. virtual void AddDefaultFilters( - std::vector<AccessibilityTreeFormatter::PropertyFilter>* - property_filters) = 0; + std::vector<ui::AXPropertyFilter>* property_filters) = 0; // This gets called if the diff didn't match; the test can print // additional useful info. @@ -117,7 +116,7 @@ // The default property filters plus the property filters loaded from the test // file. - std::vector<AccessibilityTreeFormatter::PropertyFilter> property_filters_; + std::vector<ui::AXPropertyFilter> property_filters_; // The node filters loaded from the test file. std::vector<AccessibilityTreeFormatter::NodeFilter> node_filters_;
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc index 41be748..9154c28 100644 --- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -35,7 +35,7 @@ namespace content { -typedef AccessibilityTreeFormatter::PropertyFilter PropertyFilter; +using ui::AXPropertyFilter; // See content/test/data/accessibility/readme.md for an overview. // @@ -72,16 +72,16 @@ class DumpAccessibilityEventsTest : public DumpAccessibilityTestBase { public: void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override { + std::vector<AXPropertyFilter>* property_filters) override { // Suppress spurious focus events on the document object. - property_filters->push_back( - PropertyFilter("EVENT_OBJECT_FOCUS*DOCUMENT*", PropertyFilter::DENY)); - property_filters->push_back(PropertyFilter( - "AutomationFocusChanged*document*", PropertyFilter::DENY)); + property_filters->push_back(AXPropertyFilter("EVENT_OBJECT_FOCUS*DOCUMENT*", + AXPropertyFilter::DENY)); + property_filters->push_back(AXPropertyFilter( + "AutomationFocusChanged*document*", AXPropertyFilter::DENY)); // Implementing IRawElementProviderAdviseEvents causes Win7 to fire // spurious focus events (regardless of what the implementation does). - property_filters->push_back(PropertyFilter( - "AutomationFocusChanged on role=region", PropertyFilter::DENY)); + property_filters->push_back(AXPropertyFilter( + "AutomationFocusChanged on role=region", AXPropertyFilter::DENY)); } std::vector<std::string> Dump(std::vector<std::string>& run_until) override;
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 3e5d9a7..c646253 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -42,7 +42,7 @@ namespace content { -typedef AccessibilityTreeFormatter::PropertyFilter PropertyFilter; +using ui::AXPropertyFilter; // See content/test/data/accessibility/readme.md for an overview. // @@ -59,11 +59,12 @@ class DumpAccessibilityTreeTest : public DumpAccessibilityTestBase { public: void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) override; - void AddPropertyFilter(std::vector<PropertyFilter>* property_filters, - const std::string& filter, - PropertyFilter::Type type = PropertyFilter::ALLOW) { - property_filters->push_back(PropertyFilter(filter, type)); + std::vector<AXPropertyFilter>* property_filters) override; + void AddPropertyFilter( + std::vector<AXPropertyFilter>* property_filters, + const std::string& filter, + AXPropertyFilter::Type type = AXPropertyFilter::ALLOW) { + property_filters->push_back(AXPropertyFilter(filter, type)); } void SetUpCommandLine(base::CommandLine* command_line) override { @@ -203,26 +204,27 @@ }; void DumpAccessibilityTreeTest::AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) { + std::vector<AXPropertyFilter>* property_filters) { AddPropertyFilter(property_filters, "value='*'"); // The value attribute on the document object contains the URL of the current // page which will not be the same every time the test is run. - AddPropertyFilter(property_filters, "value='http*'", PropertyFilter::DENY); + AddPropertyFilter(property_filters, "value='http*'", AXPropertyFilter::DENY); // Object attributes.value - AddPropertyFilter(property_filters, "layout-guess:*", PropertyFilter::ALLOW); + AddPropertyFilter(property_filters, "layout-guess:*", + AXPropertyFilter::ALLOW); AddPropertyFilter(property_filters, "select*"); AddPropertyFilter(property_filters, "selectedFromFocus=*", - PropertyFilter::DENY); + AXPropertyFilter::DENY); AddPropertyFilter(property_filters, "descript*"); AddPropertyFilter(property_filters, "check*"); AddPropertyFilter(property_filters, "horizontal"); AddPropertyFilter(property_filters, "multiselectable"); // Deny most empty values - AddPropertyFilter(property_filters, "*=''", PropertyFilter::DENY); + AddPropertyFilter(property_filters, "*=''", AXPropertyFilter::DENY); // After denying empty values, because we want to allow name='' - AddPropertyFilter(property_filters, "name=*", PropertyFilter::ALLOW_EMPTY); + AddPropertyFilter(property_filters, "name=*", AXPropertyFilter::ALLOW_EMPTY); } // Parameterize the tests so that each test-pass is run independently. @@ -362,8 +364,10 @@ RunHtmlTest(FILE_PATH_LITERAL("actions.html")); } +// crbug.com/1135774. Flaky due to missing invalidation when adding or removing +// a mouse button listener. IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, - AccessibilityAddClickListener) { + DISABLED_AccessibilityAddClickListener) { RunHtmlTest(FILE_PATH_LITERAL("add-click-listener.html")); }
diff --git a/content/browser/accessibility/hit_testing_browsertest.cc b/content/browser/accessibility/hit_testing_browsertest.cc index d54b7e29..f5a26077 100644 --- a/content/browser/accessibility/hit_testing_browsertest.cc +++ b/content/browser/accessibility/hit_testing_browsertest.cc
@@ -268,9 +268,9 @@ AccessibilityTreeFormatterBlink::CreateBlink(); accessibility_tree_formatter->set_show_ids(true); accessibility_tree_formatter->SetPropertyFilters( - {{"name=*", AccessibilityTreeFormatter::PropertyFilter::ALLOW}, - {"location=*", AccessibilityTreeFormatter::PropertyFilter::ALLOW}, - {"size=*", AccessibilityTreeFormatter::PropertyFilter::ALLOW}}); + {{"name=*", ui::AXPropertyFilter::ALLOW}, + {"location=*", ui::AXPropertyFilter::ALLOW}, + {"size=*", ui::AXPropertyFilter::ALLOW}}); std::string accessibility_tree; accessibility_tree_formatter->FormatAccessibilityTreeForTesting( GetRootAndAssertNonNull(), &accessibility_tree);
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index b99a2a808..41ae7c8e 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -387,12 +387,12 @@ class CaptureScreenshotTest : public DevToolsProtocolTest { protected: enum ScreenshotEncoding { ENCODING_PNG, ENCODING_JPEG }; - void CaptureScreenshotAndCompareTo(const SkBitmap& expected_bitmap, - ScreenshotEncoding encoding, - bool from_surface, - float device_scale_factor = 0, - const gfx::RectF& clip = gfx::RectF(), - float clip_scale = 0) { + + std::unique_ptr<SkBitmap> CaptureScreenshot( + ScreenshotEncoding encoding, + bool from_surface, + const gfx::RectF& clip = gfx::RectF(), + float clip_scale = 0) { std::unique_ptr<base::DictionaryValue> params(new base::DictionaryValue()); params->SetString("format", encoding == ENCODING_PNG ? "png" : "jpeg"); params->SetInteger("quality", 100); @@ -419,6 +419,17 @@ result_bitmap = DecodeJPEG(base64); } EXPECT_TRUE(result_bitmap); + return result_bitmap; + } + + void CaptureScreenshotAndCompareTo(const SkBitmap& expected_bitmap, + ScreenshotEncoding encoding, + bool from_surface, + float device_scale_factor = 0, + const gfx::RectF& clip = gfx::RectF(), + float clip_scale = 0) { + std::unique_ptr<SkBitmap> result_bitmap = + CaptureScreenshot(encoding, from_surface, clip, clip_scale); gfx::Rect matching_mask(gfx::SkIRectToRect(expected_bitmap.bounds())); #if defined(OS_MAC) @@ -559,6 +570,54 @@ CaptureScreenshotAndCompareTo(expected_bitmap, ENCODING_JPEG, false); } +class NoGPUCaptureScreenshotTest : public CaptureScreenshotTest { + void SetUpCommandLine(base::CommandLine* command_line) override { + CaptureScreenshotTest::SetUpCommandLine(command_line); + command_line->AppendSwitch(switches::kDisableGpuCompositing); + } +}; + +// Tests that large screenshots are composited fine with software compositor. +// Regression test for https://crbug.com/1137291. +IN_PROC_BROWSER_TEST_F(NoGPUCaptureScreenshotTest, DISABLED_LargeScreenshot) { + // This test fails consistently on low-end Android devices. + // See crbug.com/653637. + // TODO(eseckler): Reenable with error limit if necessary. + if (base::SysInfo::IsLowEndDevice()) + return; + + shell()->LoadURL( + GURL("data:text/html," + "<style>body,html { padding: 0; margin: 0; }</style>" + "<div style='width: 1250px; height: 8440px; " + " background: linear-gradient(red, blue)'></div>")); + EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); + Attach(); + + auto params = std::make_unique<base::DictionaryValue>(); + params->SetInteger("width", 1280); + params->SetInteger("height", 8440); + params->SetDouble("deviceScaleFactor", 1); + params->SetBoolean("mobile", false); + SendCommand("Emulation.setDeviceMetricsOverride", std::move(params)); + auto bitmap = + CaptureScreenshot(ENCODING_PNG, true, gfx::RectF(0, 0, 1280, 8440), 1); + SendCommand("Emulation.clearDeviceMetricsOverride", nullptr); + + EXPECT_EQ(1280, bitmap->width()); + EXPECT_EQ(8440, bitmap->height()); + + // Top-left is red-ish. + SkColor top_left = bitmap->getColor(0, 0); + EXPECT_GT(static_cast<int>(SkColorGetR(top_left)), 128); + EXPECT_LT(static_cast<int>(SkColorGetB(top_left)), 128); + + // Bottom-left is blue-ish. + SkColor bottom_left = bitmap->getColor(0, 8339); + EXPECT_LT(static_cast<int>(SkColorGetR(bottom_left)), 128); + EXPECT_GT(static_cast<int>(SkColorGetB(bottom_left)), 128); +} + // Setting frame size (through RWHV) is not supported on Android. // This test seems to be very flaky on windows: https://crbug.com/801173 #if defined(OS_ANDROID) || defined(OS_LINUX) || defined(OS_CHROMEOS) || \
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc index 309ca1f..505fd95 100644 --- a/content/browser/media/media_web_contents_observer.cc +++ b/content/browser/media/media_web_contents_observer.cc
@@ -250,6 +250,7 @@ OnAudioOutputSinkChangingDisabled) IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnBufferUnderflow, OnBufferUnderflow) + IPC_MESSAGE_HANDLER(MediaPlayerDelegateHostMsg_OnSeek, OnSeek) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; @@ -453,6 +454,12 @@ web_contents_impl()->MediaBufferUnderflow(id); } +void MediaWebContentsObserver::OnSeek(RenderFrameHost* render_frame_host, + int delegate_id) { + const MediaPlayerId id(render_frame_host, delegate_id); + web_contents_impl()->MediaPlayerSeek(id); +} + device::mojom::WakeLock* MediaWebContentsObserver::GetAudioWakeLock() { // Here is a lazy binding, and will not reconnect after connection error. if (!audio_wake_lock_) {
diff --git a/content/browser/media/media_web_contents_observer.h b/content/browser/media/media_web_contents_observer.h index 6365fe7..852f8f4 100644 --- a/content/browser/media/media_web_contents_observer.h +++ b/content/browser/media/media_web_contents_observer.h
@@ -160,6 +160,7 @@ void OnAudioOutputSinkChangingDisabled(RenderFrameHost* render_frame_host, int delegate_id); void OnBufferUnderflow(RenderFrameHost* render_frame_host, int delegate_id); + void OnSeek(RenderFrameHost* render_frame_host, int delegate_id); device::mojom::WakeLock* GetAudioWakeLock();
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index 325cb076..5ca119e 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -15810,13 +15810,13 @@ blink::ScreenInfo screen_info; a_node->render_manager()->GetRenderWidgetHostView()->GetScreenInfo( &screen_info); - int expected_y = roundf(screen_info.device_scale_factor * 5.0); - EXPECT_EQ( - b1_to_c1_message_filter->GetIntersectionState().main_frame_scroll_offset, - gfx::Point(0, expected_y)); - EXPECT_EQ( - b2_to_c2_message_filter->GetIntersectionState().main_frame_scroll_offset, - gfx::Point(0, expected_y)); + float expected_y = screen_info.device_scale_factor * 5.0; + EXPECT_NEAR(b1_to_c1_message_filter->GetIntersectionState() + .main_frame_scroll_offset.y(), + expected_y, 1.f); + EXPECT_NEAR(b2_to_c2_message_filter->GetIntersectionState() + .main_frame_scroll_offset.y(), + expected_y, 1.f); } class SitePerProcessCompositorViewportBrowserTest
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 5fa3aba..f1dbbf9 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4113,7 +4113,7 @@ std::string WebContentsImpl::DumpAccessibilityTree( bool internal, - std::vector<AccessibilityTreeFormatter::PropertyFilter> property_filters) { + std::vector<ui::AXPropertyFilter> property_filters) { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::DumpAccessibilityTree"); auto* ax_mgr = GetOrCreateRootBrowserAccessibilityManager(); DCHECK(ax_mgr); @@ -8560,6 +8560,12 @@ }); } +void WebContentsImpl::MediaPlayerSeek(const MediaPlayerId& id) { + OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::MediaPlayerSeek"); + observers_.ForEachObserver( + [&](WebContentsObserver* observer) { observer->MediaPlayerSeek(id); }); +} + void WebContentsImpl::MediaEffectivelyFullscreenChanged(bool is_fullscreen) { OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::MediaEffectivelyFullscreenChanged",
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index a7e60496..1123f814 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -616,8 +616,7 @@ const std::vector<AXLocationChangeNotificationDetails>& details) override; std::string DumpAccessibilityTree( bool internal, - std::vector<content::AccessibilityTreeFormatter::PropertyFilter> - property_filters) override; + std::vector<ui::AXPropertyFilter> property_filters) override; void RecordAccessibilityEvents( bool start_recording, base::Optional<AccessibilityEventCallback> callback) override; @@ -1038,9 +1037,7 @@ bool SetDeviceEmulationSize(const gfx::Size& new_size); void ClearDeviceEmulationSize(); - AudioStreamMonitor* audio_stream_monitor() { - return &audio_stream_monitor_; - } + AudioStreamMonitor* audio_stream_monitor() { return &audio_stream_monitor_; } ForwardingAudioStreamFactory* GetAudioStreamFactory(); @@ -1062,6 +1059,9 @@ // WebContentsObserver function stubs for more details. void MediaBufferUnderflow(const MediaPlayerId& id); + // Called by MediaWebContentsObserver when player seek event occurs. + void MediaPlayerSeek(const MediaPlayerId& id); + int GetCurrentlyPlayingVideoCount() override; base::Optional<gfx::Size> GetFullscreenVideoSize() override;
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index bb458ee..66e0014 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -153,7 +153,7 @@ DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura); }; -#if defined(USE_X11) || defined(OS_WIN) +#if defined(OS_LINUX) || defined(OS_WIN) // Fill out the OSExchangeData with a file contents, synthesizing a name if // necessary. void PrepareDragForFileContents(const DropData& drop_data, @@ -239,15 +239,11 @@ if (!drop_data.download_metadata.empty()) PrepareDragForDownload(drop_data, provider, web_contents); #endif -#if defined(USE_X11) || defined(OS_WIN) - bool should_check_file_contents = true; -#if defined(USE_X11) - should_check_file_contents = !features::IsUsingOzonePlatform(); -#endif +#if defined(OS_LINUX) || defined(OS_WIN) // We set the file contents before the URL because the URL also sets file // contents (to a .URL shortcut). We want to prefer file content data over // a shortcut so we add it first. - if (should_check_file_contents && !drop_data.file_contents.empty()) + if (!drop_data.file_contents.empty()) PrepareDragForFileContents(drop_data, provider); #endif // Call SetString() before SetURL() when we actually have a custom string.
diff --git a/content/browser/web_contents/web_contents_view_aura_unittest.cc b/content/browser/web_contents/web_contents_view_aura_unittest.cc index e505d60..70682e22 100644 --- a/content/browser/web_contents/web_contents_view_aura_unittest.cc +++ b/content/browser/web_contents/web_contents_view_aura_unittest.cc
@@ -35,17 +35,13 @@ #include "ui/base/dragdrop/os_exchange_data_provider_win.h" #endif -#if defined(USE_X11) -#include "ui/base/ui_base_features.h" -#endif - namespace content { namespace { constexpr gfx::Rect kBounds = gfx::Rect(0, 0, 20, 20); constexpr gfx::PointF kClientPt = {5, 10}; -#if !defined(USE_OZONE) || defined(OS_WIN) || defined(USE_X11) +#if defined(OS_LINUX) || defined(OS_WIN) constexpr gfx::PointF kScreenPt = {17, 3}; #endif @@ -204,20 +200,7 @@ EXPECT_EQ(web_contents()->GetVisibility(), Visibility::VISIBLE); } -#if !defined(USE_OZONE) && !defined(OS_CHROMEOS) -// TODO(crbug.com/1070483): Enable this test on Ozone. -// -// The expectations for the X11 implementation differ from other ones because -// the GetString() method of the X11 data provider returns an empty string -// if file data is also present, which is not the same for other -// implementations. (See the code under USE_X11 in the body of the test.) -// -// Ozone spawns the platform at run time, which would require this test to query -// Ozone about the current platform, which would pull the Ozone platform as the -// dependency here. -// -// Another solution could be fixing the X11 platform implementation so it -// would behave the same way as other Ozone platforms do. +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_WIN) TEST_F(WebContentsViewAuraTest, DragDropFiles) { WebContentsViewAura* view = GetView(); auto data = std::make_unique<ui::OSExchangeData>(); @@ -253,17 +236,14 @@ view->OnDragEntered(event); ASSERT_NE(nullptr, view->current_drop_data_); -#if defined(USE_X11) - // By design, OSExchangeDataProviderX11::GetString returns an empty string - // if file data is also present. - if (!features::IsUsingOzonePlatform()) { - EXPECT_TRUE(!view->current_drop_data_->text || - view->current_drop_data_->text->empty()); - } else +#if defined(OS_LINUX) + // By design, Linux implementations return an empty string if file data + // is also present. + EXPECT_TRUE(!view->current_drop_data_->text || + view->current_drop_data_->text->empty()); +#else + EXPECT_EQ(string_data, view->current_drop_data_->text); #endif - { - EXPECT_EQ(string_data, view->current_drop_data_->text); - } std::vector<ui::FileInfo> retrieved_file_infos = view->current_drop_data_->filenames; @@ -287,17 +267,14 @@ CheckDropData(view); -#if defined(USE_X11) - // By design, OSExchangeDataProviderX11::GetString returns an empty string - // if file data is also present. - if (!features::IsUsingOzonePlatform()) { - EXPECT_TRUE(!drop_complete_data_->drop_data.text || - drop_complete_data_->drop_data.text->empty()); - } else +#if defined(OS_LINUX) + // By design, Linux implementations returns an empty string if file data + // is also present. + EXPECT_TRUE(!drop_complete_data_->drop_data.text || + drop_complete_data_->drop_data.text->empty()); +#else + EXPECT_EQ(string_data, drop_complete_data_->drop_data.text); #endif - { - EXPECT_EQ(string_data, drop_complete_data_->drop_data.text); - } retrieved_file_infos = drop_complete_data_->drop_data.filenames; ASSERT_EQ(test_file_infos.size(), retrieved_file_infos.size()); @@ -308,15 +285,10 @@ } } -#endif // !defined(USE_OZONE) && !defined(OS_CHROMEOS) +#endif // defined(OS_LINUX) && !defined(OS_CHROMEOS) || defined(OS_WIN) -#if defined(OS_WIN) || defined(USE_X11) +#if defined(OS_LINUX) || defined(OS_WIN) TEST_F(WebContentsViewAuraTest, DragDropFilesOriginateFromRenderer) { -#if defined(USE_X11) - // TODO(https://crbug.com/1109695): enable for Ozone/Linux. - if (features::IsUsingOzonePlatform()) - return; -#endif WebContentsViewAura* view = GetView(); auto data = std::make_unique<ui::OSExchangeData>(); @@ -355,9 +327,9 @@ view->OnDragEntered(event); ASSERT_NE(nullptr, view->current_drop_data_); -#if defined(USE_X11) - // By design, OSExchangeDataProviderX11::GetString returns an empty string - // if file data is also present. +#if defined(OS_LINUX) + // By design, Linux implementations return an empty string if file data + // is also present. EXPECT_TRUE(!view->current_drop_data_->text || view->current_drop_data_->text->empty()); #else @@ -379,9 +351,9 @@ CheckDropData(view); -#if defined(USE_X11) - // By design, OSExchangeDataProviderX11::GetString returns an empty string - // if file data is also present. +#if defined(OS_LINUX) + // By design, Linux implementations returns an empty string if file data is + // also present. EXPECT_TRUE(!drop_complete_data_->drop_data.text || drop_complete_data_->drop_data.text->empty()); #else
diff --git a/content/browser/xr/service/browser_xr_runtime_impl.cc b/content/browser/xr/service/browser_xr_runtime_impl.cc index 808c420..2f18a475 100644 --- a/content/browser/xr/service/browser_xr_runtime_impl.cc +++ b/content/browser/xr/service/browser_xr_runtime_impl.cc
@@ -338,6 +338,10 @@ NOTREACHED(); } +bool BrowserXRRuntimeImpl::SupportsArBlendMode() { + return device_data_->is_ar_blend_mode_supported; +} + void BrowserXRRuntimeImpl::OnDisplayInfoChanged( device::mojom::VRDisplayInfoPtr vr_device_info) { bool had_display_info = !!display_info_;
diff --git a/content/browser/xr/service/browser_xr_runtime_impl.h b/content/browser/xr/service/browser_xr_runtime_impl.h index 46e9e9f5..dcdcf2c 100644 --- a/content/browser/xr/service/browser_xr_runtime_impl.h +++ b/content/browser/xr/service/browser_xr_runtime_impl.h
@@ -48,6 +48,7 @@ bool SupportsCustomIPD() const; bool SupportsNonEmulatedHeight() const; + bool SupportsArBlendMode(); device::mojom::XRRuntime* GetRuntime() { return runtime_.get(); }
diff --git a/content/browser/xr/service/xr_runtime_manager_impl.cc b/content/browser/xr/service/xr_runtime_manager_impl.cc index 9182c46f..5863c158 100644 --- a/content/browser/xr/service/xr_runtime_manager_impl.cc +++ b/content/browser/xr/service/xr_runtime_manager_impl.cc
@@ -166,7 +166,7 @@ BrowserXRRuntimeImpl* runtime = nullptr; switch (options->mode) { case device::mojom::XRSessionMode::kImmersiveAr: - runtime = GetRuntime(device::mojom::XRDeviceId::ARCORE_DEVICE_ID); + runtime = GetImmersiveArRuntime(); break; case device::mojom::XRSessionMode::kImmersiveVr: runtime = GetImmersiveVrRuntime(); @@ -214,9 +214,20 @@ } BrowserXRRuntimeImpl* XRRuntimeManagerImpl::GetImmersiveArRuntime() { - device::mojom::XRSessionOptions options = {}; - options.mode = device::mojom::XRSessionMode::kImmersiveAr; - return GetRuntimeForOptions(&options); +#if defined(OS_ANDROID) + auto* arcore_runtime = + GetRuntime(device::mojom::XRDeviceId::ARCORE_DEVICE_ID); + if (arcore_runtime && arcore_runtime->SupportsArBlendMode()) + return arcore_runtime; +#endif + +#if BUILDFLAG(ENABLE_OPENXR) + auto* openxr = GetRuntime(device::mojom::XRDeviceId::OPENXR_DEVICE_ID); + if (openxr && openxr->SupportsArBlendMode()) + return openxr; +#endif + + return nullptr; } device::mojom::VRDisplayInfoPtr XRRuntimeManagerImpl::GetCurrentVRDisplayInfo(
diff --git a/content/common/media/media_player_delegate_messages.h b/content/common/media/media_player_delegate_messages.h index ab24603..f372c8b 100644 --- a/content/common/media/media_player_delegate_messages.h +++ b/content/common/media/media_player_delegate_messages.h
@@ -135,4 +135,7 @@ IPC_MESSAGE_ROUTED1(MediaPlayerDelegateHostMsg_OnBufferUnderflow, int /* delegate_id, distinguishes instances */) +IPC_MESSAGE_ROUTED1(MediaPlayerDelegateHostMsg_OnSeek, + int /* delegate_id, distinguishes instances */) + #endif // CONTENT_COMMON_MEDIA_MEDIA_PLAYER_DELEGATE_MESSAGES_H_
diff --git a/content/public/browser/accessibility_tree_formatter.h b/content/public/browser/accessibility_tree_formatter.h index b772b16..cc5470c 100644 --- a/content/public/browser/accessibility_tree_formatter.h +++ b/content/public/browser/accessibility_tree_formatter.h
@@ -57,33 +57,7 @@ : public AccessibilityTestExpectationsLocator { public: using AXTreeSelector = ui::AXTreeSelector; - - // A single property filter specification. Represents a parsed string of the - // filter_str;match_str format, where `filter_str` has - // :line_num_0,...:line_num_N format, `match_str` has format of - // property_str=value_str. For example, :1,:3;AXDOMClassList=*. - // - // Longer version: `filter_str` is a comma separated list of the line - // indexes from the output accessible tree, and serves to narrow down the - // property calls to the accessible object placed on those line indexes only; - // `match_str` is used to match properties by property name and value. - // For example, :1,:3;AXDOMClassList=* - // will query a AXDOMClassList attribute on accessible objects placed at 1st - // and 3rd lines in the output accessible tree. - // Also see - // DumpAccessibilityTestBase::ParseHtmlForExtraDirectives() for more - // information. - struct CONTENT_EXPORT PropertyFilter { - enum Type { ALLOW, ALLOW_EMPTY, DENY }; - - std::string match_str; - std::string property_str; - std::string filter_str; - Type type; - - PropertyFilter(const std::string& str, Type type); - PropertyFilter(const PropertyFilter&); - }; + using AXPropertyFilter = ui::AXPropertyFilter; // A single node filter specification which will exclude any node where the // value of the named property matches the given pattern. @@ -118,10 +92,10 @@ static TestPass GetTestPass(size_t index); virtual void AddDefaultFilters( - std::vector<PropertyFilter>* property_filters) = 0; + std::vector<AXPropertyFilter>* property_filters) = 0; static bool MatchesPropertyFilters( - const std::vector<PropertyFilter>& property_filters, + const std::vector<AXPropertyFilter>& property_filters, const std::string& text, bool default_result); @@ -156,7 +130,7 @@ // Set regular expression filters that apply to each property of every node // before it's output. virtual void SetPropertyFilters( - const std::vector<PropertyFilter>& property_filters) = 0; + const std::vector<AXPropertyFilter>& property_filters) = 0; // Set regular expression filters that apply to every node before output. virtual void SetNodeFilters(const std::vector<NodeFilter>& node_filters) = 0;
diff --git a/content/public/browser/global_routing_id.h b/content/public/browser/global_routing_id.h index c7e5573..9b93ece8 100644 --- a/content/public/browser/global_routing_id.h +++ b/content/public/browser/global_routing_id.h
@@ -8,6 +8,8 @@ #include <tuple> #include "base/hash/hash.h" +#include "base/i18n/number_formatting.h" +#include "base/strings/stringprintf.h" #include "ipc/ipc_message.h" namespace content { @@ -38,6 +40,11 @@ } }; +inline std::ostream& operator<<(std::ostream& os, const GlobalRoutingID& id) { + os << "GlobalRoutingID(" << id.child_id << ", " << id.route_id << ")"; + return os; +} + // Same as GlobalRoutingID except the route_id must be a RenderFrameHost routing // id. struct GlobalFrameRoutingId {
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index a0eb1a0..416cfe39 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h
@@ -432,8 +432,7 @@ virtual std::string DumpAccessibilityTree( bool internal, - std::vector<content::AccessibilityTreeFormatter::PropertyFilter> - property_filters) = 0; + std::vector<ui::AXPropertyFilter> property_filters) = 0; // A callback that takes a string which contains accessibility event // information.
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index ba438df..41c4e51 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h
@@ -582,6 +582,7 @@ virtual void MediaPictureInPictureChanged(bool is_picture_in_picture) {} virtual void MediaMutedStatusChanged(const MediaPlayerId& id, bool muted) {} virtual void MediaBufferUnderflow(const MediaPlayerId& id) {} + virtual void MediaPlayerSeek(const MediaPlayerId& id) {} // Invoked when the renderer process changes the page scale factor. virtual void OnPageScaleFactorChanged(float page_scale_factor) {}
diff --git a/content/public/test/dump_accessibility_test_helper.cc b/content/public/test/dump_accessibility_test_helper.cc index 7fb935c9..e4aa90a 100644 --- a/content/public/test/dump_accessibility_test_helper.cc +++ b/content/public/test/dump_accessibility_test_helper.cc
@@ -11,6 +11,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_restrictions.h" +#include "build/build_config.h" #include "content/public/browser/accessibility_tree_formatter.h" #include "content/public/common/content_switches.h" @@ -136,6 +137,10 @@ base::JoinString(actual_lines, "\n") + "\n"; CHECK(base::WriteFile(expected_file, actual_contents_for_output)); LOG(INFO) << "Wrote expectations to: " << expected_file.LossyDisplayName(); +#if defined(OS_ANDROID) + LOG(INFO) << "Generated expectations written to file on test device."; + LOG(INFO) << "To fetch, run: adb pull " << expected_file.LossyDisplayName(); +#endif } return !is_different;
diff --git a/content/renderer/accessibility/ax_image_annotator.cc b/content/renderer/accessibility/ax_image_annotator.cc index b94609f..d87a8d20 100644 --- a/content/renderer/accessibility/ax_image_annotator.cc +++ b/content/renderer/accessibility/ax_image_annotator.cc
@@ -277,6 +277,11 @@ if (!base::Contains(image_annotations_, image.AxID())) return; + if (!blink::WebAXObject::MaybeUpdateLayoutAndCheckValidity( + image.GetDocument())) { + return; + } + if (image.IsDetached()) { image_annotations_.at(image.AxID()) .set_status(ax::mojom::ImageAnnotationStatus::kIneligibleForAnnotation);
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc index 2b28908..0a644cb 100644 --- a/content/renderer/accessibility/render_accessibility_impl.cc +++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -60,11 +60,6 @@ namespace { -// The amount of time, in milliseconds, to wait before sending accessibility -// events that are deferred rather than being sent right away. As one -// example this is used during initial page load. -constexpr int kDelayForDeferredEvents = 350; - // The minimum amount of time in milliseconds that should be spent // in serializing code in order to report the elapsed time as a URL-keyed // metric. @@ -230,10 +225,7 @@ settings->SetAccessibilityIncludeSvgGElement(true); #endif - if (render_frame_->IsMainFrame()) - event_schedule_mode_ = EventScheduleMode::kDeferEvents; - else - event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately; + event_schedule_mode_ = EventScheduleMode::kDeferEvents; // Optionally disable AXMenuList, which makes the internal pop-up menu // UI for a select element directly accessible. Disable by default on @@ -572,6 +564,10 @@ if (subtree) serializer_->InvalidateSubtree(obj); + // If the event occurred on the focused object, process immediately. + if (obj.IsFocused()) + event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately; + ScheduleSendPendingAccessibilityEvents(); } @@ -611,14 +607,91 @@ } } pending_events_.push_back(event); - - // Once we get the first load, we should no longer defer events. - if (event.event_type == ax::mojom::Event::kLoadComplete) + if (IsImmediateProcessingRequiredForEvent(event)) event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately; ScheduleSendPendingAccessibilityEvents(); } +bool RenderAccessibilityImpl::IsImmediateProcessingRequiredForEvent( + const ui::AXEvent& event) const { + if (event_schedule_mode_ == EventScheduleMode::kProcessEventsImmediately) + return true; // Already scheduled for immediate mode. + + if (event.event_from == ax::mojom::EventFrom::kAction) + return true; // Actions should result in an immediate response. + + switch (event.event_type) { + case ax::mojom::Event::kActiveDescendantChanged: + case ax::mojom::Event::kBlur: + case ax::mojom::Event::kCheckedStateChanged: + case ax::mojom::Event::kClicked: + case ax::mojom::Event::kDocumentSelectionChanged: + case ax::mojom::Event::kFocus: + case ax::mojom::Event::kHover: + case ax::mojom::Event::kLoadComplete: + case ax::mojom::Event::kTextSelectionChanged: + case ax::mojom::Event::kValueChanged: + return true; + + case ax::mojom::Event::kAriaAttributeChanged: + case ax::mojom::Event::kChildrenChanged: + case ax::mojom::Event::kDocumentTitleChanged: + case ax::mojom::Event::kExpandedChanged: + case ax::mojom::Event::kHide: + case ax::mojom::Event::kInvalidStatusChanged: + case ax::mojom::Event::kLayoutComplete: + case ax::mojom::Event::kLocationChanged: + case ax::mojom::Event::kMenuListValueChanged: + case ax::mojom::Event::kRowCollapsed: + case ax::mojom::Event::kRowCountChanged: + case ax::mojom::Event::kRowExpanded: + case ax::mojom::Event::kScrollPositionChanged: + case ax::mojom::Event::kScrolledToAnchor: + case ax::mojom::Event::kSelectedChildrenChanged: + case ax::mojom::Event::kShow: + case ax::mojom::Event::kTextChanged: + return false; + + case ax::mojom::Event::kAlert: + case ax::mojom::Event::kAutocorrectionOccured: + case ax::mojom::Event::kControlsChanged: + case ax::mojom::Event::kEndOfTest: + case ax::mojom::Event::kFocusAfterMenuClose: + case ax::mojom::Event::kFocusContext: + case ax::mojom::Event::kHitTestResult: + case ax::mojom::Event::kImageFrameUpdated: + case ax::mojom::Event::kLoadStart: + case ax::mojom::Event::kLiveRegionCreated: + case ax::mojom::Event::kLiveRegionChanged: + case ax::mojom::Event::kMediaStartedPlaying: + case ax::mojom::Event::kMediaStoppedPlaying: + case ax::mojom::Event::kMenuEnd: + case ax::mojom::Event::kMenuPopupEnd: + case ax::mojom::Event::kMenuPopupStart: + case ax::mojom::Event::kMenuStart: + case ax::mojom::Event::kMouseCanceled: + case ax::mojom::Event::kMouseDragged: + case ax::mojom::Event::kMouseMoved: + case ax::mojom::Event::kMousePressed: + case ax::mojom::Event::kMouseReleased: + case ax::mojom::Event::kNone: + case ax::mojom::Event::kSelection: + case ax::mojom::Event::kSelectionAdd: + case ax::mojom::Event::kSelectionRemove: + case ax::mojom::Event::kStateChanged: + case ax::mojom::Event::kTooltipClosed: + case ax::mojom::Event::kTooltipOpened: + case ax::mojom::Event::kTreeChanged: + case ax::mojom::Event::kWindowActivated: + case ax::mojom::Event::kWindowDeactivated: + case ax::mojom::Event::kWindowVisibilityChanged: + // Never fired from Blink. + NOTREACHED() << "Event not expected from Blink: " << event.event_type; + return false; + } +} + bool RenderAccessibilityImpl::ShouldSerializeNodeForEvent( const WebAXObject& obj, const ui::AXEvent& event) const { @@ -641,6 +714,23 @@ return true; } +int RenderAccessibilityImpl::GetDeferredEventsDelay() { + // The amount of time, in milliseconds, to wait before sending non-interactive + // events that are deferred before the initial page load. + constexpr int kDelayForDeferredUpdatesBeforePageLoad = 350; + + // The amount of time, in milliseconds, to wait before sending non-interactive + // events that are deferred after the initial page load. + // Shync with same constant in CrossPlatformAccessibilityBrowserTest. + constexpr int kDelayForDeferredUpdatesAfterPageLoad = 150; + + // Prefer WebDocument::IsLoaded() over WebAXObject::IsLoaded() as the + // latter could trigger a layout update while retrieving the root + // WebAXObject. + return GetMainDocument().IsLoaded() ? kDelayForDeferredUpdatesAfterPageLoad + : kDelayForDeferredUpdatesBeforePageLoad; +} + void RenderAccessibilityImpl::ScheduleSendPendingAccessibilityEvents( bool scheduling_from_task) { // Don't send accessibility events for frames that are not in the frame tree @@ -681,11 +771,14 @@ switch (event_schedule_mode_) { case EventScheduleMode::kDeferEvents: event_schedule_status_ = EventScheduleStatus::kScheduledDeferred; - // During page load, process changes on a delay so that they occur in - // larger batches, which helps improve efficiency of page loads. - delay = base::TimeDelta::FromMilliseconds(kDelayForDeferredEvents); + // Where the user is not currently navigating or typing, + // process changes on a delay so that they occur in larger batches, + // improving efficiency of repetitive mutations. + delay = base::TimeDelta::FromMilliseconds(GetDeferredEventsDelay()); break; case EventScheduleMode::kProcessEventsImmediately: + // This set of events needed to be processed immediately because of a + // page load or user action. event_schedule_status_ = EventScheduleStatus::kScheduledImmediate; delay = base::TimeDelta::FromMilliseconds(0); break; @@ -776,8 +869,13 @@ ui::AXEvent(obj.AxID(), ax::mojom::Event::kLayoutComplete)); } - if (pending_events_.empty() && dirty_objects_.empty()) + if (pending_events_.empty() && dirty_objects_.empty()) { + // By default, assume the next batch does not have interactive events, and + // defer so that the batch of events is larger. If any interactive events + // come in, the batch will be processed immediately. + event_schedule_mode_ = EventScheduleMode::kDeferEvents; return; + } // Update layout before snapshotting the events so that live state read from // the DOM during freezing (e.g. which node currently has focus) is consistent @@ -820,10 +918,8 @@ // Loop over each event and generate an updated event message. for (ui::AXEvent& event : src_events) { - if (event.event_type == ax::mojom::Event::kLayoutComplete || - event.event_type == ax::mojom::Event::kScrollPositionChanged) { + if (event.event_type == ax::mojom::Event::kLayoutComplete) need_to_send_location_changes = true; - } if (event.event_type == ax::mojom::Event::kLoadComplete) had_load_complete_messages = true; @@ -997,9 +1093,13 @@ if (had_load_complete_messages) { has_injected_stylesheet_ = false; - event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately; } + // Now that this batch is complete, assume the next batch does not have + // interactive events, and defer so that the batch of events is larger. + // If any interactive events come in, the batch will be processed immediately. + event_schedule_mode_ = EventScheduleMode::kDeferEvents; + if (image_annotation_debugging_) AddImageAnnotationDebuggingAttributes(updates); @@ -1098,6 +1198,7 @@ serializer_->InvalidateSubtree(obj); // Explicitly send a tree change update event now. + event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately; HandleAXEvent(ui::AXEvent(obj.AxID(), ax::mojom::Event::kTreeChanged)); } @@ -1121,6 +1222,7 @@ return; serializer_->InvalidateSubtree(obj); + event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately; HandleAXEvent(ui::AXEvent(obj.AxID(), ax::mojom::Event::kImageFrameUpdated)); }
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h index 0df6d32..44e8ea7 100644 --- a/content/renderer/accessibility/render_accessibility_impl.h +++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -164,6 +164,15 @@ // versions. If any have moved, send an IPC with the new locations. void SendLocationChanges(); + // Return true if the event indicates that the current batch of changes + // should be processed immediately in order for the user to get fast + // feedback, e.g. for navigation or data entry activities. + bool IsImmediateProcessingRequiredForEvent(const ui::AXEvent&) const; + + // Get the amount of time, in ms, that event processing should be deferred + // in order to more efficiently batch changes. + int GetDeferredEventsDelay(); + private: struct DirtyObject { DirtyObject();
diff --git a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc index 2454882..f22f1fe 100644 --- a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc +++ b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
@@ -462,7 +462,7 @@ ClearHandledUpdates(); const WebAXObject& first_child = root_obj.ChildAt(0); GetRenderAccessibilityImpl()->HandleAXEvent( - ui::AXEvent(first_child.AxID(), ax::mojom::Event::kLiveRegionChanged)); + ui::AXEvent(first_child.AxID(), ax::mojom::Event::kFocus)); SendPendingAccessibilityEvents(); EXPECT_EQ(6, CountAccessibilityNodesSentToBrowser()); } @@ -478,10 +478,10 @@ LoadHTML(html); task_environment_.RunUntilIdle(); - // We should have had load complete, causing us to send subsequent events - // without delay. - ExpectScheduleStatusNotWaiting(); - ExpectScheduleModeProcessEventsImmediately(); + // We should have had load complete. Subsequent events are deferred unless + // there is a user interaction. + ExpectScheduleStatusScheduledDeferred(); + ExpectScheduleModeDeferEvents(); // Simulate a page load to test deferred behavior. GetRenderAccessibilityImpl()->DidCommitProvisionalLoad( @@ -496,9 +496,9 @@ ExpectScheduleStatusNotWaiting(); ExpectScheduleModeDeferEvents(); - // Send an event, it should be scheduled with a delay. + // Send a non-interactive event, it should be scheduled with a delay. GetRenderAccessibilityImpl()->HandleAXEvent( - ui::AXEvent(root_obj.AxID(), ax::mojom::Event::kLiveRegionChanged)); + ui::AXEvent(root_obj.AxID(), ax::mojom::Event::kLocationChanged)); ExpectScheduleStatusScheduledDeferred(); ExpectScheduleModeDeferEvents(); @@ -513,14 +513,124 @@ GetRenderAccessibilityImpl()->PerformAction(action); ScheduleSendPendingAccessibilityEvents(); - // Ensure task has been scheduled without delay. + // Once in immediate mode, stays in immediate mode until events are sent. + GetRenderAccessibilityImpl()->HandleAXEvent( + ui::AXEvent(root_obj.AxID(), ax::mojom::Event::kLocationChanged)); + ExpectScheduleStatusScheduledImmediate(); + ExpectScheduleModeProcessEventsImmediately(); + + // Once events have been sent, defer next batch. + ScheduleSendPendingAccessibilityEvents(); + task_environment_.RunUntilIdle(); + ExpectScheduleStatusScheduledDeferred(); + ExpectScheduleModeDeferEvents(); + + const std::vector<ax::mojom::Event> kNonInteractiveEvents = { + ax::mojom::Event::kAriaAttributeChanged, + ax::mojom::Event::kChildrenChanged, + ax::mojom::Event::kDocumentTitleChanged, + ax::mojom::Event::kExpandedChanged, + ax::mojom::Event::kHide, + ax::mojom::Event::kInvalidStatusChanged, + ax::mojom::Event::kLayoutComplete, + ax::mojom::Event::kLocationChanged, + ax::mojom::Event::kMenuListValueChanged, + ax::mojom::Event::kRowCollapsed, + ax::mojom::Event::kRowCountChanged, + ax::mojom::Event::kRowExpanded, + ax::mojom::Event::kScrollPositionChanged, + ax::mojom::Event::kScrolledToAnchor, + ax::mojom::Event::kSelectedChildrenChanged, + ax::mojom::Event::kShow, + ax::mojom::Event::kTextChanged}; + + for (ax::mojom::Event event : kNonInteractiveEvents) { + // Send an interactive event, it should be scheduled with a delay. + GetRenderAccessibilityImpl()->HandleAXEvent( + ui::AXEvent(root_obj.AxID(), event)); + ExpectScheduleModeDeferEvents(); + } + + ScheduleSendPendingAccessibilityEvents(); + ExpectScheduleStatusScheduledDeferred(); + + const std::vector<ax::mojom::Event> kInteractiveEvents = { + ax::mojom::Event::kActiveDescendantChanged, + ax::mojom::Event::kBlur, + ax::mojom::Event::kCheckedStateChanged, + ax::mojom::Event::kClicked, + ax::mojom::Event::kDocumentSelectionChanged, + ax::mojom::Event::kFocus, + ax::mojom::Event::kHover, + ax::mojom::Event::kLoadComplete, + ax::mojom::Event::kTextSelectionChanged, + ax::mojom::Event::kValueChanged}; + + for (ax::mojom::Event event : kInteractiveEvents) { + // Once events have been sent, defer next batch. + task_environment_.RunUntilIdle(); + ExpectScheduleModeDeferEvents(); + ExpectScheduleStatusScheduledDeferred(); + + // Send an interactive event, it should be scheduled with a delay. + GetRenderAccessibilityImpl()->HandleAXEvent( + ui::AXEvent(root_obj.AxID(), event)); + ExpectScheduleModeProcessEventsImmediately(); + ExpectScheduleStatusScheduledImmediate(); + + ScheduleSendPendingAccessibilityEvents(); + } + + task_environment_.RunUntilIdle(); + + // Event has been sent, no longer waiting on ack. + ExpectScheduleStatusScheduledDeferred(); + ExpectScheduleModeDeferEvents(); +} + +TEST_F(RenderAccessibilityImplTest, TestChangesOnFocusModeAreImmediate) { + LoadHTML(R"HTML( + <body> + <div id=a tabindex=0> + a + </div> + <script>document.getElementById('a').focus();</script> + </body> + )HTML"); + task_environment_.RunUntilIdle(); + + // We should have had load complete. Subsequent events are deferred unless + // there is a user interaction. + ExpectScheduleStatusScheduledDeferred(); + ExpectScheduleModeDeferEvents(); + + // Simulate a page load to test deferred behavior. + GetRenderAccessibilityImpl()->DidCommitProvisionalLoad( + ui::PageTransition::PAGE_TRANSITION_LINK); + ClearHandledUpdates(); + WebDocument document = GetMainFrame()->GetDocument(); + EXPECT_FALSE(document.IsNull()); + WebAXObject root_obj = WebAXObject::FromWebDocument(document); + EXPECT_FALSE(root_obj.IsNull()); + + WebAXObject html = root_obj.ChildAt(0); + WebAXObject body = html.ChildAt(0); + WebAXObject node_a = body.ChildAt(0); + + // No events should have been scheduled or sent. + ExpectScheduleStatusNotWaiting(); + ExpectScheduleModeDeferEvents(); + + // Marking the focused object dirty causes changes to be sent immediately. + GetRenderAccessibilityImpl()->MarkWebAXObjectDirty(node_a, false); ExpectScheduleStatusScheduledImmediate(); ExpectScheduleModeProcessEventsImmediately(); task_environment_.RunUntilIdle(); + // Event has been sent, no longer waiting on ack. - ExpectScheduleStatusNotWaiting(); - ExpectScheduleModeProcessEventsImmediately(); + ExpectScheduleStatusScheduledDeferred(); + ExpectScheduleModeDeferEvents(); } TEST_F(RenderAccessibilityImplTest, HideAccessibilityObject) {
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc index e3f5192..e734cbd 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.cc +++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -239,6 +239,17 @@ Send(new MediaPlayerDelegateHostMsg_OnBufferUnderflow(routing_id(), player_id)); } + +void RendererWebMediaPlayerDelegate::DidSeek(int player_id) { + // Send the seek updates to delegate only once per second. + if (last_seek_update_time_.is_null() || + (base::TimeTicks::Now() - last_seek_update_time_ >= + base::TimeDelta::FromSeconds(1))) { + last_seek_update_time_ = base::TimeTicks::Now(); + Send(new MediaPlayerDelegateHostMsg_OnSeek(routing_id(), player_id)); + } +} + void RendererWebMediaPlayerDelegate::WasHidden() { RecordAction(base::UserMetricsAction("Media.Hidden"));
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h index a2705031..b9c00dd9 100644 --- a/content/renderer/media/renderer_webmediaplayer_delegate.h +++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -76,6 +76,7 @@ const std::string& hashed_device_id) override; void DidDisableAudioOutputSinkChanges(int delegate_id) override; void DidBufferUnderflow(int player_id) override; + void DidSeek(int player_id) override; // content::RenderFrameObserver overrides. void WasHidden() override; @@ -167,6 +168,9 @@ base::TimeTicks background_video_start_time_; #endif // OS_ANDROID + // Keeps track of when the player seek event was sent to the delegate. + base::TimeTicks last_seek_update_time_; + // Players with a video track. base::flat_set<int> players_with_video_;
diff --git a/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt b/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt index fcef36c..6617cab78 100644 --- a/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-combobox-uneditable-expected-android.txt
@@ -1,7 +1,7 @@ android.webkit.WebView focusable focused scrollable ++android.view.View name='Choose a fruit, with text content' ++android.widget.Spinner clickable focusable name='Choose a fruit, with text content' -++android.widget.ListView role_description='list box' clickable collection item_count=3 row_count=3 -++++android.view.View clickable collection_item focusable selected name='Apple' -++++android.view.View clickable collection_item focusable name='Banana' item_index=1 row_index=1 -++++android.view.View clickable collection_item focusable name='Cherry' item_index=2 row_index=2 \ No newline at end of file +++android.widget.ListView role_description='list box' clickable collection state_description='3 items' item_count=3 row_count=3 +++++android.view.View clickable collection_item focusable selected name='Apple' state_description='in list, item 1 of 3' +++++android.view.View clickable collection_item focusable name='Banana' state_description='in list, item 2 of 3' item_index=1 row_index=1 +++++android.view.View clickable collection_item focusable name='Cherry' state_description='in list, item 3 of 3' item_index=2 row_index=2 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-listbox-disabled-expected-android.txt b/content/test/data/accessibility/aria/aria-listbox-disabled-expected-android.txt index 5921eb3..874d1a3 100644 --- a/content/test/data/accessibility/aria/aria-listbox-disabled-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-listbox-disabled-expected-android.txt
@@ -1,8 +1,8 @@ android.webkit.WebView focusable focused scrollable ++android.view.View role_description='heading 1' heading name='Start of test: striped should have selected state' -++android.widget.ListView role_description='list box' clickable collection disabled item_count=4 row_count=4 -++++android.view.View clickable collection_item disabled focusable name='Orange' -++++android.view.View clickable collection_item disabled focusable selected name='Striped' item_index=1 row_index=1 -++++android.view.View clickable collection_item disabled focusable name='Calico' item_index=2 row_index=2 -++++android.view.View clickable collection_item disabled focusable name='Black' item_index=3 row_index=3 +++android.widget.ListView role_description='list box' clickable collection disabled state_description='4 items' item_count=4 row_count=4 +++++android.view.View clickable collection_item disabled focusable name='Orange' state_description='in list, item 1 of 4' +++++android.view.View clickable collection_item disabled focusable selected name='Striped' state_description='in list, item 2 of 4' item_index=1 row_index=1 +++++android.view.View clickable collection_item disabled focusable name='Calico' state_description='in list, item 3 of 4' item_index=2 row_index=2 +++++android.view.View clickable collection_item disabled focusable name='Black' state_description='in list, item 4 of 4' item_index=3 row_index=3 ++android.view.View name='End of test' \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-listbox-expected-android.txt b/content/test/data/accessibility/aria/aria-listbox-expected-android.txt index 4050d5c..ade9094 100644 --- a/content/test/data/accessibility/aria/aria-listbox-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-listbox-expected-android.txt
@@ -1,7 +1,7 @@ android.webkit.WebView focusable focused scrollable -++android.widget.ListView role_description='list box' clickable collection item_count=4 row_count=4 -++++android.view.View clickable collection_item focusable name='Item 1' -++++android.view.View clickable collection_item focusable name='Item 2' item_index=1 row_index=1 +++android.widget.ListView role_description='list box' clickable collection state_description='4 items' item_count=4 row_count=4 +++++android.view.View clickable collection_item focusable name='Item 1' state_description='in list, item 1 of 4' +++++android.view.View clickable collection_item focusable name='Item 2' state_description='in list, item 2 of 4' item_index=1 row_index=1 ++++android.view.View role_description='splitter' -++++android.view.View clickable collection_item focusable name='Second group item 1' item_index=2 row_index=2 -++++android.view.View clickable collection_item focusable name='Second group item 2' item_index=3 row_index=3 +++++android.view.View clickable collection_item focusable name='Second group item 1' state_description='in list, item 3 of 4' item_index=2 row_index=2 +++++android.view.View clickable collection_item focusable name='Second group item 2' state_description='in list, item 4 of 4' item_index=3 row_index=3 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-multiselectable-expected-android.txt b/content/test/data/accessibility/aria/aria-multiselectable-expected-android.txt index 7b67ee31..3ea87b03 100644 --- a/content/test/data/accessibility/aria/aria-multiselectable-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-multiselectable-expected-android.txt
@@ -1,11 +1,11 @@ android.webkit.WebView focusable focused scrollable ++android.widget.ListView role_description='list box' clickable collection focusable multiselectable name='My Listbox' state_description='multiselectable, none selected.' item_count=4 row_count=4 -++++android.view.View clickable collection_item focusable name='Example 1' -++++android.view.View clickable collection_item focusable name='Example 2' item_index=1 row_index=1 -++++android.view.View clickable collection_item focusable name='Example 3' item_index=2 row_index=2 -++++android.view.View clickable collection_item focusable name='Example 4' item_index=3 row_index=3 +++++android.view.View clickable collection_item focusable name='Example 1' state_description='in list, item 1 of 4' +++++android.view.View clickable collection_item focusable name='Example 2' state_description='in list, item 2 of 4' item_index=1 row_index=1 +++++android.view.View clickable collection_item focusable name='Example 3' state_description='in list, item 3 of 4' item_index=2 row_index=2 +++++android.view.View clickable collection_item focusable name='Example 4' state_description='in list, item 4 of 4' item_index=3 row_index=3 ++android.widget.ListView role_description='list box' clickable collection focusable multiselectable name='My Listbox' state_description='multiselectable, 2 of 4 selected.' item_count=4 row_count=4 -++++android.view.View clickable collection_item focusable name='Example 1' -++++android.view.View clickable collection_item focusable selected name='Example 2' item_index=1 row_index=1 -++++android.view.View clickable collection_item focusable name='Example 3' item_index=2 row_index=2 -++++android.view.View clickable collection_item focusable selected name='Example 4' item_index=3 row_index=3 \ No newline at end of file +++++android.view.View clickable collection_item focusable name='Example 1' state_description='in list, item 1 of 4' +++++android.view.View clickable collection_item focusable selected name='Example 2' state_description='in list, item 2 of 4' item_index=1 row_index=1 +++++android.view.View clickable collection_item focusable name='Example 3' state_description='in list, item 3 of 4' item_index=2 row_index=2 +++++android.view.View clickable collection_item focusable selected name='Example 4' state_description='in list, item 4 of 4' item_index=3 row_index=3 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-option-expected-android.txt b/content/test/data/accessibility/aria/aria-option-expected-android.txt index 8359a18..a20aa2e8 100644 --- a/content/test/data/accessibility/aria/aria-option-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-option-expected-android.txt
@@ -1,6 +1,6 @@ android.webkit.WebView focusable focused scrollable -++android.widget.ListView role_description='list box' clickable collection item_count=4 row_count=4 -++++android.view.View clickable collection_item focusable name='option 1' -++++android.view.View clickable collection_item focusable name='label 2' item_index=1 row_index=1 -++++android.view.View clickable collection_item focusable name='caterpillar' item_index=2 row_index=2 -++++android.view.View clickable collection_item focusable name='catfish' item_index=3 row_index=3 +++android.widget.ListView role_description='list box' clickable collection state_description='4 items' item_count=4 row_count=4 +++++android.view.View clickable collection_item focusable name='option 1' state_description='in list, item 1 of 4' +++++android.view.View clickable collection_item focusable name='label 2' state_description='in list, item 2 of 4' item_index=1 row_index=1 +++++android.view.View clickable collection_item focusable name='caterpillar' state_description='in list, item 3 of 4' item_index=2 row_index=2 +++++android.view.View clickable collection_item focusable name='catfish' state_description='in list, item 4 of 4' item_index=3 row_index=3 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-android.txt b/content/test/data/accessibility/aria/aria-posinset-expected-android.txt index 0ae5eab1..acb80ee7 100644 --- a/content/test/data/accessibility/aria/aria-posinset-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
@@ -1,12 +1,12 @@ android.webkit.WebView focusable focused scrollable ++android.view.View role_description='article' name='This is an ARIA article 1.' ++android.view.View role_description='article' name='This is an ARIA article 2.' -++android.widget.ListView role_description='list box' clickable collection item_count=2 row_count=2 -++++android.view.View clickable collection_item focusable name='Item 1' -++++android.view.View clickable collection_item focusable name='Item 2' item_index=1 row_index=1 -++android.widget.ListView role_description='list box' clickable collection item_count=2 row_count=2 -++++android.view.View clickable collection_item focusable name='Item 1' -++++android.view.View clickable collection_item focusable name='Item 2' item_index=1 row_index=1 +++android.widget.ListView role_description='list box' clickable collection state_description='2 items' item_count=2 row_count=2 +++++android.view.View clickable collection_item focusable name='Item 1' state_description='in list, item 1 of 2' +++++android.view.View clickable collection_item focusable name='Item 2' state_description='in list, item 2 of 2' item_index=1 row_index=1 +++android.widget.ListView role_description='list box' clickable collection state_description='2 items' item_count=2 row_count=2 +++++android.view.View clickable collection_item focusable name='Item 1' state_description='in list, item 1 of 2' +++++android.view.View clickable collection_item focusable name='Item 2' state_description='in list, item 2 of 2' item_index=1 row_index=1 ++android.view.View ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable item_index=2 row_index=2 ++++android.widget.TextView name='1'
diff --git a/content/test/data/accessibility/aria/aria-selected-expected-android.txt b/content/test/data/accessibility/aria/aria-selected-expected-android.txt index 5bf6840..08e2c6b4 100644 --- a/content/test/data/accessibility/aria/aria-selected-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-selected-expected-android.txt
@@ -1,4 +1,4 @@ android.webkit.WebView focusable focused scrollable -++android.widget.ListView role_description='list box' clickable collection item_count=2 row_count=2 -++++android.view.View clickable collection_item focusable selected name='1' -++++android.view.View clickable collection_item focusable name='2' item_index=1 row_index=1 \ No newline at end of file +++android.widget.ListView role_description='list box' clickable collection state_description='2 items' item_count=2 row_count=2 +++++android.view.View clickable collection_item focusable selected name='1' state_description='in list, item 1 of 2' +++++android.view.View clickable collection_item focusable name='2' state_description='in list, item 2 of 2' item_index=1 row_index=1 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-setsize-expected-android.txt b/content/test/data/accessibility/aria/aria-setsize-expected-android.txt index 6067ebb..c6c0606 100644 --- a/content/test/data/accessibility/aria/aria-setsize-expected-android.txt +++ b/content/test/data/accessibility/aria/aria-setsize-expected-android.txt
@@ -1,12 +1,12 @@ android.webkit.WebView focusable focused scrollable -++android.widget.ListView role_description='list box' clickable collection item_count=4 row_count=4 -++++android.view.View clickable collection_item focusable name='Item 1' -++++android.view.View clickable collection_item focusable name='Item 2' item_index=1 row_index=1 -++++android.view.View clickable collection_item focusable name='Item 3' item_index=2 row_index=2 -++++android.view.View clickable collection_item focusable name='Item 4' item_index=3 row_index=3 -++android.widget.ListView role_description='list box' clickable collection item_count=5 row_count=5 -++++android.view.View clickable collection_item focusable name='Item 1' -++++android.view.View clickable collection_item focusable name='Item 2' item_index=1 row_index=1 -++++android.view.View clickable collection_item focusable name='Item 3' item_index=2 row_index=2 -++++android.view.View clickable collection_item focusable name='Item 4' item_index=3 row_index=3 -++++android.view.View clickable collection_item focusable name='Item 5' item_index=4 row_index=4 \ No newline at end of file +++android.widget.ListView role_description='list box' clickable collection state_description='4 items' item_count=4 row_count=4 +++++android.view.View clickable collection_item focusable name='Item 1' state_description='in list, item 1 of 4' +++++android.view.View clickable collection_item focusable name='Item 2' state_description='in list, item 2 of 4' item_index=1 row_index=1 +++++android.view.View clickable collection_item focusable name='Item 3' state_description='in list, item 3 of 4' item_index=2 row_index=2 +++++android.view.View clickable collection_item focusable name='Item 4' state_description='in list, item 4 of 4' item_index=3 row_index=3 +++android.widget.ListView role_description='list box' clickable collection state_description='5 items' item_count=5 row_count=5 +++++android.view.View clickable collection_item focusable name='Item 1' state_description='in list, item 1 of 5' +++++android.view.View clickable collection_item focusable name='Item 2' state_description='in list, item 2 of 5' item_index=1 row_index=1 +++++android.view.View clickable collection_item focusable name='Item 3' state_description='in list, item 3 of 5' item_index=2 row_index=2 +++++android.view.View clickable collection_item focusable name='Item 4' state_description='in list, item 4 of 5' item_index=3 row_index=3 +++++android.view.View clickable collection_item focusable name='Item 5' state_description='in list, item 5 of 5' item_index=4 row_index=4 \ No newline at end of file
diff --git a/content/test/data/accessibility/event/aria-selected-changed-expected-uia-win.txt b/content/test/data/accessibility/event/aria-selected-changed-expected-uia-win.txt index b5c06a6..62ba3b8 100644 --- a/content/test/data/accessibility/event/aria-selected-changed-expected-uia-win.txt +++ b/content/test/data/accessibility/event/aria-selected-changed-expected-uia-win.txt
@@ -23,6 +23,7 @@ SelectionItemIsSelected changed on role=combobox SelectionItemIsSelected changed on role=listitem, name=Select2, Option2 SelectionItem_ElementSelected on role=listitem, name=Select2, Option2 +Text_TextChanged on role=document ValueValue changed on role=combobox === Start Continuation === AriaProperties changed on role=option, name=DivSelect, Option1
diff --git a/content/test/data/accessibility/event/aria-selected-changed.html b/content/test/data/accessibility/event/aria-selected-changed.html index 2de7db4..ea9e31d 100644 --- a/content/test/data/accessibility/event/aria-selected-changed.html +++ b/content/test/data/accessibility/event/aria-selected-changed.html
@@ -1,5 +1,4 @@ <!-- - @UIA-WIN-DENY:Text_TextChanged* @UIA-WIN-DENY:Invoke_Invoked* --> <!DOCTYPE html>
diff --git a/content/test/data/accessibility/event/css-flex-text-update-expected-uia-win.txt b/content/test/data/accessibility/event/css-flex-text-update-expected-uia-win.txt index f40a3245..92abc7ad 100644 --- a/content/test/data/accessibility/event/css-flex-text-update-expected-uia-win.txt +++ b/content/test/data/accessibility/event/css-flex-text-update-expected-uia-win.txt
@@ -1 +1 @@ -Name changed on role=description, name=new \ No newline at end of file +Text_TextChanged on role=description, name=new
diff --git a/content/test/data/accessibility/event/description-change-indirect-expected-win.txt b/content/test/data/accessibility/event/description-change-indirect-expected-win.txt index 1a48a4c..e7cd29c 100644 --- a/content/test/data/accessibility/event/description-change-indirect-expected-win.txt +++ b/content/test/data/accessibility/event/description-change-indirect-expected-win.txt
@@ -1,6 +1,6 @@ EVENT_OBJECT_DESCRIPTIONCHANGE on <div> role=ROLE_SYSTEM_GROUPING EVENT_OBJECT_HIDE on role=ROLE_SYSTEM_STATICTEXT name="apples" -EVENT_OBJECT_REORDER on <h1#title> role=H1 name="oranges" level=1 +EVENT_OBJECT_REORDER on <h1#title> role=ROLE_SYSTEM_GROUPING name="oranges" level=1 EVENT_OBJECT_SHOW on role=ROLE_SYSTEM_STATICTEXT name="oranges" -IA2_EVENT_TEXT_INSERTED on <h1#title> role=H1 name="oranges" level=1 new_text={'oranges' start=0 end=7} -IA2_EVENT_TEXT_REMOVED on <h1#title> role=H1 name="oranges" level=1 old_text={'apples' start=0 end=6} +IA2_EVENT_TEXT_INSERTED on <h1#title> role=ROLE_SYSTEM_GROUPING name="oranges" level=1 new_text={'oranges' start=0 end=7} +IA2_EVENT_TEXT_REMOVED on <h1#title> role=ROLE_SYSTEM_GROUPING name="oranges" level=1 old_text={'apples' start=0 end=6}
diff --git a/content/test/data/accessibility/event/description-change-indirect.html b/content/test/data/accessibility/event/description-change-indirect.html index 65d8c3a0..05d6d9a 100644 --- a/content/test/data/accessibility/event/description-change-indirect.html +++ b/content/test/data/accessibility/event/description-change-indirect.html
@@ -1,7 +1,6 @@ <!-- @BLINK-ALLOW:description=* @WIN-ALLOW:description=* -@UIA-WIN-DENY:Text_TextChanged* @MAC-ALLOW:AXDescription Due to a bug in Windows (fixed in Windows 10 19H1), events are raised
diff --git a/content/test/data/accessibility/event/description-change-no-relation-expected-win.txt b/content/test/data/accessibility/event/description-change-no-relation-expected-win.txt index 9c59d24f..86af8e58 100644 --- a/content/test/data/accessibility/event/description-change-no-relation-expected-win.txt +++ b/content/test/data/accessibility/event/description-change-no-relation-expected-win.txt
@@ -1,2 +1 @@ -EVENT_OBJECT_DESCRIPTIONCHANGE on <div#a> role=DIV - +EVENT_OBJECT_DESCRIPTIONCHANGE on <div#a> role=ROLE_SYSTEM_GROUPING
diff --git a/content/test/data/accessibility/event/description-change-no-relation.html b/content/test/data/accessibility/event/description-change-no-relation.html index c7fe1c5..f05e75d 100644 --- a/content/test/data/accessibility/event/description-change-no-relation.html +++ b/content/test/data/accessibility/event/description-change-no-relation.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/description-change.html b/content/test/data/accessibility/event/description-change.html index 0a9e6c1..c080dc39 100644 --- a/content/test/data/accessibility/event/description-change.html +++ b/content/test/data/accessibility/event/description-change.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/input-type-text-value-changed-expected-uia-win.txt b/content/test/data/accessibility/event/input-type-text-value-changed-expected-uia-win.txt new file mode 100644 index 0000000..dc0f563 --- /dev/null +++ b/content/test/data/accessibility/event/input-type-text-value-changed-expected-uia-win.txt
@@ -0,0 +1,2 @@ +Text_TextChanged on role=textbox +ValueValue changed on role=textbox
diff --git a/content/test/data/accessibility/event/live-region-change-expected-uia-win.txt b/content/test/data/accessibility/event/live-region-change-expected-uia-win.txt index ee7c679..8d033423 100644 --- a/content/test/data/accessibility/event/live-region-change-expected-uia-win.txt +++ b/content/test/data/accessibility/event/live-region-change-expected-uia-win.txt
@@ -1,3 +1,3 @@ LiveRegionChanged on role=group LiveRegionChanged on role=group -Name changed on role=description, name=After +Text_TextChanged on role=description, name=After
diff --git a/content/test/data/accessibility/event/live-region-change.html b/content/test/data/accessibility/event/live-region-change.html index 0624e55..caf272b 100644 --- a/content/test/data/accessibility/event/live-region-change.html +++ b/content/test/data/accessibility/event/live-region-change.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/live-region-create.html b/content/test/data/accessibility/event/live-region-create.html index 5f09c9e..a887b2a 100644 --- a/content/test/data/accessibility/event/live-region-create.html +++ b/content/test/data/accessibility/event/live-region-create.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt b/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt index f4d8873..0b3357b 100644 --- a/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt +++ b/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt
@@ -4,4 +4,5 @@ AriaProperties changed on role=combobox SelectionItemIsSelected changed on role=combobox SelectionItem_ElementRemovedFromSelection on role=combobox +Text_TextChanged on role=document ValueValue changed on role=combobox
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt index 5954885..fa79854 100644 --- a/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt +++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt
@@ -6,4 +6,5 @@ SelectionItemIsSelected changed on role=combobox SelectionItemIsSelected changed on role=listitem, name=Orange SelectionItem_ElementSelected on role=listitem, name=Orange +Text_TextChanged on role=document ValueValue changed on role=combobox
diff --git a/content/test/data/accessibility/event/menulist-collapse-next.html b/content/test/data/accessibility/event/menulist-collapse-next.html index 75d3377..7ce1665 100644 --- a/content/test/data/accessibility/event/menulist-collapse-next.html +++ b/content/test/data/accessibility/event/menulist-collapse-next.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/menulist-collapse.html b/content/test/data/accessibility/event/menulist-collapse.html index 48a41e45..bfa753f 100644 --- a/content/test/data/accessibility/event/menulist-collapse.html +++ b/content/test/data/accessibility/event/menulist-collapse.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/menulist-focus.html b/content/test/data/accessibility/event/menulist-focus.html index bc5b9b0..73ba0b0 100644 --- a/content/test/data/accessibility/event/menulist-focus.html +++ b/content/test/data/accessibility/event/menulist-focus.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/name-change-indirect.html b/content/test/data/accessibility/event/name-change-indirect.html index bb5d946c..961b993 100644 --- a/content/test/data/accessibility/event/name-change-indirect.html +++ b/content/test/data/accessibility/event/name-change-indirect.html
@@ -1,6 +1,4 @@ <!-- -@UIA-WIN-DENY:Text_TextChanged* - Due to a bug in Windows (fixed in Windows 10 19H1), events are raised exactly twice for any in-proc off-thread event listeners. AccessibilityEventRecorderUia will try to filter duplicate events, but the
diff --git a/content/test/data/accessibility/event/name-change.html b/content/test/data/accessibility/event/name-change.html index 23f9899a..c2646d3 100644 --- a/content/test/data/accessibility/event/name-change.html +++ b/content/test/data/accessibility/event/name-change.html
@@ -1,6 +1,3 @@ -<!-- -@UIA-WIN-DENY:Text_TextChanged* ---> <!DOCTYPE html> <html> <body>
diff --git a/content/test/data/accessibility/event/text-changed-expected-uia-win.txt b/content/test/data/accessibility/event/text-changed-expected-uia-win.txt index 433c250..059b390 100644 --- a/content/test/data/accessibility/event/text-changed-expected-uia-win.txt +++ b/content/test/data/accessibility/event/text-changed-expected-uia-win.txt
@@ -1,4 +1,4 @@ -Name changed on role=description, name=Modified Div -Name changed on role=heading, name=h StructureChanged/ChildAdded on role=description, name=Modified Para StructureChanged/ChildRemoved on role=group, name=p +Text_TextChanged on role=description, name=Modified Div +Text_TextChanged on role=heading, name=h
diff --git a/content/test/data/accessibility/html/button-with-listbox-popup-expected-android.txt b/content/test/data/accessibility/html/button-with-listbox-popup-expected-android.txt index a67ef11e..85666b44 100644 --- a/content/test/data/accessibility/html/button-with-listbox-popup-expected-android.txt +++ b/content/test/data/accessibility/html/button-with-listbox-popup-expected-android.txt
@@ -2,7 +2,7 @@ ++android.view.View ++++android.view.View name='Choose one:' ++++android.widget.Spinner role_description='pop up button' clickable focusable name='Choose one: Foo' -++++android.widget.ListView role_description='list box' clickable collection focusable name='Choose one:' item_count=3 row_count=3 -++++++android.view.View clickable collection_item focusable name='Baz' -++++++android.view.View clickable collection_item focusable name='Bar' item_index=1 row_index=1 -++++++android.view.View clickable collection_item focusable name='Foo' item_index=2 row_index=2 +++++android.widget.ListView role_description='list box' clickable collection focusable name='Choose one:' state_description='3 items' item_count=3 row_count=3 +++++++android.view.View clickable collection_item focusable name='Baz' state_description='in list, item 1 of 3' +++++++android.view.View clickable collection_item focusable name='Bar' state_description='in list, item 2 of 3' item_index=1 row_index=1 +++++++android.view.View clickable collection_item focusable name='Foo' state_description='in list, item 3 of 3' item_index=2 row_index=2 \ No newline at end of file
diff --git a/content/test/data/accessibility/readme.md b/content/test/data/accessibility/readme.md index dd12d32..597d10f 100644 --- a/content/test/data/accessibility/readme.md +++ b/content/test/data/accessibility/readme.md
@@ -182,6 +182,14 @@ out/Debug/content_browsertests --gtest_help ``` +Note: For Android, generated expectations will replace the existing files on +the test device. For example, if running on an emulator, for an ARIA test +called `my-test.html`, the generated output can be found: +``` + /storage/emulated/0/chromium_tests_root/content/test/ + data/accessibility/aria/my-test-expected-android.txt +``` + ## Adding a new test: If you are adding a new test file remember to add a corresponding test case in:
diff --git a/content/test/gpu/gpu_tests/gpu_helper.py b/content/test/gpu/gpu_tests/gpu_helper.py index 6923d5d..086faa2b 100644 --- a/content/test/gpu/gpu_tests/gpu_helper.py +++ b/content/test/gpu/gpu_tests/gpu_helper.py
@@ -98,25 +98,25 @@ def GetANGLERenderer(gpu_info): - retval = 'no_angle' + retval = 'angle-no-backend' if gpu_info and gpu_info.aux_attributes: gl_renderer = gpu_info.aux_attributes.get('gl_renderer') if gl_renderer and 'ANGLE' in gl_renderer: if 'Direct3D11' in gl_renderer: - retval = 'd3d11' + retval = 'angle-d3d11' elif 'Direct3D9' in gl_renderer: - retval = 'd3d9' + retval = 'angle-d3d9' elif 'OpenGL ES' in gl_renderer: - retval = 'opengles' + retval = 'angle-opengles' elif 'OpenGL' in gl_renderer: - retval = 'opengl' + retval = 'angle-opengl' elif 'Metal' in gl_renderer: - retval = 'metal' + retval = 'angle-metal' # SwiftShader first because it also contains Vulkan elif 'SwiftShader' in gl_renderer: - retval = 'swiftshader' + retval = 'angle-swiftshader' elif 'Vulkan' in gl_renderer: - retval = 'vulkan' + retval = 'angle-vulkan' return retval @@ -138,42 +138,40 @@ return 'no_passthrough' -# Used to check GPU feature status to see if SkiaRenderer is enabled. -def GetSkiaRenderer(gpu_feature_status): - if gpu_feature_status and 'skia_renderer' in gpu_feature_status: - if gpu_feature_status['skia_renderer'] == 'enabled_on': - return 'skia-renderer' - return 'no-skia-renderer' +def GetSkiaRenderer(gpu_feature_status, extra_browser_args): + retval = 'no-skia-renderer' + skia_renderer_enabled = ( + gpu_feature_status + and gpu_feature_status.get('skia_renderer') == 'enabled_on') + if skia_renderer_enabled: + if HasDawnSkiaRenderer(extra_browser_args): + retval = 'dawn-skia-renderer' + elif HasGlSkiaRenderer(extra_browser_args): + retval = 'gl-skia-renderer' + elif HasVulkanSkiaRenderer(gpu_feature_status): + retval = 'vulkan-skia-renderer' + return retval -# Used to check GPU feature status to see if Vulkan is enabled. -def GetVulkan(gpu_feature_status): - if gpu_feature_status and 'vulkan' in gpu_feature_status: - if gpu_feature_status['vulkan'] == 'enabled_on': - return 'use-vulkan' - return 'no-use-vulkan' - - -# Used to parse additional options sent to the browser instance via -# '--extra-browser-args', looking for '--use-gl='. -def GetGL(extra_browser_args): - if extra_browser_args: - for o in extra_browser_args: - if "--use-gl=" in o: - return 'use-gl' - return 'no-use-gl' - - -# Used to parse additional options sent to the browser instance via -# '--extra-browser-args', looking for '--enable-features=SkiaDawn' which -# may be merged with additional feature flags. # TODO(sgilhuly): Use GPU feature status for Dawn instead of command line. -def GetSkiaDawn(extra_browser_args): +def HasDawnSkiaRenderer(extra_browser_args): if extra_browser_args: - for o in extra_browser_args: - if o.startswith('--enable-features') and "SkiaDawn" in o: - return 'use-skia-dawn' - return 'no-use-skia-dawn' + for arg in extra_browser_args: + if arg.startswith('--enable-features') and 'SkiaDawn' in arg: + return True + return False + + +def HasGlSkiaRenderer(extra_browser_args): + if extra_browser_args: + for arg in extra_browser_args: + if '--use-gl=' in arg: + return True + return False + + +def HasVulkanSkiaRenderer(gpu_feature_status): + return gpu_feature_status and gpu_feature_status.get('vulkan') == 'enabled_on' # used by unittests to create a mock arguments object
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test.py b/content/test/gpu/gpu_tests/gpu_integration_test.py index c59a942..df246ca 100644 --- a/content/test/gpu/gpu_tests/gpu_integration_test.py +++ b/content/test/gpu/gpu_tests/gpu_integration_test.py
@@ -509,19 +509,10 @@ tags.extend([re.sub('[ _]', '-', tag) for tag in gpu_tags]) # Add tags based on GPU feature status. - skia_renderer = gpu_helper.GetSkiaRenderer(gpu_info.feature_status) + startup_args = getattr(browser, 'startup_args', None) + skia_renderer = gpu_helper.GetSkiaRenderer(gpu_info.feature_status, + startup_args) tags.append(skia_renderer) - use_vulkan = gpu_helper.GetVulkan(gpu_info.feature_status) - tags.append(use_vulkan) - - # If additional options have been set via '--extra-browser-args' check for - # those which map to expectation tags. The '_browser_backend' attribute may - # not exist in unit tests. - if hasattr(browser, 'startup_args'): - use_gl = gpu_helper.GetGL(browser.startup_args) - tags.append(use_gl) - use_skia_dawn = gpu_helper.GetSkiaDawn(browser.startup_args) - tags.append(use_skia_dawn) return tags @classmethod
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py b/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py index 72b93fc..401b6cc 100644 --- a/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py +++ b/content/test/gpu/gpu_tests/gpu_integration_test_unittest.py
@@ -158,7 +158,7 @@ tag_set = _GenerateNvidiaExampleTagsForTestClassAndArgs(test_class, args) self.assertTrue( set([ - 'win', 'win10', 'd3d9', 'release', 'nvidia', 'nvidia-0x1cb3', + 'win', 'win10', 'angle-d3d9', 'release', 'nvidia', 'nvidia-0x1cb3', 'no-passthrough' ]).issubset(tag_set)) return tag_set @@ -201,9 +201,8 @@ self.assertEqual( _GetTagsToTest(browser), set([ - 'win', 'win10', 'release', 'nvidia', 'nvidia-0x1cb3', 'd3d9', - 'no-passthrough', 'no-swiftshader-gl', 'no-use-vulkan', - 'no-skia-renderer' + 'win', 'win10', 'release', 'nvidia', 'nvidia-0x1cb3', 'angle-d3d9', + 'no-passthrough', 'no-swiftshader-gl', 'no-skia-renderer' ])) def testGenerateVendorTagUsingVendorString(self): @@ -218,8 +217,8 @@ _GetTagsToTest(browser), set([ 'mac', 'mojave', 'release', 'imagination', - 'imagination-PowerVR-SGX-554', 'opengles', 'passthrough', - 'no-swiftshader-gl', 'no-use-vulkan', 'no-skia-renderer' + 'imagination-PowerVR-SGX-554', 'angle-opengles', 'passthrough', + 'no-swiftshader-gl', 'no-skia-renderer' ])) def testGenerateVendorTagUsingDeviceString(self): @@ -232,8 +231,8 @@ _GetTagsToTest(browser), set([ 'mac', 'mojave', 'release', 'imagination', - 'imagination-Triangle-Monster-3000', 'no-angle', 'no-passthrough', - 'no-swiftshader-gl', 'no-use-vulkan', 'no-skia-renderer' + 'imagination-Triangle-Monster-3000', 'angle-no-backend', + 'no-passthrough', 'no-swiftshader-gl', 'no-skia-renderer' ])) def testSimpleIntegrationTest(self):
diff --git a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt index 307de8f..d4e43af 100644 --- a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt
@@ -1,7 +1,5 @@ # tags: [ android ] # tags: [ android-nexus-5x android-nexus-5 ] -# tags: [ skia-renderer no-skia-renderer ] # results: [ Failure RetryOnFailure Skip ] -crbug.com/1006045 [ android android-nexus-5x skia-renderer ] Maps_maps [ Failure ] -crbug.com/1009137 [ android android-nexus-5 no-skia-renderer ] Maps_maps [ RetryOnFailure ] +crbug.com/1009137 [ android android-nexus-5 ] Maps_maps [ RetryOnFailure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index e889ab0..764775f5 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -5,12 +5,8 @@ # linux # win win7 ] # tags: [ android-chromium android-webview-instrumentation android-not-webview debug ] -# tags: [ fuchsia-board-qemu-x64 ] -# tags: [ skia-renderer no-skia-renderer ] -# tags: [ use-gl no-use-gl ] -# tags: [ use-vulkan no-use-vulkan ] -# tags: [ use-skia-dawn no-use-skia-dawn ] -# tags: [ chromeos-board-kevin ] +# tags: [ no-skia-renderer dawn-skia-renderer gl-skia-renderer vulkan-skia-renderer ] +# tags: [ chromeos-board-kevin fuchsia-board-qemu-x64 ] # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 # intel intel-0xa2e intel-0x5912 intel-0xd26 intel-0x3e92 # nvidia @@ -68,14 +64,14 @@ [ fuchsia ] Pixel_WebGLReadPixelsTabSwitch [ Skip ] # Fuchsia emulators don't support video -[ fuchsia fuchsia-board-qemu-x64 no-use-skia-dawn ] Pixel_Video* [ Skip ] +[ fuchsia fuchsia-board-qemu-x64 ] Pixel_Video* [ Skip ] # Fuchsia issues -crbug.com/1115673 [ fuchsia no-use-skia-dawn ] Pixel_WebGLCopyImage [ Skip ] +crbug.com/1115673 [ fuchsia ] Pixel_WebGLCopyImage [ Skip ] crbug.com/1115673 [ fuchsia ] Pixel_CanvasLowLatencyWebGLDrawImage [ Skip ] crbug.com/1115673 [ fuchsia ] Pixel_CanvasLowLatencyWebGLRoundedCorners [ Skip ] crbug.com/1115673 [ fuchsia ] Pixel_CanvasLowLatencyWebGLOccluded [ Skip ] -crbug.com/1136742 [ fuchsia no-use-skia-dawn ] Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear [ RetryOnFailure ] +crbug.com/1136742 [ fuchsia ] Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear [ RetryOnFailure ] # Tests running with SwiftShader are skipped on platforms where SwiftShader # isn't supported. @@ -128,7 +124,7 @@ crbug.com/660461 [ mac ] Pixel_ScissorTestWithPreserveDrawingBuffer [ RetryOnFailure ] # Failing on Nexus 5; haven't investigated why yet. -crbug.com/773293 [ android no-use-gl qualcomm-adreno-(tm)-330 ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ] +crbug.com/773293 [ android qualcomm-adreno-(tm)-330 ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ] crbug.com/773293 [ android qualcomm-adreno-(tm)-330 ] Pixel_WebGL2_ClearBufferfv_Result_Displayed [ Skip ] crbug.com/774809 [ mac intel ] Pixel_WebGLGreenTriangle_NonChromiumImage_NoAA_NoAlpha [ Failure ] @@ -143,7 +139,7 @@ crbug.com/744658 [ mac amd-0x6821 ] Pixel_CSS3DBlueBox_NoGpuProcess [ Failure ] # TODO(fserb): temporarily suppress this test. -crbug.com/840394 [ linux no-use-skia-dawn ] Pixel_OffscreenCanvas2DResizeOnWorker [ RetryOnFailure ] +crbug.com/840394 [ linux no-skia-renderer ] Pixel_OffscreenCanvas2DResizeOnWorker [ RetryOnFailure ] crbug.com/840394 [ mac ] Pixel_OffscreenCanvas2DResizeOnWorker [ RetryOnFailure ] # TODO(kbr): temporary suppression for new test. @@ -162,13 +158,13 @@ # Fails on Nexus 5, 6 and 6P crbug.com/883500 [ android qualcomm-adreno-(tm)-330 ] Pixel_BackgroundImage [ Skip ] -crbug.com/883500 [ android no-use-gl no-use-vulkan qualcomm-adreno-(tm)-420 ] Pixel_BackgroundImage [ Skip ] -crbug.com/883500 [ android no-use-gl no-use-vulkan qualcomm-adreno-(tm)-430 ] Pixel_BackgroundImage [ Skip ] +crbug.com/883500 [ android qualcomm-adreno-(tm)-420 ] Pixel_BackgroundImage [ Skip ] +crbug.com/883500 [ android qualcomm-adreno-(tm)-430 ] Pixel_BackgroundImage [ Skip ] crbug.com/1029389 [ android qualcomm-adreno-(tm)-330 ] Pixel_PrecisionRoundedCorner [ Skip ] # Flakes on Nexus 5X. -crbug.com/883500 [ android-chromium no-use-gl no-use-vulkan qualcomm-adreno-(tm)-418 ] Pixel_BackgroundImage [ RetryOnFailure ] -crbug.com/1068620 [ android android-chromium no-use-gl no-use-vulkan qualcomm-adreno-(tm)-418 ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ RetryOnFailure ] +crbug.com/883500 [ android-chromium qualcomm-adreno-(tm)-418 ] Pixel_BackgroundImage [ RetryOnFailure ] +crbug.com/1068620 [ android android-chromium qualcomm-adreno-(tm)-418 ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ RetryOnFailure ] crbug.com/1065514 [ android android-chromium qualcomm-adreno-(tm)-418 ] Pixel_WebGLReadPixelsTabSwitch [ RetryOnFailure ] crbug.com/1121476 [ android android-chromium qualcomm-adreno-(tm)-418 ] Pixel_Canvas2DTabSwitch [ RetryOnFailure ] @@ -209,16 +205,17 @@ crbug.com/974380 [ mac ] Pixel_OffscreenCanvasUnaccelerated2DGPUCompositingWorker [ Skip ] # Skia Renderer, producing incorrect color in one quadrant -crbug.com/1008450 [ android use-vulkan skia-renderer ] Pixel_Video_BackdropFilter [ Skip ] -crbug.com/1008450 [ android skia-renderer ] Pixel_Video_MP4_Rounded_Corner [ Skip ] +crbug.com/1008450 [ android vulkan-skia-renderer ] Pixel_Video_BackdropFilter [ Skip ] +crbug.com/1008450 [ android gl-skia-renderer ] Pixel_Video_MP4_Rounded_Corner [ Skip ] +crbug.com/1008450 [ android vulkan-skia-renderer ] Pixel_Video_MP4_Rounded_Corner [ Skip ] # Produces blank images on Intel HD 630 w/ Mesa 19.0.2 -crbug.com/976861 [ linux intel-0x5912 no-use-skia-dawn ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ] +crbug.com/976861 [ linux intel-0x5912 no-skia-renderer ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ] # Producing incorrect image on Win10 Intel HD 630 and UHD 630 w/ 26.20.100.6912 # or later drivers. -crbug.com/997313 [ win intel-0x5912 no-use-skia-dawn ] Pixel_WebGL_PremultipliedAlpha_False [ Failure ] -crbug.com/997313 [ win intel-0x3e92 no-use-skia-dawn ] Pixel_WebGL_PremultipliedAlpha_False [ Failure ] +crbug.com/997313 [ win intel-0x5912 no-skia-renderer ] Pixel_WebGL_PremultipliedAlpha_False [ Failure ] +crbug.com/997313 [ win intel-0x3e92 no-skia-renderer ] Pixel_WebGL_PremultipliedAlpha_False [ Failure ] # Flakes on Nexus 9 or NVIDIA Shield TV crbug.com/1019462 [ android nvidia no-skia-renderer ] Pixel_Video_MP4_FourColors_Aspect_4x3 [ RetryOnFailure ] @@ -245,7 +242,7 @@ crbug.com/1069339 [ mac intel-0xd26 ] Pixel_OffscreenCanvasIBRCWebGLHighPerfWorker [ RetryOnFailure ] # VP9 appears to not recover correctly after GPU process crashes on Windows. -crbug.com/1033982 [ win nvidia no-use-skia-dawn ] Pixel_Video_Context_Loss_VP9 [ RetryOnFailure ] +crbug.com/1033982 [ win nvidia no-skia-renderer ] Pixel_Video_Context_Loss_VP9 [ RetryOnFailure ] # HDR rendering with PQ color space appears to be broken on Windows RS2. # TODO(sunnyps): Revert this temporary suppression after ensuring pixel tests @@ -254,109 +251,112 @@ # SkiaRenderer Dawn doesn't support accelerated canvas, webgl, video, or # direct composition. -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_Canvas2DTabSwitch [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatency2D [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatency2DDrawImage [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatency2DImageData [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatencyWebGL [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatencyWebGLAlphaFalse [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatencyWebGLDrawImage [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatencyWebGLRoundedCorners [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_CanvasLowLatencyWebGLOccluded [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_OffscreenCanvas2DResizeOnWorker [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_OffscreenCanvasTransferBeforeStyleResize [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_ScissorTestWithPreserveDrawingBuffer [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_Video_BackdropFilter [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_Video_Context_Loss_MP4 [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_Video_Context_Loss_VP9 [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_Video_MP4_Rounded_Corner [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_WebGL2_ClearBufferfv_Result_Displayed [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_WebGLReadPixelsTabSwitch [ Skip ] -crbug.com/1021566 [ linux use-skia-dawn ] Pixel_WebGL_PremultipliedAlpha_False [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Canvas2DTabSwitch [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatency2D [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatency2DDrawImage [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatency2DImageData [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatencyWebGL [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatencyWebGLAlphaFalse [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatencyWebGLDrawImage [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatencyWebGLRoundedCorners [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_CanvasLowLatencyWebGLOccluded [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_OffscreenCanvas2DResizeOnWorker [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_OffscreenCanvasTransferBeforeStyleResize [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_ScissorTestWithPreserveDrawingBuffer [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Video_BackdropFilter [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Video_Context_Loss_MP4 [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Video_Context_Loss_VP9 [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Video_MP4_DXVA [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Video_MP4_Rounded_Corner [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_Video_VP9_DXVA [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_WebGL2_ClearBufferfv_Result_Displayed [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_WebGLReadPixelsTabSwitch [ Skip ] -crbug.com/1021566 [ win use-skia-dawn ] Pixel_WebGL_PremultipliedAlpha_False [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_2DCanvasWebGL [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_Canvas2DRedBox [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_Canvas2DRedBoxScrgbLinear [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_Canvas2DUntagged [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Underlay [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Underlay_DXVA [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Underlay_Fullsize [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_BackdropFilter [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_Disable_Overlays [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_DXVA [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_FourColors_Aspect_4x3 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_FourColors_Rot_180 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_FourColors_Rot_270 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_FourColors_Rot_90 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_Fullsize [ Skip ] -crbug.com/1021566 [ use-skia-dawn skia-renderer ] Pixel_DirectComposition_Video_MP4_Rounded_Corner [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_NV12 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_YUY2 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_BGRA [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_MP4_VP_SCALING [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_DXVA [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_Fullsize [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_I420A [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_NV12 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_YUY2 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_BGRA [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_DirectComposition_Video_VP9_VP_SCALING [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasAccelerated2D [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasAccelerated2DWorker [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasIBRCWebGLMain [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasIBRCWebGLWorker [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasTransferAfterStyleResize [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasTransferToImageBitmapWorker [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasWebGLDefault [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasWebGLDefaultWorker [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_OffscreenCanvasWebglResizeOnWorker [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_RepeatedWebGLTo2D [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_Video_MP4 [ Skip ] -crbug.com/1021566 [ use-skia-dawn skia-renderer ] Pixel_Video_MP4_FourColors_Aspect_4x3 [ Skip ] -crbug.com/1021566 [ use-skia-dawn skia-renderer ] Pixel_Video_MP4_FourColors_Rot_180 [ Skip ] -crbug.com/1021566 [ use-skia-dawn skia-renderer ] Pixel_Video_MP4_FourColors_Rot_270 [ Skip ] -crbug.com/1021566 [ use-skia-dawn skia-renderer ] Pixel_Video_MP4_FourColors_Rot_90 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_Video_VP9 [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_WebGLCopyImage [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_WebGLGreenTriangle_AA_Alpha [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_WebGLGreenTriangle_AA_NoAlpha [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_WebGLGreenTriangle_NoAA_Alpha [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_WebGLGreenTriangle_NoAA_NoAlpha [ Skip ] -crbug.com/1021566 [ use-skia-dawn ] Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_Canvas2DTabSwitch [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatency2D [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatency2DDrawImage [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatency2DImageData [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGL [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLAlphaFalse [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLDrawImage [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLRoundedCorners [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLOccluded [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_OffscreenCanvas2DResizeOnWorker [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_OffscreenCanvasTransferBeforeStyleResize [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_ScissorTestWithPreserveDrawingBuffer [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_Video_BackdropFilter [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_Video_Context_Loss_MP4 [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_Video_Context_Loss_VP9 [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_Video_MP4_Rounded_Corner [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_WebGL2_ClearBufferfv_Result_Displayed [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_WebGLCopyImage [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_WebGLReadPixelsTabSwitch [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_WebGL_PremultipliedAlpha_False [ Skip ] +crbug.com/1021566 [ linux dawn-skia-renderer ] Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Canvas2DTabSwitch [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatency2D [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatency2DDrawImage [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatency2DImageData [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGL [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLAlphaFalse [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLDrawImage [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLRoundedCorners [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_CanvasLowLatencyWebGLOccluded [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_OffscreenCanvas2DResizeOnWorker [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_OffscreenCanvasTransferBeforeStyleResize [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_OffscreenCanvasWebGLPaintAfterResize [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_ScissorTestWithPreserveDrawingBuffer [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_BackdropFilter [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_Context_Loss_MP4 [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_Context_Loss_VP9 [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_MP4_DXVA [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_MP4_Rounded_Corner [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_Video_VP9_DXVA [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_WebGL2_BlitFramebuffer_Result_Displayed [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_WebGL2_ClearBufferfv_Result_Displayed [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_WebGLCopyImage [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_WebGLReadPixelsTabSwitch [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_WebGL_PremultipliedAlpha_False [ Skip ] +crbug.com/1021566 [ win dawn-skia-renderer ] Pixel_WebGLTransparentGreenTriangle_NoAlpha_ImplicitClear [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_2DCanvasWebGL [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Canvas2DRedBox [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Canvas2DRedBoxScrgbLinear [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Canvas2DUntagged [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Underlay [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Underlay_DXVA [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Underlay_Fullsize [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_BackdropFilter [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_Disable_Overlays [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_DXVA [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_FourColors_Aspect_4x3 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_FourColors_Rot_180 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_FourColors_Rot_270 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_FourColors_Rot_90 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_Fullsize [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_Rounded_Corner [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_NV12 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_YUY2 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_BGRA [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_MP4_VP_SCALING [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_DXVA [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_Fullsize [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_I420A [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_NV12 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_YUY2 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_BGRA [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_DirectComposition_Video_VP9_VP_SCALING [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasAccelerated2D [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasAccelerated2DWorker [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasIBRCWebGLMain [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasIBRCWebGLWorker [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasTransferAfterStyleResize [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasTransferToImageBitmap [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasTransferToImageBitmapWorker [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasWebGLDefault [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasWebGLDefaultWorker [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_OffscreenCanvasWebglResizeOnWorker [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_RepeatedWebGLTo2D [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Video_MP4 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Video_MP4_FourColors_Aspect_4x3 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Video_MP4_FourColors_Rot_180 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Video_MP4_FourColors_Rot_270 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Video_MP4_FourColors_Rot_90 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_Video_VP9 [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_WebGLGreenTriangle_AA_Alpha [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_WebGLGreenTriangle_AA_NoAlpha [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_WebGLGreenTriangle_NoAA_Alpha [ Skip ] +crbug.com/1021566 [ dawn-skia-renderer ] Pixel_WebGLGreenTriangle_NoAA_NoAlpha [ Skip ] # DirectComposition tests are not expected to work properly on Windows 7. crbug.com/1086758 [ win7 ] Pixel_DirectComposition* [ Skip ] # 3D box is shaded incorrectly using SkiaRenderer Dawn on Windows. -crbug.com/1082769 [ win use-skia-dawn ] Pixel_CSS3DBlueBox [ Failure ] +crbug.com/1082769 [ win dawn-skia-renderer ] Pixel_CSS3DBlueBox [ Failure ] # Flakes on gpu-fyi-try-chromeos-kevin and Fuchsia x64, produces notably different image. crbug.com/1086687 [ chromeos chromeos-board-kevin ] Pixel_PrecisionRoundedCorner [ Skip ] @@ -369,9 +369,9 @@ crbug.com/1086690 [ chromeos ] Pixel_WebGLSadCanvas [ Skip ] # Likely produces a Dawn validation errors that makes rendering skipped. -crbug.com/1097735 [ use-skia-dawn ] Pixel_PaintWorkletTransform [ Failure ] +crbug.com/1097735 [ dawn-skia-renderer ] Pixel_PaintWorkletTransform [ Failure ] # Cannot use file in Chromium checkout for fake video capture device on Android # or ChromeOS. -crbug.com/1129879 [ android no-use-skia-dawn ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ] -crbug.com/1129879 [ chromeos no-use-skia-dawn ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ] +crbug.com/1129879 [ android ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ] +crbug.com/1129879 [ chromeos ] Pixel_Video_Media_Stream_Incompatible_Stride [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 7e40b448..321c3df1 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -4,7 +4,7 @@ # mac highsierra mojave sierra catalina # win win7 win10] # tags: [ desktop mobile ] -# tags: [ d3d11 no-angle vulkan opengl opengles no-use-gl ] +# tags: [ angle-d3d11 angle-no-backend angle-vulkan angle-opengl angle-opengles ] # tags: [ passthrough no-passthrough ] # tags: [ intel intel-0x3e92 intel-0x5912 intel-0xa2e # amd amd-0x6613 amd-0x699f amd-0x679e amd-0x6821 @@ -76,27 +76,26 @@ crbug.com/1131224 conformance2/rendering/framebuffer-mismatched-attachment-targets.html [ Failure ] crbug.com/1108044 conformance2/renderbuffers/readbuffer.html [ Failure ] crbug.com/1108086 [ no-passthrough ] conformance2/renderbuffers/framebuffer-object-attachment.html [ Failure ] -crbug.com/angleproject/4807 [ win d3d11 passthrough ] conformance2/glsl3/switch-case.html [ Failure ] +crbug.com/angleproject/4807 [ win angle-d3d11 passthrough ] conformance2/glsl3/switch-case.html [ Failure ] crbug.com/1081973 conformance/buffers/buffer-data-and-buffer-sub-data.html [ Failure ] crbug.com/1082455 [ win ] conformance2/renderbuffers/multisampled-depth-renderbuffer-initialization.html [ Failure ] crbug.com/1082455 [ linux ] conformance2/renderbuffers/multisampled-depth-renderbuffer-initialization.html [ Failure ] crbug.com/1082455 [ android ] conformance2/renderbuffers/multisampled-depth-renderbuffer-initialization.html [ Failure ] crbug.com/1082455 [ mac no-passthrough ] conformance2/renderbuffers/multisampled-depth-renderbuffer-initialization.html [ Failure ] crbug.com/1082533 [ mac intel ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1082533 [ win vulkan passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1018028 [ win vulkan ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] +crbug.com/1082533 [ win angle-vulkan passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] +crbug.com/1018028 [ win angle-vulkan ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] crbug.com/angleproject/5038 conformance/extensions/ext-color-buffer-half-float.html [ Skip ] crbug.com/953120 conformance/programs/program-handling.html [ Failure ] -crbug.com/949249 [ win passthrough opengl nvidia ] conformance2/extensions/ovr_multiview2.html [ Failure ] -crbug.com/949249 [ win passthrough no-use-gl ] conformance2/extensions/ovr_multiview2.html [ Failure ] -crbug.com/949249 [ win passthrough d3d11 ] conformance2/extensions/ovr_multiview2.html [ Failure ] -crbug.com/949249 [ linux passthrough opengl ] conformance2/extensions/ovr_multiview2.html [ Failure ] +crbug.com/949249 [ win passthrough angle-opengl nvidia ] conformance2/extensions/ovr_multiview2.html [ Failure ] +crbug.com/949249 [ win passthrough angle-d3d11 ] conformance2/extensions/ovr_multiview2.html [ Failure ] +crbug.com/949249 [ linux passthrough angle-opengl ] conformance2/extensions/ovr_multiview2.html [ Failure ] # Failing new test crbug.com/874620 [ linux nvidia ] conformance2/glsl3/const-struct-from-array-as-function-parameter.html [ Failure ] -crbug.com/874620 [ opengl win nvidia ] conformance2/glsl3/const-struct-from-array-as-function-parameter.html [ Failure ] +crbug.com/874620 [ angle-opengl win nvidia ] conformance2/glsl3/const-struct-from-array-as-function-parameter.html [ Failure ] # Too slow (take about one hour to run) crbug.com/619403 deqp/functional/gles3/builtinprecision/* [ Skip ] @@ -120,11 +119,11 @@ crbug.com/979444 [ linux ] conformance/textures/misc/texture-corner-case-videos.html [ RetryOnFailure ] crbug.com/979444 [ mac no-asan no-passthrough ] conformance/textures/misc/texture-corner-case-videos.html [ RetryOnFailure ] crbug.com/979444 [ win ] conformance/textures/misc/texture-corner-case-videos.html [ RetryOnFailure ] -crbug.com/979444 [ android no-angle ] conformance/textures/misc/texture-corner-case-videos.html [ RetryOnFailure ] +crbug.com/979444 [ android angle-no-backend ] conformance/textures/misc/texture-corner-case-videos.html [ RetryOnFailure ] # Nvidia bugs fixed in latest driver # TODO(http://crbug.com/887241): Upgrade the drivers on the bots. -crbug.com/798117 [ vulkan win nvidia ] conformance/glsl/bugs/assign-to-swizzled-twice-in-function.html [ Failure ] +crbug.com/798117 [ angle-vulkan win nvidia ] conformance/glsl/bugs/assign-to-swizzled-twice-in-function.html [ Failure ] crbug.com/798117 [ linux nvidia ] conformance/glsl/bugs/assign-to-swizzled-twice-in-function.html [ Failure ] crbug.com/792210 [ nvidia ] conformance/glsl/bugs/in-parameter-passed-as-inout-argument-and-global.html [ Failure ] @@ -132,15 +131,15 @@ # Win failures # #################### -crbug.com/angleproject/4417 [ win d3d11 ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] -crbug.com/angleproject/4417 [ win d3d11 ] conformance2/rendering/framebuffer-render-to-layer-angle-issue.html [ Failure ] -crbug.com/1127867 [ win d3d11 ] conformance2/textures/image_data/tex-3d-rgb565-rgb-unsigned_byte.html [ RetryOnFailure ] +crbug.com/angleproject/4417 [ win angle-d3d11 ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] +crbug.com/angleproject/4417 [ win angle-d3d11 ] conformance2/rendering/framebuffer-render-to-layer-angle-issue.html [ Failure ] +crbug.com/1127867 [ win angle-d3d11 ] conformance2/textures/image_data/tex-3d-rgb565-rgb-unsigned_byte.html [ RetryOnFailure ] # Intel flaky issues -crbug.com/1122744 [ win d3d11 intel ] conformance/textures/misc/texparameter-test.html [ RetryOnFailure ] -crbug.com/912579 [ opengl win passthrough intel ] conformance2/rendering/out-of-bounds-index-buffers-after-copying.html [ RetryOnFailure ] +crbug.com/1122744 [ win angle-d3d11 intel ] conformance/textures/misc/texparameter-test.html [ RetryOnFailure ] +crbug.com/912579 [ angle-opengl win passthrough intel ] conformance2/rendering/out-of-bounds-index-buffers-after-copying.html [ RetryOnFailure ] crbug.com/1114780 [ win intel ] deqp/functional/gles3/multisample.html [ RetryOnFailure ] -crbug.com/1127867 [ win d3d11 intel ] conformance2/textures/image_data/tex-3d-r16f-red-half_float.html [ RetryOnFailure ] +crbug.com/1127867 [ win angle-d3d11 intel ] conformance2/textures/image_data/tex-3d-r16f-red-half_float.html [ RetryOnFailure ] # Flakily times out on driver 26.20.100.8141. crbug.com/1093482 [ win10 intel-0x3e92 ] deqp/functional/gles3/shadermatrix/div_dynamic.html [ RetryOnFailure ] crbug.com/1093482 [ win10 intel-0x5912 ] deqp/functional/gles3/shadermatrix/div_dynamic.html [ RetryOnFailure ] @@ -148,30 +147,30 @@ crbug.com/1093482 [ win10 intel-0x5912 ] deqp/functional/gles3/shadermatrix/sub_dynamic.html [ RetryOnFailure ] # Intel failed issues -crbug.com/angleproject/2994 [ opengl win passthrough intel ] conformance2/textures/misc/copy-texture-image-same-texture.html [ Failure ] -crbug.com/1042246 [ opengl win passthrough intel ] conformance2/extensions/ext-texture-norm16.html [ Skip ] +crbug.com/angleproject/2994 [ angle-opengl win passthrough intel ] conformance2/textures/misc/copy-texture-image-same-texture.html [ Failure ] +crbug.com/1042246 [ angle-opengl win passthrough intel ] conformance2/extensions/ext-texture-norm16.html [ Skip ] # Intel driver issues -crbug.com/795030 [ win intel opengl passthrough intel_lt_27.20.100.8280 ] deqp/functional/gles3/shadercommonfunction.html [ Failure ] -crbug.com/602688 [ win intel opengl passthrough intel_lt_26.20.100.7870 ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] -crbug.com/1082565 [ win intel opengl passthrough intel_lt_26.20.100.8141 ] conformance/canvas/webgl-to-2d-canvas.html [ Failure ] +crbug.com/795030 [ win intel angle-opengl passthrough intel_lt_27.20.100.8280 ] deqp/functional/gles3/shadercommonfunction.html [ Failure ] +crbug.com/602688 [ win intel angle-opengl passthrough intel_lt_26.20.100.7870 ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] +crbug.com/1082565 [ win intel angle-opengl passthrough intel_lt_26.20.100.8141 ] conformance/canvas/webgl-to-2d-canvas.html [ Failure ] # This case causes no-over-optimization-on-uniform-array fail. -crbug.com/884210 [ opengl win passthrough intel ] conformance/ogles/GL/gl_FragCoord/gl_FragCoord_001_to_003.html [ Skip ] +crbug.com/884210 [ angle-opengl win passthrough intel ] conformance/ogles/GL/gl_FragCoord/gl_FragCoord_001_to_003.html [ Skip ] -crbug.com/602688 [ opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance/glsl/constructors/glsl-construct-mat2.html [ Failure ] -crbug.com/602688 [ opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance2/textures/misc/texture-npot.html [ Failure ] -crbug.com/854100 [ opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance/glsl/variables/gl-pointcoord.html [ Failure ] -crbug.com/957631 [ opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance2/rendering/element-index-uint.html [ Failure ] -crbug.com/angleproject/2880 [ opengl win passthrough intel intel_lt_25.20.100.6577 ] deqp/functional/gles3/shaderbuiltinvar.html [ Failure ] +crbug.com/602688 [ angle-opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance/glsl/constructors/glsl-construct-mat2.html [ Failure ] +crbug.com/602688 [ angle-opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance2/textures/misc/texture-npot.html [ Failure ] +crbug.com/854100 [ angle-opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance/glsl/variables/gl-pointcoord.html [ Failure ] +crbug.com/957631 [ angle-opengl win passthrough intel intel_lt_25.20.100.6577 ] conformance2/rendering/element-index-uint.html [ Failure ] +crbug.com/angleproject/2880 [ angle-opengl win passthrough intel intel_lt_25.20.100.6577 ] deqp/functional/gles3/shaderbuiltinvar.html [ Failure ] # This is an OpenGL driver bug on Intel platform and it is fixed in # Intel Driver 25.20.100.6444. # Case no-over-optimization-on-uniform-array-08 always fail if run # case gl-min-uniforms first. # Temporarily skip these two cases now. -crbug.com/953243 [ opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/limits/gl-min-uniforms.html [ Skip ] -crbug.com/953243 [ opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/uniforms/no-over-optimization-on-uniform-array-08.html [ Skip ] +crbug.com/953243 [ angle-opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/limits/gl-min-uniforms.html [ Skip ] +crbug.com/953243 [ angle-opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/uniforms/no-over-optimization-on-uniform-array-08.html [ Skip ] # This is an OpenGL driver bug on Intel platform and it is fixed in # Intel Driver 25.20.100.6444. @@ -179,69 +178,65 @@ # case biuDepthRange_001_to_002 first. # Temporarily skip these two cases now because this issue blocks # WEBGL_video_texture implementation. -crbug.com/907195 [ opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/ogles/GL/biuDepthRange/biuDepthRange_001_to_002.html [ Skip ] -crbug.com/907195 [ opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/uniforms/no-over-optimization-on-uniform-array-09.html [ Skip ] +crbug.com/907195 [ angle-opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/ogles/GL/biuDepthRange/biuDepthRange_001_to_002.html [ Skip ] +crbug.com/907195 [ angle-opengl win passthrough intel intel_lt_25.20.100.6444 ] conformance/uniforms/no-over-optimization-on-uniform-array-09.html [ Skip ] -# TODO(crbug.com/1000354): Remove when angle workaround is applied to win opengles -crbug.com/1000354 [ win opengles ] conformance2/extensions/ext-texture-norm16.html [ Skip ] +# TODO(crbug.com/1000354): Remove when angle workaround is applied to win angle-opengles +crbug.com/1000354 [ win angle-opengles ] conformance2/extensions/ext-texture-norm16.html [ Skip ] # Windows only. crbug.com/736926 [ win ] conformance2/textures/svg_image/tex-2d-rgb565-rgb-unsigned_short_5_6_5.html [ RetryOnFailure ] crbug.com/angleproject/3033 [ win no-passthrough ] conformance2/textures/misc/generate-mipmap-with-large-base-level.html [ Failure ] -crbug.com/angleproject/1465 [ win no-use-gl ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ] -crbug.com/angleproject/1465 [ win d3d11 ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ] +crbug.com/angleproject/1465 [ win angle-d3d11 ] conformance2/glsl3/tricky-loop-conditions.html [ Failure ] # Win / NVidia -crbug.com/679639 [ d3d11 win nvidia ] conformance2/rendering/draw-with-integer-texture-base-level.html [ Failure ] +crbug.com/679639 [ angle-d3d11 win nvidia ] conformance2/rendering/draw-with-integer-texture-base-level.html [ Failure ] # Flake seen once. -crbug.com/691951 [ d3d11 win nvidia ] deqp/functional/gles3/shaderoperator/binary_operator_11.html [ RetryOnFailure ] -crbug.com/735464 [ d3d11 win nvidia ] deqp/functional/gles3/textureshadow/* [ RetryOnFailure ] -crbug.com/907544 [ vulkan win passthrough nvidia ] conformance/uniforms/uniform-default-values.html [ RetryOnFailure ] +crbug.com/691951 [ angle-d3d11 win nvidia ] deqp/functional/gles3/shaderoperator/binary_operator_11.html [ RetryOnFailure ] +crbug.com/735464 [ angle-d3d11 win nvidia ] deqp/functional/gles3/textureshadow/* [ RetryOnFailure ] +crbug.com/907544 [ angle-vulkan win passthrough nvidia ] conformance/uniforms/uniform-default-values.html [ RetryOnFailure ] # Related to either upgrade to Windows 10 1909 or driver 451.48 -crbug.com/1106078 [ win nvidia-0x1cb3 no-use-gl ] deqp/functional/gles3/shadertexturefunction/texturesize.html [ Failure ] -crbug.com/1106076 [ win nvidia-0x1cb3 no-use-gl ] conformance2/textures/misc/tex-3d-mipmap-levels-intel-bug.html [ Failure ] -crbug.com/1106076 [ win nvidia-0x1cb3 no-use-gl ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] -crbug.com/1106078 [ d3d11 win nvidia-0x1cb3 ] deqp/functional/gles3/shadertexturefunction/texturesize.html [ Failure ] -crbug.com/1106076 [ d3d11 win nvidia-0x1cb3 ] conformance2/textures/misc/tex-3d-mipmap-levels-intel-bug.html [ Failure ] -crbug.com/1106076 [ d3d11 win nvidia-0x1cb3 ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] +crbug.com/1106078 [ angle-d3d11 win nvidia-0x1cb3 ] deqp/functional/gles3/shadertexturefunction/texturesize.html [ Failure ] +crbug.com/1106076 [ angle-d3d11 win nvidia-0x1cb3 ] conformance2/textures/misc/tex-3d-mipmap-levels-intel-bug.html [ Failure ] +crbug.com/1106076 [ angle-d3d11 win nvidia-0x1cb3 ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] # Win / NVIDIA Quadro P400 / D3D11 flaky failures -crbug.com/680754 [ d3d11 win nvidia-0x1cb3 ] deqp/data/gles3/shaders/functions.html [ Failure ] -crbug.com/921052 [ d3d11 win nvidia-0x1cb3 ] deqp/functional/gles3/framebufferblit/depth_stencil.html [ Skip ] -crbug.com/1054795 [ d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/basic_types_interleaved_triangles.html [ Failure ] -crbug.com/1054795 [ d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/basic_types_separate_triangles.html [ Failure ] -crbug.com/1054795 [ d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/random_interleaved_triangles.html [ Failure ] -crbug.com/1054795 [ d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/random_separate_triangles.html [ Failure ] -crbug.com/1054795 [ d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/interpolation_flat.html [ Failure ] -crbug.com/966143 [ d3d11 win7 nvidia-0x1cb3 ] conformance/attribs/gl-vertex-attrib-unconsumed-out-of-bounds.html [ RetryOnFailure ] -crbug.com/966143 [ d3d11 win7 nvidia-0x1cb3 ] conformance/attribs/gl-vertex-attrib-zero-issues.html [ RetryOnFailure ] -crbug.com/728670 [ d3d11 win nvidia-0x1cb3 ] conformance/extensions/oes-texture-half-float-with-video.html [ RetryOnFailure ] -crbug.com/728670 [ d3d11 win nvidia-0x1cb3 ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ RetryOnFailure ] -crbug.com/728670 [ d3d11 win nvidia-0x1cb3 ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ RetryOnFailure ] -crbug.com/728670 [ d3d11 win nvidia-0x1cb3 ] conformance2/textures/video/* [ RetryOnFailure ] -crbug.com/728670 [ d3d11 win nvidia-0x1cb3 ] conformance2/textures/image_bitmap_from_video/* [ RetryOnFailure ] +crbug.com/680754 [ angle-d3d11 win nvidia-0x1cb3 ] deqp/data/gles3/shaders/functions.html [ Failure ] +crbug.com/921052 [ angle-d3d11 win nvidia-0x1cb3 ] deqp/functional/gles3/framebufferblit/depth_stencil.html [ Skip ] +crbug.com/1054795 [ angle-d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/basic_types_interleaved_triangles.html [ Failure ] +crbug.com/1054795 [ angle-d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/basic_types_separate_triangles.html [ Failure ] +crbug.com/1054795 [ angle-d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/random_interleaved_triangles.html [ Failure ] +crbug.com/1054795 [ angle-d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/random_separate_triangles.html [ Failure ] +crbug.com/1054795 [ angle-d3d11 win7 nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/interpolation_flat.html [ Failure ] +crbug.com/966143 [ angle-d3d11 win7 nvidia-0x1cb3 ] conformance/attribs/gl-vertex-attrib-unconsumed-out-of-bounds.html [ RetryOnFailure ] +crbug.com/966143 [ angle-d3d11 win7 nvidia-0x1cb3 ] conformance/attribs/gl-vertex-attrib-zero-issues.html [ RetryOnFailure ] +crbug.com/728670 [ angle-d3d11 win nvidia-0x1cb3 ] conformance/extensions/oes-texture-half-float-with-video.html [ RetryOnFailure ] +crbug.com/728670 [ angle-d3d11 win nvidia-0x1cb3 ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ RetryOnFailure ] +crbug.com/728670 [ angle-d3d11 win nvidia-0x1cb3 ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ RetryOnFailure ] +crbug.com/728670 [ angle-d3d11 win nvidia-0x1cb3 ] conformance2/textures/video/* [ RetryOnFailure ] +crbug.com/728670 [ angle-d3d11 win nvidia-0x1cb3 ] conformance2/textures/image_bitmap_from_video/* [ RetryOnFailure ] # Win / NVIDIA GeForce GTX 1660 / D3D11 flaky failures -crbug.com/angleproject/4377 [ d3d11 win nvidia-0x2184 ] conformance/attribs/gl-vertex-attrib-unconsumed-out-of-bounds.html [ RetryOnFailure ] -crbug.com/1057635 [ d3d11 win nvidia-0x2184 ] deqp/functional/gles3/framebufferblit/depth_stencil.html [ RetryOnFailure ] -crbug.com/1073613 [ d3d11 win nvidia-0x2184 ] conformance2/textures/misc/tex-3d-mipmap-levels-intel-bug.html [ Failure ] -crbug.com/1073613 [ d3d11 win nvidia-0x2184 ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] -crbug.com/1073613 [ d3d11 win nvidia-0x2184 ] deqp/functional/gles3/shadertexturefunction/texturesize.html [ Failure ] +crbug.com/angleproject/4377 [ angle-d3d11 win nvidia-0x2184 ] conformance/attribs/gl-vertex-attrib-unconsumed-out-of-bounds.html [ RetryOnFailure ] +crbug.com/1057635 [ angle-d3d11 win nvidia-0x2184 ] deqp/functional/gles3/framebufferblit/depth_stencil.html [ RetryOnFailure ] +crbug.com/1073613 [ angle-d3d11 win nvidia-0x2184 ] conformance2/textures/misc/tex-3d-mipmap-levels-intel-bug.html [ Failure ] +crbug.com/1073613 [ angle-d3d11 win nvidia-0x2184 ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] +crbug.com/1073613 [ angle-d3d11 win nvidia-0x2184 ] deqp/functional/gles3/shadertexturefunction/texturesize.html [ Failure ] # WIN / OpenGL / NVIDIA failures -crbug.com/963205 [ win nvidia opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc.html [ RetryOnFailure ] -crbug.com/963205 [ win nvidia opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ RetryOnFailure ] -crbug.com/715001 [ opengl win nvidia ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] -crbug.com/703779 [ opengl win nvidia ] conformance/textures/misc/texture-size.html [ Failure ] -crbug.com/921055 [ opengl win passthrough nvidia-0x1cb3 ] conformance2/textures/image_bitmap_from_image_data/tex-2d-rgb9_e5-rgb-float.html [ RetryOnFailure ] -crbug.com/905003 [ opengl win passthrough nvidia ] conformance2/textures/misc/integer-cubemap-specification-order-bug.html [ Failure ] -crbug.com/887578 [ opengl win passthrough nvidia ] deqp/data/gles3/shaders/conversions.html [ RetryOnFailure ] -crbug.com/965648 [ opengl win passthrough nvidia-0x1cb3 ] deqp/functional/gles3/shaderstruct.html [ RetryOnFailure ] -crbug.com/822733 [ opengl win nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/* [ RetryOnFailure ] -crbug.com/1060024 [ opengl win passthrough nvidia ] deqp/functional/gles3/shaderloop_do_while.html [ RetryOnFailure ] -crbug.com/1060024 [ opengl win passthrough nvidia ] deqp/functional/gles3/shaderloop_for.html [ RetryOnFailure ] -crbug.com/1060024 [ opengl win passthrough nvidia ] deqp/functional/gles3/shaderloop_while.html [ RetryOnFailure ] -crbug.com/angleproject/4555 [ win opengl passthrough nvidia ] conformance/misc/type-conversion-test.html [ Skip ] +crbug.com/963205 [ win nvidia angle-opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc.html [ RetryOnFailure ] +crbug.com/963205 [ win nvidia angle-opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ RetryOnFailure ] +crbug.com/715001 [ angle-opengl win nvidia ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] +crbug.com/703779 [ angle-opengl win nvidia ] conformance/textures/misc/texture-size.html [ Failure ] +crbug.com/921055 [ angle-opengl win passthrough nvidia-0x1cb3 ] conformance2/textures/image_bitmap_from_image_data/tex-2d-rgb9_e5-rgb-float.html [ RetryOnFailure ] +crbug.com/905003 [ angle-opengl win passthrough nvidia ] conformance2/textures/misc/integer-cubemap-specification-order-bug.html [ Failure ] +crbug.com/887578 [ angle-opengl win passthrough nvidia ] deqp/data/gles3/shaders/conversions.html [ RetryOnFailure ] +crbug.com/965648 [ angle-opengl win passthrough nvidia-0x1cb3 ] deqp/functional/gles3/shaderstruct.html [ RetryOnFailure ] +crbug.com/822733 [ angle-opengl win nvidia-0x1cb3 ] deqp/functional/gles3/transformfeedback/* [ RetryOnFailure ] +crbug.com/1060024 [ angle-opengl win passthrough nvidia ] deqp/functional/gles3/shaderloop_do_while.html [ RetryOnFailure ] +crbug.com/1060024 [ angle-opengl win passthrough nvidia ] deqp/functional/gles3/shaderloop_for.html [ RetryOnFailure ] +crbug.com/1060024 [ angle-opengl win passthrough nvidia ] deqp/functional/gles3/shaderloop_while.html [ RetryOnFailure ] +crbug.com/angleproject/4555 [ win angle-opengl passthrough nvidia ] conformance/misc/type-conversion-test.html [ Skip ] # Win / AMD @@ -250,50 +245,50 @@ # (72, 72, 72) when reading back pixels, rather than the expected values. # Going to try to skip the individual failing tests, rather than adding a # wildcard flaky suppression for all of the tests. -crbug.com/844483 [ d3d11 win amd ] conformance2/renderbuffers/multisampled-renderbuffer-initialization.html [ Skip ] -crbug.com/844483 [ d3d11 win amd ] conformance2/textures/canvas/tex-2d-rgb9_e5-rgb-float.html [ Skip ] -crbug.com/844483 [ d3d11 win amd ] conformance2/textures/canvas/tex-2d-rgb9_e5-rgb-half_float.html [ Skip ] -crbug.com/844483 [ d3d11 win amd ] conformance2/textures/canvas/tex-3d-rg8-rg-unsigned_byte.html [ Skip ] -crbug.com/844483 [ d3d11 win amd ] conformance2/textures/image_bitmap_from_canvas/tex-2d-rgb9_e5-rgb-float.html [ Skip ] -crbug.com/844483 [ d3d11 win amd ] conformance2/textures/image_bitmap_from_canvas/tex-2d-rgb9_e5-rgb-half_float.html [ Skip ] -crbug.com/844483 [ d3d11 win amd ] deqp/functional/gles3/texturefiltering/2d_array_combinations_05.html [ Skip ] -crbug.com/483282 [ d3d11 win amd ] conformance2/rendering/blitframebuffer-stencil-only.html [ Failure ] -crbug.com/828984 [ d3d11 win amd ] deqp/functional/gles3/draw/draw_arrays_instanced.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] deqp/functional/gles3/draw/draw_elements.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] deqp/functional/gles3/draw/draw_range_elements.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] deqp/functional/gles3/draw/random.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] deqp/functional/gles3/samplerobject.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] deqp/functional/gles3/textureshadow/2d_array_nearest_mipmap_linear_less.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance/glsl/bugs/logic-inside-block-without-braces.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance/glsl/functions/glsl-function-mod-float.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance/renderbuffers/renderbuffer-initialization.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance2/glsl3/vector-dynamic-indexing.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb9_e5-rgb-half_float.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb9_e5-rgb-float.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb32f-rgb-float.html [ RetryOnFailure ] -crbug.com/844483 [ d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ RetryOnFailure ] -crbug.com/828984 [ d3d11 win amd ] conformance2/textures/misc/copy-texture-image-webgl-specific.html [ RetryOnFailure ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/renderbuffers/multisampled-renderbuffer-initialization.html [ Skip ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/textures/canvas/tex-2d-rgb9_e5-rgb-float.html [ Skip ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/textures/canvas/tex-2d-rgb9_e5-rgb-half_float.html [ Skip ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/textures/canvas/tex-3d-rg8-rg-unsigned_byte.html [ Skip ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/textures/image_bitmap_from_canvas/tex-2d-rgb9_e5-rgb-float.html [ Skip ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/textures/image_bitmap_from_canvas/tex-2d-rgb9_e5-rgb-half_float.html [ Skip ] +crbug.com/844483 [ angle-d3d11 win amd ] deqp/functional/gles3/texturefiltering/2d_array_combinations_05.html [ Skip ] +crbug.com/483282 [ angle-d3d11 win amd ] conformance2/rendering/blitframebuffer-stencil-only.html [ Failure ] +crbug.com/828984 [ angle-d3d11 win amd ] deqp/functional/gles3/draw/draw_arrays_instanced.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] deqp/functional/gles3/draw/draw_elements.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] deqp/functional/gles3/draw/draw_range_elements.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] deqp/functional/gles3/draw/random.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] deqp/functional/gles3/samplerobject.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] deqp/functional/gles3/textureshadow/2d_array_nearest_mipmap_linear_less.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance/glsl/bugs/logic-inside-block-without-braces.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance/glsl/functions/glsl-function-mod-float.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance/renderbuffers/renderbuffer-initialization.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance2/glsl3/vector-dynamic-indexing.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb9_e5-rgb-half_float.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb9_e5-rgb-float.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb32f-rgb-float.html [ RetryOnFailure ] +crbug.com/844483 [ angle-d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ RetryOnFailure ] +crbug.com/828984 [ angle-d3d11 win amd ] conformance2/textures/misc/copy-texture-image-webgl-specific.html [ RetryOnFailure ] crbug.com/878780 [ win amd ] conformance2/textures/webgl_canvas/* [ RetryOnFailure ] crbug.com/992457 [ win amd ] conformance2/textures/canvas_sub_rectangle/tex-2d-srgb8-rgb-unsigned_byte.html [ RetryOnFailure ] # Recent AMD drivers seem to have a regression with 3D textures. # (Some of these tests seem to occasionally pass unexpectedly.) -crbug.com/angleproject/2424 [ d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-3d-* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] conformance2/textures/image/tex-3d-* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] conformance2/textures/image_data/tex-3d-* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] conformance2/textures/misc/tex-unpack-params.html [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] conformance2/textures/video/tex-3d-* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/shadertexturefunction/* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/texturefiltering/3d_* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/texturespecification/basic_teximage3d_3d_* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/texturespecification/basic_texsubimage3d_* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/texturespecification/teximage3d_pbo_3d* [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/texturespecification/teximage3d_unpack_params.html [ Failure ] -crbug.com/angleproject/2424 [ d3d11 win amd ] deqp/functional/gles3/texturespecification/texsubimage3d_unpack_params.html [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] conformance2/textures/canvas_sub_rectangle/tex-3d-* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] conformance2/textures/image/tex-3d-* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] conformance2/textures/image_data/tex-3d-* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] conformance2/textures/misc/tex-unpack-params.html [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] conformance2/textures/video/tex-3d-* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/shadertexturefunction/* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/texturefiltering/3d_* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/texturespecification/basic_teximage3d_3d_* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/texturespecification/basic_texsubimage3d_* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/texturespecification/teximage3d_pbo_3d* [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/texturespecification/teximage3d_unpack_params.html [ Failure ] +crbug.com/angleproject/2424 [ angle-d3d11 win amd ] deqp/functional/gles3/texturespecification/texsubimage3d_unpack_params.html [ Failure ] # AMD texture handling has become flaky. -crbug.com/1110951 [ d3d11 win amd ] conformance/textures/misc/texture-sub-image-cube-maps.html [ RetryOnFailure ] +crbug.com/1110951 [ angle-d3d11 win amd ] conformance/textures/misc/texture-sub-image-cube-maps.html [ RetryOnFailure ] # Have seen this time out. Think it may be because it's currently # the first test that runs in the shard, and the browser might not @@ -304,15 +299,15 @@ crbug.com/angleproject/3354 [ win amd-0x699f ] deqp/functional/gles3/fborender/shared_colorbuffer_02.html [ Skip ] # Flaky on AMD Win7 -crbug.com/989050 [ d3d11 win7 amd ] conformance2/textures/misc/tex-unpack-params-imagedata.html [ RetryOnFailure ] +crbug.com/989050 [ angle-d3d11 win7 amd ] conformance2/textures/misc/tex-unpack-params-imagedata.html [ RetryOnFailure ] # Passthrough command decoder / OpenGL / Windows -crbug.com/835364 [ opengl win passthrough nvidia ] deqp/functional/gles3/fbocompleteness.html [ Failure ] -crbug.com/835364 [ opengl win passthrough ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ RetryOnFailure ] +crbug.com/835364 [ angle-opengl win passthrough nvidia ] deqp/functional/gles3/fbocompleteness.html [ Failure ] +crbug.com/835364 [ angle-opengl win passthrough ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ RetryOnFailure ] # Passthrough command decoder / Linux / OpenGL / NVIDIA -crbug.com/766918 [ opengl linux passthrough nvidia ] conformance2/textures/image_bitmap_from_video/* [ RetryOnFailure ] -crbug.com/965648 [ opengl linux passthrough nvidia ] deqp/functional/gles3/shaderstruct.html [ RetryOnFailure ] +crbug.com/766918 [ angle-opengl linux passthrough nvidia ] conformance2/textures/image_bitmap_from_video/* [ RetryOnFailure ] +crbug.com/965648 [ angle-opengl linux passthrough nvidia ] deqp/functional/gles3/shaderstruct.html [ RetryOnFailure ] # Flaky on Windows 10 1909 Intel HD 630/UHD 630 GPUs w/ 26.20.100.8141 crbug.com/1085222 [ win10 intel-0x3e92 ] deqp/functional/gles3/shaderoperator/binary_operator_* [ Skip ] @@ -333,8 +328,8 @@ crbug.com/1085222 [ linux intel-0x5912 ] deqp/functional/gles3/shadermatrix/add_* [ RetryOnFailure ] # Flaky direct composition failure on Windows 10 1909 Intel UHD 630 GPUs w/ 26.20.100.8141 -crbug.com/1087993 [ win10 intel-0x5912 d3d11 ] conformance2/textures/image_data/tex-2d-rgb8ui-rgb_integer-unsigned_byte.html [ RetryOnFailure ] -crbug.com/1087993 [ win10 intel-0x5912 d3d11 ] conformance2/textures/image_data/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ RetryOnFailure ] +crbug.com/1087993 [ win10 intel-0x5912 angle-d3d11 ] conformance2/textures/image_data/tex-2d-rgb8ui-rgb_integer-unsigned_byte.html [ RetryOnFailure ] +crbug.com/1087993 [ win10 intel-0x5912 angle-d3d11 ] conformance2/textures/image_data/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ RetryOnFailure ] #################### # Mac failures # @@ -344,7 +339,7 @@ crbug.com/angleproject/4417 [ mac no-passthrough ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] # Flakes heavily on many OpenGL configurations -crbug.com/832238 [ mac no-angle ] conformance2/transform_feedback/too-small-buffers.html [ Failure ] +crbug.com/832238 [ mac angle-no-backend ] conformance2/transform_feedback/too-small-buffers.html [ Failure ] # Regressions in 10.12.4. crbug.com/705865 [ sierra intel ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ] @@ -393,7 +388,7 @@ crbug.com/483282 [ mac nvidia-0xfe9 no-passthrough ] conformance2/glsl3/loops-with-side-effects.html [ Failure ] crbug.com/981122 [ mac nvidia-0xfe9 ] conformance2/rendering/framebuffer-completeness-draw-framebuffer.html [ RetryOnFailure ] crbug.com/996344 [ mac nvidia-0xfe9 ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ] -crbug.com/483282 [ no-angle mac nvidia-0xfe9 ] conformance2/textures/misc/tex-input-validation.html [ Failure ] +crbug.com/483282 [ angle-no-backend mac nvidia-0xfe9 ] conformance2/textures/misc/tex-input-validation.html [ Failure ] crbug.com/996344 [ mac nvidia-0xfe9 no-passthrough ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] crbug.com/682834 [ mac nvidia-0xfe9 ] conformance2/textures/image_bitmap_from_video/tex-2d-rgba16f-rgba-half_float.html [ RetryOnFailure ] crbug.com/784817 [ mac nvidia-0xfe9 ] conformance/glsl/bugs/init-array-with-loop.html [ Failure ] @@ -722,7 +717,7 @@ crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/rendering/framebuffer-completeness-unaffected.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z passthrough opengl ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-a12z passthrough angle-opengl ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/fbocompleteness.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/fbodepthbuffer.html [ Failure ] crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/shadertexturefunction/texturegrad.html [ Failure ] @@ -748,9 +743,9 @@ # Driver tag doesn't work on the passthrough command decoder because the detected driver version is ANGLE's version. crbug.com/1127180 [ linux intel no-passthrough mesa_ge_20.1 ] deqp/functional/gles3/shaderindexing/tmp.html [ Failure ] crbug.com/1127180 [ linux intel no-passthrough mesa_ge_20.1 ] deqp/data/gles3/shaders/functions.html [ Failure ] -crbug.com/1084864 [ linux intel opengl passthrough ] conformance2/rendering/blitframebuffer-filter-outofbounds.html [ Failure ] -crbug.com/1081978 [ linux intel opengl passthrough ] conformance2/textures/misc/tex-3d-size-limit.html [ Failure ] -crbug.com/angleproject/4242 [ linux intel opengl passthrough ] conformance2/glsl3/matrix-row-major-dynamic-indexing.html [ Failure ] +crbug.com/1084864 [ linux intel angle-opengl passthrough ] conformance2/rendering/blitframebuffer-filter-outofbounds.html [ Failure ] +crbug.com/1081978 [ linux intel angle-opengl passthrough ] conformance2/textures/misc/tex-3d-size-limit.html [ Failure ] +crbug.com/angleproject/4242 [ linux intel angle-opengl passthrough ] conformance2/glsl3/matrix-row-major-dynamic-indexing.html [ Failure ] crbug.com/angleproject/4242 [ linux intel no-passthrough mesa_lt_19.1 ] conformance2/glsl3/matrix-row-major-dynamic-indexing.html [ Failure ] # Linux only. @@ -760,7 +755,7 @@ # This test is flaky both with and without ANGLE. crbug.com/709351 [ linux nvidia ] conformance2/glsl3/vector-dynamic-indexing-swizzled-lvalue.html [ Failure ] crbug.com/905003 [ linux nvidia ] conformance2/textures/misc/integer-cubemap-specification-order-bug.html [ Failure ] -crbug.com/680278 [ opengl linux nvidia ] conformance2/rendering/framebuffer-texture-level1.html [ Failure ] +crbug.com/680278 [ angle-opengl linux nvidia ] conformance2/rendering/framebuffer-texture-level1.html [ Failure ] crbug.com/680282 [ linux nvidia-0xf02 ] conformance2/textures/image/tex-3d-rg8ui-rg_integer-unsigned_byte.html [ Failure ] # Observed flaky on Swarmed bots. Some of these were directly @@ -793,16 +788,16 @@ # Linux NVIDIA Quadro P400, OpenGL backend crbug.com/715001 [ linux nvidia-0x1cb3 ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] -crbug.com/703779 [ opengl linux nvidia-0x1cb3 ] conformance/textures/misc/texture-size.html [ Failure ] -crbug.com/703779 [ opengl linux nvidia-0x1cb3 ] conformance/extensions/webgl-compressed-texture-size-limit.html [ Failure ] -crbug.com/703779 [ opengl linux nvidia-0x1cb3 ] conformance/textures/misc/texture-size-limit.html [ Failure ] -crbug.com/703779 [ opengl linux nvidia-0x1cb3 ] deqp/functional/gles3/fbocompleteness.html [ Failure ] +crbug.com/703779 [ angle-opengl linux nvidia-0x1cb3 ] conformance/textures/misc/texture-size.html [ Failure ] +crbug.com/703779 [ angle-opengl linux nvidia-0x1cb3 ] conformance/extensions/webgl-compressed-texture-size-limit.html [ Failure ] +crbug.com/703779 [ angle-opengl linux nvidia-0x1cb3 ] conformance/textures/misc/texture-size-limit.html [ Failure ] +crbug.com/703779 [ angle-opengl linux nvidia-0x1cb3 ] deqp/functional/gles3/fbocompleteness.html [ Failure ] # Linux / OpenGL / NVIDIA failures -crbug.com/angleproject/4555 [ linux opengl passthrough nvidia ] conformance/misc/type-conversion-test.html [ Skip ] +crbug.com/angleproject/4555 [ linux angle-opengl passthrough nvidia ] conformance/misc/type-conversion-test.html [ Skip ] # Linux GTX 1660 -crbug.com/1115314 [ linux nvidia-0x2184 opengl passthrough ] deqp/functional/gles3/fbocompleteness.html [ Failure ] +crbug.com/1115314 [ linux nvidia-0x2184 angle-opengl passthrough ] deqp/functional/gles3/fbocompleteness.html [ Failure ] # Linux AMD only. # It looks like AMD shader compiler rejects many valid ES3 semantics. @@ -828,8 +823,8 @@ crbug.com/483282 [ linux amd ] deqp/functional/gles3/framebufferblit/conversion_07.html [ Failure ] crbug.com/658832 [ linux amd ] deqp/functional/gles3/framebufferblit/default_framebuffer_00.html [ Failure ] crbug.com/483282 [ linux amd ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] -crbug.com/483282 [ no-angle linux amd ] conformance2/reading/read-pixels-pack-parameters.html [ Failure ] -crbug.com/483282 [ no-angle linux amd ] conformance2/textures/misc/tex-unpack-params.html [ Failure ] +crbug.com/483282 [ angle-no-backend linux amd ] conformance2/reading/read-pixels-pack-parameters.html [ Failure ] +crbug.com/483282 [ angle-no-backend linux amd ] conformance2/textures/misc/tex-unpack-params.html [ Failure ] crbug.com/662644 [ linux amd ] conformance2/rendering/clipping-wide-points.html [ Failure ] # TODO(kbr): re-enable after next conformance roll. crbug.com/736499 @@ -841,10 +836,10 @@ # Uniform buffer related failures crbug.com/483282 [ linux amd ] deqp/functional/gles3/uniformbuffers/random.html [ Failure ] crbug.com/angleproject/5014 [ linux amd ] conformance2/uniforms/uniform-blocks-with-arrays.html [ Failure ] -crbug.com/809595 [ no-angle linux amd ] conformance2/uniforms/simple-buffer-change.html [ Failure ] +crbug.com/809595 [ angle-no-backend linux amd ] conformance2/uniforms/simple-buffer-change.html [ Failure ] # Linux AMD R7 240 -crbug.com/696345 [ no-angle linux amd-0x6613 ] conformance2/transform_feedback/switching-objects.html [ Failure ] +crbug.com/696345 [ angle-no-backend linux amd-0x6613 ] conformance2/transform_feedback/switching-objects.html [ Failure ] crbug.com/913301 [ linux amd-0x6613 ] conformance2/textures/misc/generate-mipmap-with-large-base-level.html [ Failure ] crbug.com/809237 [ linux amd-0x6613 ] conformance2/uniforms/incompatible-texture-type-for-sampler.html [ Skip ] crbug.com/1018028 [ linux amd-0x6613 ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] @@ -946,7 +941,7 @@ # This test is failing on Android Pixel 2 and 3 (Qualcomm) # Seems to be an OpenGL ES bug. -crbug.com/695742 [ android qualcomm no-angle ] deqp/functional/gles3/multisample.html [ RetryOnFailure ] +crbug.com/695742 [ android qualcomm angle-no-backend ] deqp/functional/gles3/multisample.html [ RetryOnFailure ] # This test is flaky but can fail three times in a row so it must be # marked as Fail instead of Flaky. @@ -961,39 +956,39 @@ # TODO(crbug.com/979444): once this is passing on the passthrough # command decoder, simplify the RetryOnFailure expectation at the top # of this file to just not declare any OS. -crbug.com/979444 [ android opengles ] conformance/textures/misc/texture-corner-case-videos.html [ Failure ] -crbug.com/906724 [ android opengles ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/906724 [ android opengles ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/979444 [ android angle-opengles ] conformance/textures/misc/texture-corner-case-videos.html [ Failure ] +crbug.com/906724 [ android angle-opengles ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/906724 [ android angle-opengles ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/angleproject/3684 [ android opengles ] conformance2/renderbuffers/multisample-with-full-sample-counts.html [ Failure ] -crbug.com/967410 [ android opengles ] conformance2/textures/video/tex-2d-rgb16f-rgb-half_float.html [ Failure ] -crbug.com/967410 [ android opengles ] conformance2/textures/video/tex-2d-rgb9_e5-rgb-half_float.html [ Failure ] -crbug.com/967410 [ android opengles ] conformance2/textures/video/tex-2d-srgb8-rgb-unsigned_byte.html [ Failure ] -crbug.com/967410 [ android opengles ] conformance2/textures/video/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ] -crbug.com/967410 [ android opengles ] conformance2/textures/misc/npot-video-sizing.html [ Failure ] -crbug.com/angleproject/3685 [ android opengles ] conformance2/transform_feedback/simultaneous_binding.html [ Failure ] -crbug.com/angleproject/3686 [ android opengles ] deqp/functional/gles3/multisample.html [ Failure ] -crbug.com/angleproject/3753 [ android opengles ] conformance/textures/misc/texture-upload-size.html [ Failure ] +crbug.com/angleproject/3684 [ android angle-opengles ] conformance2/renderbuffers/multisample-with-full-sample-counts.html [ Failure ] +crbug.com/967410 [ android angle-opengles ] conformance2/textures/video/tex-2d-rgb16f-rgb-half_float.html [ Failure ] +crbug.com/967410 [ android angle-opengles ] conformance2/textures/video/tex-2d-rgb9_e5-rgb-half_float.html [ Failure ] +crbug.com/967410 [ android angle-opengles ] conformance2/textures/video/tex-2d-srgb8-rgb-unsigned_byte.html [ Failure ] +crbug.com/967410 [ android angle-opengles ] conformance2/textures/video/tex-2d-srgb8_alpha8-rgba-unsigned_byte.html [ Failure ] +crbug.com/967410 [ android angle-opengles ] conformance2/textures/misc/npot-video-sizing.html [ Failure ] +crbug.com/angleproject/3685 [ android angle-opengles ] conformance2/transform_feedback/simultaneous_binding.html [ Failure ] +crbug.com/angleproject/3686 [ android angle-opengles ] deqp/functional/gles3/multisample.html [ Failure ] +crbug.com/angleproject/3753 [ android angle-opengles ] conformance/textures/misc/texture-upload-size.html [ Failure ] crbug.com/1037958 [ mac amd-0x679e ] conformance2/transform_feedback/switching-objects.html [ RetryOnFailure ] -crbug.com/1082003 [ android opengles no-passthrough qualcomm ] deqp/functional/gles3/fragdepth.html [ RetryOnFailure ] -crbug.com/1103370 [ android opengles no-passthrough qualcomm ] deqp/functional/gles3/fborender/recreate_color_03.html [ RetryOnFailure ] +crbug.com/1082003 [ android angle-opengles no-passthrough qualcomm ] deqp/functional/gles3/fragdepth.html [ RetryOnFailure ] +crbug.com/1103370 [ android angle-opengles no-passthrough qualcomm ] deqp/functional/gles3/fborender/recreate_color_03.html [ RetryOnFailure ] # Conflicting expectations to test that the # "Expectations have no collisions" unittest works. # Conflict when all conditions match -#[ linux nvidia-0x1 debug opengl ] test-page-1.html [ Failure ] -#[ linux nvidia-0x1 debug opengl ] test-page-1.html [ Failure ] +#[ linux nvidia-0x1 debug angle-opengl ] test-page-1.html [ Failure ] +#[ linux nvidia-0x1 debug angle-opengl ] test-page-1.html [ Failure ] # Conflict when all conditions match (and different sets) -#[ linux nvidia-0x1 debug opengl ] test-page-2.html [ Failure ] -#[ linux nvidia-0x1 debug opengl amd ] test-page-2.html [ Failure ] -#[ mac nvidia-0x1 debug opengl amd ] test-page-2.html [ Failure ] +#[ linux nvidia-0x1 debug angle-opengl ] test-page-2.html [ Failure ] +#[ linux nvidia-0x1 debug angle-opengl amd ] test-page-2.html [ Failure ] +#[ mac nvidia-0x1 debug angle-opengl amd ] test-page-2.html [ Failure ] # Conflict with one aspect not specified #[ linux nvidia-0x1 debug ] test-page-3.html [ Failure ] -#[ linux nvidia-0x1 debug opengl ] test-page-3.html [ Failure ] +#[ linux nvidia-0x1 debug angle-opengl ] test-page-3.html [ Failure ] # Conflict with one aspect not specified (in both conditions) #[ linux nvidia-0x1 debug ] test-page-4.html [ Failure ] @@ -1016,9 +1011,9 @@ #[ linux debug ] WebglExtension_test_8 [ Failure ] # Test no conflicts happen when only one aspect differs -#[ linux nvidia-0x1 debug opengl ] WebglExtension_test_9 [ Failure ] -#[ win nvidia-0x1 debug opengl ] WebglExtension_test_9 [ Failure ] +#[ linux nvidia-0x1 debug angle-opengl ] WebglExtension_test_9 [ Failure ] +#[ win nvidia-0x1 debug angle-opengl ] WebglExtension_test_9 [ Failure ] # Conflicts if between a generic os condition and a specific version -#[ sierra nvidia debug opengl ] WebglExtension_test_10 [ Failure ] -#[ mac nvidia debug opengl ] WebglExtension_test_10 [ Failure ] +#[ sierra nvidia debug angle-opengl ] WebglExtension_test_10 [ Failure ] +#[ mac nvidia debug angle-opengl ] WebglExtension_test_10 [ Failure ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 8229ad9..b509253 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -13,7 +13,7 @@ # arm-mali-t860 # qualcomm qualcomm-adreno-(tm)-330 qualcomm-adreno-(tm)-418 qualcomm-adreno-(tm)-420 qualcomm-adreno-(tm)-430 # google-0xffff ] -# tags: [ d3d11 d3d9 metal no-angle opengl opengles vulkan swiftshader ] +# tags: [ angle-d3d11 angle-d3d9 angle-metal angle-no-backend angle-opengl angle-opengles angle-vulkan angle-swiftshader ] # tags: [ fuchsia-board-qemu-x64 ] # tags: [ no-passthrough passthrough ] # tags: [ swiftshader-gl no-swiftshader-gl ] @@ -57,31 +57,31 @@ crbug.com/776222 [ android ] WebglExtension_WEBGL_video_texture [ Skip ] # Extensions not available with SwiftShader -crbug.com/1099955 [ swiftshader-gl no-angle linux ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle mac ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle win ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle linux ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle mac ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle win ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle linux ] WebglExtension_EXT_texture_compression_bptc [ Skip ] -crbug.com/1099955 [ swiftshader-gl no-angle win ] WebglExtension_EXT_texture_compression_bptc [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl linux ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl mac ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl win ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl linux ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl mac ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl win ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl linux ] WebglExtension_EXT_texture_compression_bptc [ Skip ] -crbug.com/1099955 [ swiftshader no-swiftshader-gl win ] WebglExtension_EXT_texture_compression_bptc [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend linux ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend mac ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend win ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend linux ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend mac ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend win ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend linux ] WebglExtension_EXT_texture_compression_bptc [ Skip ] +crbug.com/1099955 [ swiftshader-gl angle-no-backend win ] WebglExtension_EXT_texture_compression_bptc [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl linux ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl mac ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl win ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl linux ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl mac ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl win ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl linux ] WebglExtension_EXT_texture_compression_bptc [ Skip ] +crbug.com/1099955 [ angle-swiftshader no-swiftshader-gl win ] WebglExtension_EXT_texture_compression_bptc [ Skip ] # Extensions not available under D3D9 -[ win d3d9 no-swiftshader-gl ] WebglExtension_EXT_sRGB [ Skip ] -crbug.com/867718 [ win d3d9 ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -[ win amd d3d9 ] WebglExtension_WEBGL_depth_texture [ Skip ] -[ win d3d9 ] WebglExtension_WEBGL_draw_buffers [ Skip ] -[ win d3d9 ] WebglExtension_OES_fbo_render_mipmap [ Skip ] -[ win d3d9 ] WebglExtension_EXT_texture_compression_bptc [ Skip ] -[ win d3d9 no-swiftshader-gl ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] +[ win angle-d3d9 no-swiftshader-gl ] WebglExtension_EXT_sRGB [ Skip ] +crbug.com/867718 [ win angle-d3d9 ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +[ win amd angle-d3d9 ] WebglExtension_WEBGL_depth_texture [ Skip ] +[ win angle-d3d9 ] WebglExtension_WEBGL_draw_buffers [ Skip ] +[ win angle-d3d9 ] WebglExtension_OES_fbo_render_mipmap [ Skip ] +[ win angle-d3d9 ] WebglExtension_EXT_texture_compression_bptc [ Skip ] +[ win angle-d3d9 no-swiftshader-gl ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] # Android general [ android no-swiftshader-gl ] WebglExtension_EXT_frag_depth [ Skip ] @@ -113,13 +113,13 @@ [ android nvidia ] WebglExtension_EXT_texture_compression_bptc [ Skip ] [ android nvidia no-swiftshader-gl ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] -# Extensions not available on metal -crbug.com/angleproject/4846 [ mac metal passthrough ] WebglExtension_EXT_disjoint_timer_query [ Skip ] -crbug.com/angleproject/4846 [ mac metal passthrough ] WebglExtension_EXT_shader_texture_lod [ Skip ] -crbug.com/angleproject/4846 [ mac metal passthrough ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] -crbug.com/angleproject/4846 [ mac metal passthrough ] WebglExtension_OES_fbo_render_mipmap [ Skip ] -crbug.com/angleproject/4846 [ mac metal passthrough ] WebglExtension_WEBGL_compressed_texture_s3tc [ Skip ] -crbug.com/angleproject/4846 [ mac metal passthrough ] WebglExtension_WEBGL_draw_buffers [ Skip ] +# Extensions not available on angle-metal +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] WebglExtension_EXT_disjoint_timer_query [ Skip ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] WebglExtension_EXT_shader_texture_lod [ Skip ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] WebglExtension_OES_fbo_render_mipmap [ Skip ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] WebglExtension_WEBGL_compressed_texture_s3tc [ Skip ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] WebglExtension_WEBGL_draw_buffers [ Skip ] # ======================== # Conformance expectations @@ -128,7 +128,7 @@ crbug.com/1081973 conformance/buffers/buffer-data-and-buffer-sub-data.html [ Failure ] crbug.com/1082533 [ mac intel ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1018028 [ win vulkan nvidia ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] +crbug.com/1018028 [ win angle-vulkan nvidia ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] crbug.com/1110111 [ win nvidia ] conformance/rendering/point-no-attributes.html [ RetryOnFailure ] # Skipping new tests @@ -136,9 +136,9 @@ # Need to implement new error semantics # https://github.com/KhronosGroup/WebGL/pull/2607 -crbug.com/849572 [ win d3d11 passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ] -crbug.com/849572 [ opengl passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ] -crbug.com/849572 [ vulkan passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ] +crbug.com/849572 [ win angle-d3d11 passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ] +crbug.com/849572 [ angle-opengl passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ] +crbug.com/849572 [ angle-vulkan passthrough ] conformance/extensions/angle-instanced-arrays-out-of-bounds.html [ Failure ] # Nvidia bugs fixed in latest driver # TODO(http://crbug.com/887241): Upgrade the drivers on the bots. @@ -170,16 +170,16 @@ crbug.com/1105129 [ win ] conformance/context/context-creation.html [ RetryOnFailure ] # Win / AMD / Passthrough command decoder / D3D11 -crbug.com/685232 [ win amd d3d11 passthrough ] conformance/textures/misc/copytexsubimage2d-subrects.html [ RetryOnFailure ] -crbug.com/772037 [ win amd d3d11 passthrough ] conformance/textures/misc/texture-sub-image-cube-maps.html [ RetryOnFailure ] -crbug.com/772037 [ win7 release amd d3d11 passthrough ] conformance/extensions/oes-texture-half-float.html [ RetryOnFailure ] +crbug.com/685232 [ win amd angle-d3d11 passthrough ] conformance/textures/misc/copytexsubimage2d-subrects.html [ RetryOnFailure ] +crbug.com/772037 [ win amd angle-d3d11 passthrough ] conformance/textures/misc/texture-sub-image-cube-maps.html [ RetryOnFailure ] +crbug.com/772037 [ win7 release amd angle-d3d11 passthrough ] conformance/extensions/oes-texture-half-float.html [ RetryOnFailure ] # Vulkan / Passthrough command decoder -crbug.com/angleproject/4931 [ win nvidia vulkan passthrough ] conformance/textures/misc/texture-mips.html [ Failure ] +crbug.com/angleproject/4931 [ win nvidia angle-vulkan passthrough ] conformance/textures/misc/texture-mips.html [ Failure ] # Win / Intel / Vulkan / Passthrough command decoder # Technically flaky, but flake rate is too high for RetryOnFailure. -crbug.com/angleproject/4922 [ win intel vulkan passthrough ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] +crbug.com/angleproject/4922 [ win intel angle-vulkan passthrough ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] #################### # Fuchsia failures # @@ -218,16 +218,16 @@ #################### # Intel flaky issues -crbug.com/825338 [ win intel d3d11 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] +crbug.com/825338 [ win intel angle-d3d11 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] crbug.com/929009 [ win intel ] conformance/glsl/misc/shader-with-non-reserved-words.html [ RetryOnFailure ] -crbug.com/1023745 [ win intel d3d9 passthrough ] conformance2/textures/image_bitmap_from_video/tex-2d-r16f-red-half_float.html [ RetryOnFailure ] -crbug.com/1111652 [ win intel vulkan passthrough ] conformance/context/context-size-change.html [ Failure ] +crbug.com/1023745 [ win intel angle-d3d9 passthrough ] conformance2/textures/image_bitmap_from_video/tex-2d-r16f-red-half_float.html [ RetryOnFailure ] +crbug.com/1111652 [ win intel angle-vulkan passthrough ] conformance/context/context-size-change.html [ Failure ] # Intel driver issues -crbug.com/854100 [ win intel opengl passthrough intel_lt_25.20.100.6577 ] conformance/glsl/variables/gl-pointcoord.html [ Failure ] -crbug.com/angleproject/2909 [ win intel vulkan passthrough intel_lt_26.20.100.7000 ] conformance/ogles/GL/faceforward/faceforward_001_to_006.html [ Failure ] -crbug.com/angleproject/2722 [ win intel vulkan passthrough intel_lt_26.20.100.7323 ] conformance/rendering/clipping-wide-points.html [ Failure ] -crbug.com/1082565 [ win intel opengl passthrough intel_lt_26.20.100.8141 ] conformance/canvas/webgl-to-2d-canvas.html [ Failure ] +crbug.com/854100 [ win intel angle-opengl passthrough intel_lt_25.20.100.6577 ] conformance/glsl/variables/gl-pointcoord.html [ Failure ] +crbug.com/angleproject/2909 [ win intel angle-vulkan passthrough intel_lt_26.20.100.7000 ] conformance/ogles/GL/faceforward/faceforward_001_to_006.html [ Failure ] +crbug.com/angleproject/2722 [ win intel angle-vulkan passthrough intel_lt_26.20.100.7323 ] conformance/rendering/clipping-wide-points.html [ Failure ] +crbug.com/1082565 [ win intel angle-opengl passthrough intel_lt_26.20.100.8141 ] conformance/canvas/webgl-to-2d-canvas.html [ Failure ] # This is an OpenGL driver bug on Intel platform and it is fixed in # Intel Driver 25.20.100.6444. @@ -235,12 +235,12 @@ # case biuDepthRange_001_to_002 first. # Temporarily skip these two cases now because this issue blocks # WEBGL_video_texture implementation. -crbug.com/907195 [ win intel opengl passthrough intel_lt_25.20.100.6444 ] conformance/ogles/GL/biuDepthRange/biuDepthRange_001_to_002.html [ Skip ] -crbug.com/907195 [ win intel opengl passthrough intel_lt_25.20.100.6444 ] conformance/uniforms/no-over-optimization-on-uniform-array-09.html [ Skip ] +crbug.com/907195 [ win intel angle-opengl passthrough intel_lt_25.20.100.6444 ] conformance/ogles/GL/biuDepthRange/biuDepthRange_001_to_002.html [ Skip ] +crbug.com/907195 [ win intel angle-opengl passthrough intel_lt_25.20.100.6444 ] conformance/uniforms/no-over-optimization-on-uniform-array-09.html [ Skip ] # Note that the following test seems to pass, but it may still be flaky. -crbug.com/478572 [ win d3d9 passthrough ] deqp/data/gles2/shaders/functions.html [ Failure ] -crbug.com/478572 [ win amd vulkan passthrough ] deqp/data/gles2/shaders/functions.html [ Failure ] +crbug.com/478572 [ win angle-d3d9 passthrough ] deqp/data/gles2/shaders/functions.html [ Failure ] +crbug.com/478572 [ win amd angle-vulkan passthrough ] deqp/data/gles2/shaders/functions.html [ Failure ] crbug.com/931006 [ win ] conformance/textures/misc/texture-active-bind.html [ RetryOnFailure ] crbug.com/951628 [ win no-passthrough no-swiftshader-gl ] conformance/rendering/blending.html [ Failure ] @@ -251,27 +251,27 @@ crbug.com/1109977 [ win nvidia passthrough ] conformance/glsl/misc/shader-with-non-reserved-words.html [ Skip ] # Win10 / NVIDIA Quadro P400 / D3D11 failures -crbug.com/898674 [ win10 nvidia-0x1cb3 d3d11 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] +crbug.com/898674 [ win10 nvidia-0x1cb3 angle-d3d11 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] # Win10 / NVIDIA Quadro P400 / D3D9 failures -crbug.com/829389 [ win10 nvidia-0x1cb3 d3d9 ] conformance/canvas/canvas-test.html [ RetryOnFailure ] -crbug.com/680754 [ win10 nvidia-0x1cb3 d3d9 ] conformance/canvas/drawingbuffer-static-canvas-test.html [ Failure ] -crbug.com/680754 [ win10 nvidia-0x1cb3 d3d9 ] conformance/canvas/framebuffer-bindings-affected-by-to-data-url.html [ Failure ] -crbug.com/750896 [ win10 nvidia-0x1cb3 d3d9 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] -crbug.com/825416 [ win10 nvidia-0x1cb3 d3d9 ] conformance/glsl/variables/gl-frontfacing.html [ RetryOnFailure ] -crbug.com/737018 [ win10 nvidia-0x1cb3 d3d9 ] conformance/ogles/GL/atan/atan_001_to_008.html [ Failure ] -crbug.com/680754 [ win10 nvidia-0x1cb3 d3d9 ] conformance/ogles/GL/cos/cos_001_to_006.html [ Failure ] -crbug.com/750896 [ win10 nvidia-0x1cb3 d3d9 ] conformance/textures/image_bitmap_from_video/* [ RetryOnFailure ] -crbug.com/750896 [ win10 nvidia-0x1cb3 d3d9 ] conformance/textures/video/* [ RetryOnFailure ] -crbug.com/829389 [ win10 nvidia-0x1cb3 d3d9 passthrough ] conformance/uniforms/uniform-samplers-test.html [ RetryOnFailure ] -crbug.com/angleproject/4539 [ win10 nvidia-0x1cb3 d3d9 passthrough ] conformance/extensions/oes-texture-half-float-linear.html [ RetryOnFailure ] +crbug.com/829389 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/canvas/canvas-test.html [ RetryOnFailure ] +crbug.com/680754 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/canvas/drawingbuffer-static-canvas-test.html [ Failure ] +crbug.com/680754 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/canvas/framebuffer-bindings-affected-by-to-data-url.html [ Failure ] +crbug.com/750896 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] +crbug.com/825416 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/glsl/variables/gl-frontfacing.html [ RetryOnFailure ] +crbug.com/737018 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/ogles/GL/atan/atan_001_to_008.html [ Failure ] +crbug.com/680754 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/ogles/GL/cos/cos_001_to_006.html [ Failure ] +crbug.com/750896 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/textures/image_bitmap_from_video/* [ RetryOnFailure ] +crbug.com/750896 [ win10 nvidia-0x1cb3 angle-d3d9 ] conformance/textures/video/* [ RetryOnFailure ] +crbug.com/829389 [ win10 nvidia-0x1cb3 angle-d3d9 passthrough ] conformance/uniforms/uniform-samplers-test.html [ RetryOnFailure ] +crbug.com/angleproject/4539 [ win10 nvidia-0x1cb3 angle-d3d9 passthrough ] conformance/extensions/oes-texture-half-float-linear.html [ RetryOnFailure ] # Win10 / NVIDIA Quadro P400 failures crbug.com/728670 [ win10 nvidia-0x1cb3 ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ RetryOnFailure ] crbug.com/728670 [ win10 nvidia-0x1cb3 ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ RetryOnFailure ] # Win7 / NVIDIA D3D9 failures -crbug.com/690248 [ win7 nvidia d3d9 ] conformance/canvas/canvas-test.html [ RetryOnFailure ] +crbug.com/690248 [ win7 nvidia angle-d3d9 ] conformance/canvas/canvas-test.html [ RetryOnFailure ] # Win AMD failures # This test is probably flaky on all AMD, but only visible on the @@ -284,82 +284,82 @@ crbug.com/1043773 [ win amd ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ RetryOnFailure ] # Win / AMD D3D9 failures -crbug.com/475095 [ win amd d3d9 ] conformance/extensions/angle-instanced-arrays.html [ Failure ] +crbug.com/475095 [ win amd angle-d3d9 ] conformance/extensions/angle-instanced-arrays.html [ Failure ] # Win / D3D9 failures # Skipping these two tests because they're causing assertion failures. -crbug.com/angleproject/896 [ win d3d9 no-passthrough ] conformance/extensions/oes-texture-float-with-canvas.html [ Skip ] -crbug.com/angleproject/896 [ win d3d9 no-passthrough ] conformance/extensions/oes-texture-half-float-with-canvas.html [ Skip ] +crbug.com/angleproject/896 [ win angle-d3d9 no-passthrough ] conformance/extensions/oes-texture-float-with-canvas.html [ Skip ] +crbug.com/angleproject/896 [ win angle-d3d9 no-passthrough ] conformance/extensions/oes-texture-half-float-with-canvas.html [ Skip ] # The functions test have been persistently flaky on D3D9 -crbug.com/415609 [ win d3d9 ] conformance/glsl/functions/* [ RetryOnFailure ] -crbug.com/617148 [ win d3d9 ] conformance/glsl/matrices/glsl-mat4-to-mat3.html [ RetryOnFailure ] -crbug.com/617148 [ win d3d9 ] conformance/glsl/matrices/glsl-mat3-construction.html [ RetryOnFailure ] -crbug.com/674572 [ win d3d9 ] conformance/glsl/misc/large-loop-compile.html [ Skip ] -crbug.com/956134 [ win d3d9 ] conformance/extensions/webgl-depth-texture.html [ Skip ] -crbug.com/992224 [ win d3d9 ] conformance/glsl/samplers/glsl-function-texture2dproj.html [ RetryOnFailure ] +crbug.com/415609 [ win angle-d3d9 ] conformance/glsl/functions/* [ RetryOnFailure ] +crbug.com/617148 [ win angle-d3d9 ] conformance/glsl/matrices/glsl-mat4-to-mat3.html [ RetryOnFailure ] +crbug.com/617148 [ win angle-d3d9 ] conformance/glsl/matrices/glsl-mat3-construction.html [ RetryOnFailure ] +crbug.com/674572 [ win angle-d3d9 ] conformance/glsl/misc/large-loop-compile.html [ Skip ] +crbug.com/956134 [ win angle-d3d9 ] conformance/extensions/webgl-depth-texture.html [ Skip ] +crbug.com/992224 [ win angle-d3d9 ] conformance/glsl/samplers/glsl-function-texture2dproj.html [ RetryOnFailure ] # WIN / OpenGL / NVIDIA failures -crbug.com/715001 [ win nvidia opengl passthrough ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] -crbug.com/703779 [ win nvidia opengl ] conformance/textures/misc/texture-size.html [ Failure ] -crbug.com/963205 [ win nvidia opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc.html [ RetryOnFailure ] -crbug.com/963205 [ win nvidia opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ RetryOnFailure ] +crbug.com/715001 [ win nvidia angle-opengl passthrough ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] +crbug.com/703779 [ win nvidia angle-opengl ] conformance/textures/misc/texture-size.html [ Failure ] +crbug.com/963205 [ win nvidia angle-opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc.html [ RetryOnFailure ] +crbug.com/963205 [ win nvidia angle-opengl passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ RetryOnFailure ] # Mark ANGLE's OpenGL as flaky on Windows Nvidia -crbug.com/582083 [ win nvidia opengl ] conformance/* [ RetryOnFailure ] +crbug.com/582083 [ win nvidia angle-opengl ] conformance/* [ RetryOnFailure ] # D3D9 / Passthrough command decoder -crbug.com/angleproject/1179 [ win d3d9 passthrough ] conformance/glsl/bugs/floor-div-cos-should-not-truncate.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/angleproject/2192 [ win d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/angleproject/1179 [ win angle-d3d9 passthrough ] conformance/glsl/bugs/floor-div-cos-should-not-truncate.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/angleproject/2192 [ win angle-d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] # Vulkan / Win / Passthrough command decoder -crbug.com/angleproject/3469 [ win vulkan passthrough nvidia ] conformance/extensions/webgl-draw-buffers.html [ Failure ] +crbug.com/angleproject/3469 [ win angle-vulkan passthrough nvidia ] conformance/extensions/webgl-draw-buffers.html [ Failure ] # Note: the following test crashes so it's skipped. http://anglebug.com/3352 -crbug.com/angleproject/2921 [ win vulkan passthrough ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ Skip ] -crbug.com/angleproject/3111 [ win vulkan passthrough ] deqp/data/gles2/shaders/swizzles.html [ Skip ] -crbug.com/angleproject/3741 [ win vulkan passthrough ] conformance/textures/misc/mipmap-fbo.html [ RetryOnFailure ] -crbug.com/angleproject/4334 [ win vulkan passthrough ] conformance/textures/misc/canvas-teximage-after-multiple-drawimages.html [ Skip ] +crbug.com/angleproject/2921 [ win angle-vulkan passthrough ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ Skip ] +crbug.com/angleproject/3111 [ win angle-vulkan passthrough ] deqp/data/gles2/shaders/swizzles.html [ Skip ] +crbug.com/angleproject/3741 [ win angle-vulkan passthrough ] conformance/textures/misc/mipmap-fbo.html [ RetryOnFailure ] +crbug.com/angleproject/4334 [ win angle-vulkan passthrough ] conformance/textures/misc/canvas-teximage-after-multiple-drawimages.html [ Skip ] # Vulkan / Win / NVIDIA / Passthrough command decoder -crbug.com/963205 [ win nvidia vulkan passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ Failure ] -crbug.com/964321 [ win nvidia vulkan passthrough ] conformance/extensions/webgl-compressed-texture-s3tc.html [ RetryOnFailure ] -crbug.com/1051576 [ win nvidia vulkan passthrough ] conformance/extensions/webgl-compressed-texture-size-limit.html [ Failure ] -crbug.com/963217 [ win nvidia vulkan passthrough ] conformance/glsl/samplers/glsl-function-texture2dprojlod.html [ Failure ] -crbug.com/angleproject/3883 [ win nvidia vulkan passthrough ] conformance/misc/uninitialized-test.html [ Failure ] -crbug.com/angleproject/2939 [ win nvidia vulkan passthrough ] conformance/rendering/gl-scissor-fbo-test.html [ RetryOnFailure ] -crbug.com/963223 [ win nvidia vulkan passthrough ] conformance/rendering/out-of-bounds-array-buffers.html [ Failure ] -crbug.com/1020295 [ win7 nvidia vulkan passthrough ] conformance/textures/misc/texture-complete.html [ RetryOnFailure ] -crbug.com/angleproject/2930 [ win nvidia vulkan passthrough ] conformance/textures/misc/texture-size-cube-maps.html [ Failure ] -crbug.com/angleproject/3481 [ win nvidia vulkan passthrough ] conformance/textures/misc/texture-sub-image-cube-maps.html [ Failure ] -crbug.com/angleproject/2926 [ win nvidia vulkan passthrough ] deqp/data/gles2/shaders/conversions.html [ Failure ] -crbug.com/angleproject/4569 [ win nvidia vulkan passthrough ] conformance/textures/misc/default-texture.html [ Failure ] -crbug.com/1082826 [ win nvidia vulkan passthrough ] conformance/buffers/buffer-data-dynamic-delay.html [ Failure ] +crbug.com/963205 [ win nvidia angle-vulkan passthrough ] conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ Failure ] +crbug.com/964321 [ win nvidia angle-vulkan passthrough ] conformance/extensions/webgl-compressed-texture-s3tc.html [ RetryOnFailure ] +crbug.com/1051576 [ win nvidia angle-vulkan passthrough ] conformance/extensions/webgl-compressed-texture-size-limit.html [ Failure ] +crbug.com/963217 [ win nvidia angle-vulkan passthrough ] conformance/glsl/samplers/glsl-function-texture2dprojlod.html [ Failure ] +crbug.com/angleproject/3883 [ win nvidia angle-vulkan passthrough ] conformance/misc/uninitialized-test.html [ Failure ] +crbug.com/angleproject/2939 [ win nvidia angle-vulkan passthrough ] conformance/rendering/gl-scissor-fbo-test.html [ RetryOnFailure ] +crbug.com/963223 [ win nvidia angle-vulkan passthrough ] conformance/rendering/out-of-bounds-array-buffers.html [ Failure ] +crbug.com/1020295 [ win7 nvidia angle-vulkan passthrough ] conformance/textures/misc/texture-complete.html [ RetryOnFailure ] +crbug.com/angleproject/2930 [ win nvidia angle-vulkan passthrough ] conformance/textures/misc/texture-size-cube-maps.html [ Failure ] +crbug.com/angleproject/3481 [ win nvidia angle-vulkan passthrough ] conformance/textures/misc/texture-sub-image-cube-maps.html [ Failure ] +crbug.com/angleproject/2926 [ win nvidia angle-vulkan passthrough ] deqp/data/gles2/shaders/conversions.html [ Failure ] +crbug.com/angleproject/4569 [ win nvidia angle-vulkan passthrough ] conformance/textures/misc/default-texture.html [ Failure ] +crbug.com/1082826 [ win nvidia angle-vulkan passthrough ] conformance/buffers/buffer-data-dynamic-delay.html [ Failure ] # Flaky since crbug.com/1017162 -crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/extensions/angle-instanced-arrays.html [ Failure ] -crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/ogles/GL/* [ Failure ] -crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/context/context-attribute-preserve-drawing-buffer.html [ Failure ] -crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/extensions/oes-fbo-render-mipmap.html [ Failure ] -crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/renderbuffers/stencil-renderbuffer-initialization.html [ Failure ] -crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ Failure ] +crbug.com/1017162 [ win nvidia angle-vulkan passthrough ] conformance/extensions/angle-instanced-arrays.html [ Failure ] +crbug.com/1017162 [ win nvidia angle-vulkan passthrough ] conformance/ogles/GL/* [ Failure ] +crbug.com/1017162 [ win nvidia angle-vulkan passthrough ] conformance/context/context-attribute-preserve-drawing-buffer.html [ Failure ] +crbug.com/1017162 [ win nvidia angle-vulkan passthrough ] conformance/extensions/oes-fbo-render-mipmap.html [ Failure ] +crbug.com/1017162 [ win nvidia angle-vulkan passthrough ] conformance/renderbuffers/stencil-renderbuffer-initialization.html [ Failure ] +crbug.com/1017162 [ win nvidia angle-vulkan passthrough ] conformance/renderbuffers/depth-renderbuffer-initialization.html [ Failure ] # Vulkan / Win / AMD / Passthrough command decoder -crbug.com/angleproject/1506 [ win amd vulkan passthrough ] conformance/rendering/clipping-wide-points.html [ Failure ] -crbug.com/angleproject/2926 [ win amd vulkan passthrough ] deqp/data/gles2/shaders/conversions.html [ Failure ] -crbug.com/angleproject/2926 [ win amd vulkan passthrough ] deqp/data/gles2/shaders/linkage.html [ Failure ] -crbug.com/974347 [ win amd vulkan passthrough ] conformance/textures/image/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/974347 [ win amd vulkan passthrough ] conformance/textures/image/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/1004581 [ win amd vulkan passthrough ] conformance/rendering/multisample-corruption.html [ Failure ] -crbug.com/1010942 [ win amd vulkan passthrough ] conformance/glsl/samplers/glsl-function-texture2dproj.html [ Failure ] -crbug.com/angleproject/4286 [ win amd vulkan passthrough ] conformance/rendering/out-of-bounds-array-buffers.html [ Failure ] +crbug.com/angleproject/1506 [ win amd angle-vulkan passthrough ] conformance/rendering/clipping-wide-points.html [ Failure ] +crbug.com/angleproject/2926 [ win amd angle-vulkan passthrough ] deqp/data/gles2/shaders/conversions.html [ Failure ] +crbug.com/angleproject/2926 [ win amd angle-vulkan passthrough ] deqp/data/gles2/shaders/linkage.html [ Failure ] +crbug.com/974347 [ win amd angle-vulkan passthrough ] conformance/textures/image/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/974347 [ win amd angle-vulkan passthrough ] conformance/textures/image/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/1004581 [ win amd angle-vulkan passthrough ] conformance/rendering/multisample-corruption.html [ Failure ] +crbug.com/1010942 [ win amd angle-vulkan passthrough ] conformance/glsl/samplers/glsl-function-texture2dproj.html [ Failure ] +crbug.com/angleproject/4286 [ win amd angle-vulkan passthrough ] conformance/rendering/out-of-bounds-array-buffers.html [ Failure ] #################### # Mac failures # @@ -380,13 +380,13 @@ # crbug.com/735483 [ mac amd release ] conformance/rendering/texture-switch-performance.html [ Failure ] # Mac Intel ANGLE and native OpenGL -crbug.com/886970 [ mac intel-0xa2e opengl ] conformance/rendering/canvas-alpha-bug.html [ Failure ] -crbug.com/782317 [ mac intel opengl ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] -crbug.com/1018028 [ mac intel opengl ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] -crbug.com/886970 [ mac intel-0xa2e no-angle ] conformance/rendering/canvas-alpha-bug.html [ Failure ] -crbug.com/782317 [ mac intel no-angle ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] -crbug.com/1018028 [ mac intel no-angle ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] -crbug.com/1092734 [ mac passthrough intel opengl ] conformance/textures/webgl_canvas/tex-2d-rgba-rgba* [ Failure ] +crbug.com/886970 [ mac intel-0xa2e angle-opengl ] conformance/rendering/canvas-alpha-bug.html [ Failure ] +crbug.com/782317 [ mac intel angle-opengl ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/1018028 [ mac intel angle-opengl ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] +crbug.com/886970 [ mac intel-0xa2e angle-no-backend ] conformance/rendering/canvas-alpha-bug.html [ Failure ] +crbug.com/782317 [ mac intel angle-no-backend ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/1018028 [ mac intel angle-no-backend ] conformance/rendering/bind-framebuffer-flush-bug.html [ Failure ] +crbug.com/1092734 [ mac passthrough intel angle-opengl ] conformance/textures/webgl_canvas/tex-2d-rgba-rgba* [ Failure ] # Mac Retina NVidia failures crbug.com/635081 [ mac nvidia-0xfe9 ] conformance/attribs/gl-disabled-vertex-attrib.html [ Failure ] @@ -407,18 +407,18 @@ crbug.com/angleproject/4986 [ mac passthrough ] conformance/textures/misc/gl-teximage.html [ Failure ] # Mac / Passthrough command decoder / OpenGL -crbug.com/989194 [ mac passthrough opengl ] conformance/extensions/oes-texture-half-float.html [ Failure ] +crbug.com/989194 [ mac passthrough angle-opengl ] conformance/extensions/oes-texture-half-float.html [ Failure ] # Mac / Passthrough command decoder / OpenGL / AMD -crbug.com/angleproject/3767 [ mac passthrough amd opengl ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/angleproject/3767 [ mac passthrough amd angle-opengl ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] # Mac Pro (AMD) / Passthrough command decoder / OpenGL -crbug.com/992231 [ mac passthrough amd-0x679e opengl ] conformance/context/context-size-change.html [ Failure ] +crbug.com/992231 [ mac passthrough amd-0x679e angle-opengl ] conformance/context/context-size-change.html [ Failure ] # Mac / Passthrough command decoder / OpenGL / NVIDIA -crbug.com/982294 [ mac passthrough nvidia opengl ] conformance/renderbuffers/framebuffer-object-attachment.html [ Failure ] -crbug.com/982294 [ mac passthrough nvidia opengl ] conformance/textures/misc/tex-input-validation.html [ Failure ] -crbug.com/982294 [ mac passthrough nvidia opengl ] conformance/textures/misc/texture-corner-case-videos.html [ Failure ] +crbug.com/982294 [ mac passthrough nvidia angle-opengl ] conformance/renderbuffers/framebuffer-object-attachment.html [ Failure ] +crbug.com/982294 [ mac passthrough nvidia angle-opengl ] conformance/textures/misc/tex-input-validation.html [ Failure ] +crbug.com/982294 [ mac passthrough nvidia angle-opengl ] conformance/textures/misc/texture-corner-case-videos.html [ Failure ] # Mac ASAN flakes crbug.com/1059760 [ mac asan ] conformance/textures/image_bitmap_from_video/* [ RetryOnFailure ] @@ -427,39 +427,39 @@ # Mac / Passthrough command decoder / Metal -crbug.com/angleproject/4846 [ mac metal passthrough ] conformance/glsl/functions/glsl-function-distance.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough ] conformance/glsl/misc/shader-varying-packing-restrictions.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] conformance/glsl/functions/glsl-function-distance.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] conformance/glsl/misc/shader-varying-packing-restrictions.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ Failure ] # Mac / Passthrough command decoder / Metal / Intel -crbug.com/angleproject/4846 [ mac metal passthrough intel ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough intel ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough intel ] conformance/textures/misc/texture-size.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough intel ] deqp/data/gles2/shaders/conversions.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough intel ] deqp/data/gles2/shaders/swizzles.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough intel ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough intel ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough intel ] conformance/textures/misc/texture-size.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough intel ] deqp/data/gles2/shaders/conversions.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough intel ] deqp/data/gles2/shaders/swizzles.html [ Failure ] # Mac / Passthrough command decoder / Metal / NVIDIA -crbug.com/angleproject/4846 [ mac metal passthrough nvidia ] conformance/rendering/clipping-wide-points.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough nvidia ] conformance/rendering/more-than-65536-indices.html [ Failure ] -crbug.com/angleproject/4846 [ mac metal passthrough nvidia ] conformance/textures/misc/texture-mips.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough nvidia ] conformance/rendering/clipping-wide-points.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough nvidia ] conformance/rendering/more-than-65536-indices.html [ Failure ] +crbug.com/angleproject/4846 [ mac angle-metal passthrough nvidia ] conformance/textures/misc/texture-mips.html [ Failure ] # Mac ARM-based DTKs crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] crbug.com/1130758 [ mac apple-apple-a12z ] conformance/extensions/webgl-depth-texture.html [ Failure ] -crbug.com/1130759 [ mac apple-apple-a12z metal ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] -crbug.com/1130759 [ mac apple-apple-a12z metal ] conformance/textures/misc/texture-mips.html [ Failure ] -crbug.com/1130760 [ mac apple-apple-a12z metal ] conformance/extensions/webgl-draw-buffers.html [ Failure ] -crbug.com/1130760 [ mac apple-apple-a12z metal ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ] +crbug.com/1130759 [ mac apple-apple-a12z angle-metal ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/1130759 [ mac apple-apple-a12z angle-metal ] conformance/textures/misc/texture-mips.html [ Failure ] +crbug.com/1130760 [ mac apple-apple-a12z angle-metal ] conformance/extensions/webgl-draw-buffers.html [ Failure ] +crbug.com/1130760 [ mac apple-apple-a12z angle-metal ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ] #################### # Linux failures # #################### # Linux / Vulkan / Passthrough command decoder -crbug.com/1021428 [ linux vulkan passthrough intel ] WebglExtension_WEBGL_depth_texture [ Failure ] +crbug.com/1021428 [ linux angle-vulkan passthrough intel ] WebglExtension_WEBGL_depth_texture [ Failure ] # NVIDIA crbug.com/524144 [ linux nvidia no-passthrough ] conformance/extensions/oes-element-index-uint.html [ RetryOnFailure ] @@ -468,7 +468,7 @@ # NVIDIA P400 OpenGL crbug.com/715001 [ linux nvidia-0x1cb3 ] conformance/limits/gl-max-texture-dimensions.html [ Failure ] -crbug.com/703779 [ linux nvidia-0x1cb3 opengl ] conformance/textures/misc/texture-size.html [ Failure ] +crbug.com/703779 [ linux nvidia-0x1cb3 angle-opengl ] conformance/textures/misc/texture-size.html [ Failure ] crbug.com/913969 [ linux nvidia-0x1cb3 ] conformance/extensions/oes-texture-float-with-video.html [ RetryOnFailure ] crbug.com/913969 [ linux nvidia-0x1cb3 ] conformance/extensions/oes-texture-half-float-with-video.html [ RetryOnFailure ] @@ -487,11 +487,11 @@ crbug.com/998498 [ linux amd passthrough ] conformance/textures/misc/tex-input-validation.html [ Failure ] # Linux passthrough AMD OpenGL -crbug.com/965594 [ linux amd opengl passthrough ] conformance/more/conformance/quickCheckAPI-S_V.html [ RetryOnFailure ] -crbug.com/965594 [ linux amd opengl passthrough ] conformance/more/conformance/webGLArrays.html [ RetryOnFailure ] -crbug.com/1028639 [ linux amd opengl passthrough ] conformance/ogles/GL/mat/mat_009_to_016.html [ Failure ] -crbug.com/1028639 [ linux amd opengl passthrough ] conformance/ogles/GL/log2/log2_009_to_012.html [ Failure ] -crbug.com/1060632 [ linux amd opengl passthrough ] conformance/more/functions/bindBuffer.html [ RetryOnFailure ] +crbug.com/965594 [ linux amd angle-opengl passthrough ] conformance/more/conformance/quickCheckAPI-S_V.html [ RetryOnFailure ] +crbug.com/965594 [ linux amd angle-opengl passthrough ] conformance/more/conformance/webGLArrays.html [ RetryOnFailure ] +crbug.com/1028639 [ linux amd angle-opengl passthrough ] conformance/ogles/GL/mat/mat_009_to_016.html [ Failure ] +crbug.com/1028639 [ linux amd angle-opengl passthrough ] conformance/ogles/GL/log2/log2_009_to_012.html [ Failure ] +crbug.com/1060632 [ linux amd angle-opengl passthrough ] conformance/more/functions/bindBuffer.html [ RetryOnFailure ] #################### # Android failures # @@ -515,14 +515,14 @@ crbug.com/352645 [ android android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ Skip ] crbug.com/352645 [ android android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Skip ] crbug.com/352645 [ android android-webview-instrumentation ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Skip ] -crbug.com/352645 [ android android-webview-instrumentation no-angle ] conformance/textures/misc/texture-npot-video.html [ Skip ] +crbug.com/352645 [ android android-webview-instrumentation angle-no-backend ] conformance/textures/misc/texture-npot-video.html [ Skip ] # These video tests appear to be flaky. crbug.com/834933 [ android android-chromium ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ RetryOnFailure ] crbug.com/907512 [ android android-chromium ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ RetryOnFailure ] crbug.com/733599 [ android ] conformance/textures/video/tex-2d-alpha-alpha-unsigned_byte.html [ RetryOnFailure ] -crbug.com/733599 [ android no-angle ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ RetryOnFailure ] -crbug.com/733599 [ android no-angle ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ RetryOnFailure ] +crbug.com/733599 [ android angle-no-backend ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ RetryOnFailure ] +crbug.com/733599 [ android angle-no-backend ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ RetryOnFailure ] crbug.com/834933 [ android android-chromium ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_byte.html [ RetryOnFailure ] crbug.com/834933 [ android android-chromium ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ RetryOnFailure ] crbug.com/891456 [ android ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ RetryOnFailure ] @@ -607,7 +607,7 @@ # Nexus 6 (Adreno 420) and 6P (Adreno 430) crbug.com/499555 [ android qualcomm-adreno-(tm)-420 ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] -crbug.com/611945 [ android no-angle qualcomm-adreno-(tm)-420 ] conformance/context/context-size-change.html [ Failure ] +crbug.com/611945 [ android angle-no-backend qualcomm-adreno-(tm)-420 ] conformance/context/context-size-change.html [ Failure ] crbug.com/499555 [ android qualcomm-adreno-(tm)-420 ] conformance/context/premultiplyalpha-test.html [ Failure ] crbug.com/611945 [ android qualcomm-adreno-(tm)-420 ] conformance/glsl/bugs/gl-fragcoord-multisampling-bug.html [ Failure ] crbug.com/611945 [ android qualcomm-adreno-(tm)-420 ] conformance/glsl/bugs/qualcomm-crash.html [ Failure ] @@ -668,12 +668,12 @@ crbug.com/995652 [ android ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ RetryOnFailure ] # Android ANGLE GLES -crbug.com/981579 [ android opengles ] conformance/textures/misc/tex-video-using-tex-unit-non-zero.html [ RetryOnFailure ] -crbug.com/906724 [ android opengles ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/906724 [ android opengles ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/981579 [ android angle-opengles ] conformance/textures/misc/tex-video-using-tex-unit-non-zero.html [ RetryOnFailure ] +crbug.com/906724 [ android angle-opengles ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/906724 [ android angle-opengles ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] # Misc failures -crbug.com/angleproject/2988 [ android opengles ] conformance/context/context-size-change.html [ Failure ] +crbug.com/angleproject/2988 [ android angle-opengles ] conformance/context/context-size-change.html [ Failure ] ############ # ChromeOS # @@ -755,13 +755,13 @@ crbug.com/1099959 [ swiftshader-gl no-passthrough ] WebglExtension_EXT_texture_compression_rgtc [ Failure ] # All platforms, Vulkan backend -crbug.com/1114284 [ win swiftshader passthrough google-0xffff ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ RetryOnFailure ] -crbug.com/1114284 [ linux swiftshader passthrough google-0xffff ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ RetryOnFailure ] +crbug.com/1114284 [ win angle-swiftshader passthrough google-0xffff ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ RetryOnFailure ] +crbug.com/1114284 [ linux angle-swiftshader passthrough google-0xffff ] conformance/uniforms/out-of-bounds-uniform-array-access.html [ RetryOnFailure ] # Mac. All backends. -crbug.com/1099960 [ mac swiftshader passthrough ] conformance/context/context-no-alpha-fbo-with-alpha.html [ Failure ] -crbug.com/1099960 [ mac swiftshader passthrough ] conformance/rendering/color-mask-preserved-during-implicit-clears.html [ Failure ] -crbug.com/1099960 [ mac swiftshader passthrough ] conformance/rendering/scissor-rect-repeated-rendering.html [ Failure ] +crbug.com/1099960 [ mac angle-swiftshader passthrough ] conformance/context/context-no-alpha-fbo-with-alpha.html [ Failure ] +crbug.com/1099960 [ mac angle-swiftshader passthrough ] conformance/rendering/color-mask-preserved-during-implicit-clears.html [ Failure ] +crbug.com/1099960 [ mac angle-swiftshader passthrough ] conformance/rendering/scissor-rect-repeated-rendering.html [ Failure ] crbug.com/1099960 [ mac swiftshader-gl no-passthrough ] conformance/context/context-no-alpha-fbo-with-alpha.html [ Failure ] crbug.com/1099960 [ mac swiftshader-gl no-passthrough ] conformance/rendering/color-mask-preserved-during-implicit-clears.html [ Failure ] crbug.com/1099960 [ mac swiftshader-gl no-passthrough ] conformance/rendering/scissor-rect-repeated-rendering.html [ Failure ] @@ -772,55 +772,55 @@ crbug.com/1099977 [ mac swiftshader-gl no-passthrough ] conformance/glsl/bugs/sampler-array-struct-function-arg.html [ Failure ] # Mac. Vulkan backend. -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/canvas/canvas-test.html [ Failure ] -crbug.com/1102991 [ mac swiftshader passthrough ] conformance/canvas/rapid-resizing.html [ RetryOnFailure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/canvas/webgl-to-2d-canvas.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/context/context-hidden-alpha.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/context/premultiplyalpha-test.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/extensions/oes-texture-float-with-canvas.html [ Failure ] -crbug.com/1099978 [ mac swiftshader passthrough ] conformance/extensions/oes-texture-float-with-video.html [ Failure ] -crbug.com/1099978 [ mac swiftshader passthrough ] conformance/extensions/oes-texture-half-float-with-video.html [ Failure ] -crbug.com/1102991 [ mac swiftshader passthrough ] conformance/more/functions/copyTexSubImage2D.html [ RetryOnFailure ] -crbug.com/1102991 [ mac swiftshader passthrough ] conformance/more/functions/deleteBufferBadArgs.html [ RetryOnFailure ] -crbug.com/1102991 [ mac swiftshader passthrough ] conformance/more/glsl/uniformOutOfBounds.html [ RetryOnFailure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/rendering/draw-webgl-to-canvas-2d-repeatedly.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-alpha-alpha-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/misc/gl-pixelstorei.html [ Failure ] -crbug.com/1102991 [ mac swiftshader passthrough ] conformance/textures/misc/tex-image-and-sub-image-2d-with-array-buffer-view.html [ RetryOnFailure ] -crbug.com/swiftshader/154 [ mac swiftshader passthrough ] conformance/textures/misc/tex-image-canvas-corruption.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/misc/texparameter-test.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/misc/texture-npot-video.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/misc/texture-video-transparent.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] -crbug.com/1099979 [ mac swiftshader passthrough ] conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/canvas/canvas-test.html [ Failure ] +crbug.com/1102991 [ mac angle-swiftshader passthrough ] conformance/canvas/rapid-resizing.html [ RetryOnFailure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/canvas/webgl-to-2d-canvas.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/context/context-attributes-alpha-depth-stencil-antialias.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/context/context-hidden-alpha.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/context/premultiplyalpha-test.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/extensions/oes-texture-float-with-canvas.html [ Failure ] +crbug.com/1099978 [ mac angle-swiftshader passthrough ] conformance/extensions/oes-texture-float-with-video.html [ Failure ] +crbug.com/1099978 [ mac angle-swiftshader passthrough ] conformance/extensions/oes-texture-half-float-with-video.html [ Failure ] +crbug.com/1102991 [ mac angle-swiftshader passthrough ] conformance/more/functions/copyTexSubImage2D.html [ RetryOnFailure ] +crbug.com/1102991 [ mac angle-swiftshader passthrough ] conformance/more/functions/deleteBufferBadArgs.html [ RetryOnFailure ] +crbug.com/1102991 [ mac angle-swiftshader passthrough ] conformance/more/glsl/uniformOutOfBounds.html [ RetryOnFailure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/rendering/draw-webgl-to-canvas-2d-repeatedly.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-alpha-alpha-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_canvas/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/image_bitmap_from_video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/misc/gl-pixelstorei.html [ Failure ] +crbug.com/1102991 [ mac angle-swiftshader passthrough ] conformance/textures/misc/tex-image-and-sub-image-2d-with-array-buffer-view.html [ RetryOnFailure ] +crbug.com/swiftshader/154 [ mac angle-swiftshader passthrough ] conformance/textures/misc/tex-image-canvas-corruption.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/misc/texparameter-test.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/misc/texture-npot-video.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/misc/texture-video-transparent.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-luminance_alpha-luminance_alpha-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-luminance-luminance-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-rgb-rgb-unsigned_short_5_6_5.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_4_4_4_4.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] +crbug.com/1099979 [ mac angle-swiftshader passthrough ] conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Failure ] -crbug.com/1134756 [ mac swiftshader passthrough ] conformance/textures/misc/copy-tex-image-2d-formats.html [ Failure ] -crbug.com/1134756 [ mac swiftshader passthrough ] conformance/misc/uninitialized-test.html [ Failure ] -crbug.com/1134756 [ mac swiftshader passthrough ] conformance/textures/misc/copy-tex-image-and-sub-image-2d.html [ Failure ] +crbug.com/1134756 [ mac angle-swiftshader passthrough ] conformance/textures/misc/copy-tex-image-2d-formats.html [ Failure ] +crbug.com/1134756 [ mac angle-swiftshader passthrough ] conformance/misc/uninitialized-test.html [ Failure ] +crbug.com/1134756 [ mac angle-swiftshader passthrough ] conformance/textures/misc/copy-tex-image-and-sub-image-2d.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py b/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py index 6de2eef..e31c9b2 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py +++ b/content/test/gpu/gpu_tests/webgl_conformance_integration_test.py
@@ -226,7 +226,7 @@ # Verify that Chrome's GL backend matches if a specific one was requested if self._gl_backend: if (self._gl_backend == 'angle' - and gpu_helper.GetANGLERenderer(gpu_info) == 'no_angle'): + and gpu_helper.GetANGLERenderer(gpu_info) == 'angle-no-backend'): self.fail('requested GL backend (' + self._gl_backend + ')' + ' had no effect on the browser: ' + _GetGPUInfoErrorString(gpu_info)) @@ -238,15 +238,15 @@ # GPU exepections use slightly different names for the angle backends # than the Chrome flags known_backend_flag_map = { - 'd3d11': ['d3d11'], - 'd3d9': ['d3d9'], - 'opengl': ['gl'], - 'opengles': ['gles'], - 'metal': ['metal'], - 'vulkan': ['vulkan'], + 'angle-d3d11': ['d3d11'], + 'angle-d3d9': ['d3d9'], + 'angle-opengl': ['gl'], + 'angle-opengles': ['gles'], + 'angle-metal': ['metal'], + 'angle-vulkan': ['vulkan'], # Support setting VK_ICD_FILENAMES for swiftshader when requesting # the 'vulkan' backend. - 'swiftshader': ['swiftshader', 'vulkan'], + 'angle-swiftshader': ['swiftshader', 'vulkan'], } current_angle_backend = gpu_helper.GetANGLERenderer(gpu_info) if (current_angle_backend not in known_backend_flag_map or
diff --git a/content/test/web_contents_observer_consistency_checker.cc b/content/test/web_contents_observer_consistency_checker.cc index 518b59f..b540e22 100644 --- a/content/test/web_contents_observer_consistency_checker.cc +++ b/content/test/web_contents_observer_consistency_checker.cc
@@ -391,7 +391,7 @@ parent_ids_.insert(std::make_pair(routing_pair, parent_routing_pair)); } else { GlobalRoutingID former_parent_routing_pair = it->second; - CHECK(former_parent_routing_pair == parent_routing_pair) + CHECK_EQ(former_parent_routing_pair, parent_routing_pair) << "RFH's parent value changed over time! That is really not good!"; } }
diff --git a/device/vr/android/arcore/arcore_device.cc b/device/vr/android/arcore/arcore_device.cc index 37ab0d6..8b32589 100644 --- a/device/vr/android/arcore/arcore_device.cc +++ b/device/vr/android/arcore/arcore_device.cc
@@ -76,6 +76,9 @@ // it obvious if we're using this data instead of the actual values we get // from the output drawing surface. SetVRDisplayInfo(CreateVRDisplayInfo({16, 16})); + + // ARCORE always support AR blend modes + SetArBlendModeSupported(true); } ArCoreDevice::~ArCoreDevice() { @@ -103,6 +106,7 @@ mojom::XRRuntime::RequestSessionCallback callback) { DVLOG(1) << __func__; DCHECK(IsOnMainThread()); + DCHECK(options->mode == device::mojom::XRSessionMode::kImmersiveAr); if (HasExclusiveSession()) { DVLOG(1) << __func__ << ": Rejecting additional session request"; @@ -276,7 +280,16 @@ session->data_provider = std::move(frame_data_provider); session->display_info = std::move(display_info); session->submit_frame_sink = std::move(presentation_connection); - session->supports_viewport_scaling = true; + + session->device_config = device::mojom::XRSessionDeviceConfig::New(); + auto* config = session->device_config.get(); + + config->supports_viewport_scaling = true; + + // ARCORE only supports immersive-ar sessions + session->enviroment_blend_mode = + device::mojom::XREnvironmentBlendMode::kAlphaBlend; + session->interaction_mode = device::mojom::XRInteractionMode::kScreenSpace; std::move(deferred_callback) .Run(std::move(session), std::move(session_controller));
diff --git a/device/vr/oculus/oculus_render_loop.cc b/device/vr/oculus/oculus_render_loop.cc index 0e449b86..2db135e2 100644 --- a/device/vr/oculus/oculus_render_loop.cc +++ b/device/vr/oculus/oculus_render_loop.cc
@@ -119,7 +119,20 @@ ovr_frame_index_ = 0; } -void OculusRenderLoop::OnSessionStart() { +device::mojom::XREnvironmentBlendMode OculusRenderLoop::GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) { + DCHECK_EQ(session_mode, mojom::XRSessionMode::kImmersiveVr); + return device::mojom::XREnvironmentBlendMode::kOpaque; +} + +device::mojom::XRInteractionMode OculusRenderLoop::GetInteractionMode( + device::mojom::XRSessionMode session_mode) { + DCHECK_EQ(session_mode, mojom::XRSessionMode::kImmersiveVr); + return device::mojom::XRInteractionMode::kWorldSpace; +} + +void OculusRenderLoop::OnSessionStart() +) { LogViewerType(VrViewerType::OCULUS_UNKNOWN); }
diff --git a/device/vr/oculus/oculus_render_loop.h b/device/vr/oculus/oculus_render_loop.h index 8b589d6..dfb2708 100644 --- a/device/vr/oculus/oculus_render_loop.h +++ b/device/vr/oculus/oculus_render_loop.h
@@ -37,6 +37,10 @@ bool PreComposite() override; bool SubmitCompositedFrame() override; void OnLayerBoundsChanged() override; + device::mojom::XREnvironmentBlendMode GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) override; + device::mojom::XRInteractionMode GetInteractionMode( + device::mojom::XRSessionMode session_mode) override; // Helpers to implement XRDeviceAbstraction: void CreateOvrSwapChain();
diff --git a/device/vr/openxr/openxr_api_wrapper.cc b/device/vr/openxr/openxr_api_wrapper.cc index ec50d61b..1b48d1ec 100644 --- a/device/vr/openxr/openxr_api_wrapper.cc +++ b/device/vr/openxr/openxr_api_wrapper.cc
@@ -143,8 +143,7 @@ } bool OpenXrApiWrapper::HasSystem() const { - return system_ != kInvalidSystem && view_configs_.size() == kNumViews && - HasBlendMode(); + return system_ != kInvalidSystem && view_configs_.size() == kNumViews; } bool OpenXrApiWrapper::HasBlendMode() const { @@ -202,8 +201,6 @@ instance_, system, kSupportedViewConfiguration, view_count, &view_count, view_configs.data())); - RETURN_IF_XR_FAILED(PickEnvironmentBlendMode(system)); - // Only assign the member variables on success. If any of the above XR calls // fail, the vector cleans up view_configs if necessary. system does not need // to be cleaned up because it is not allocated. @@ -213,32 +210,48 @@ return XR_SUCCESS; } -XrResult OpenXrApiWrapper::PickEnvironmentBlendMode(XrSystemId system) { - const std::array<XrEnvironmentBlendMode, 2> kSupportedBlendMode = { - XR_ENVIRONMENT_BLEND_MODE_ADDITIVE, - XR_ENVIRONMENT_BLEND_MODE_OPAQUE, +device::mojom::XREnvironmentBlendMode OpenXrApiWrapper::GetMojoBlendMode( + XrEnvironmentBlendMode xr_blend_mode) { + switch (xr_blend_mode) { + case XR_ENVIRONMENT_BLEND_MODE_OPAQUE: + return device::mojom::XREnvironmentBlendMode::kOpaque; + case XR_ENVIRONMENT_BLEND_MODE_ADDITIVE: + return device::mojom::XREnvironmentBlendMode::kAdditive; + case XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND: + return device::mojom::XREnvironmentBlendMode::kAlphaBlend; + case XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM: + NOTREACHED(); }; + return device::mojom::XREnvironmentBlendMode::kOpaque; +} + +device::mojom::XREnvironmentBlendMode +OpenXrApiWrapper::PickEnvironmentBlendModeForSession( + device::mojom::XRSessionMode session_mode) { DCHECK(HasInstance()); + std::vector<XrEnvironmentBlendMode> supported_blend_modes = + GetSupportedBlendModes(instance_, system_); - uint32_t blend_mode_count; - RETURN_IF_XR_FAILED(xrEnumerateEnvironmentBlendModes( - instance_, system, kSupportedViewConfiguration, 0, &blend_mode_count, - nullptr)); + DCHECK(supported_blend_modes.size() > 0); - std::vector<XrEnvironmentBlendMode> blend_modes(blend_mode_count); - RETURN_IF_XR_FAILED(xrEnumerateEnvironmentBlendModes( - instance_, system, kSupportedViewConfiguration, blend_mode_count, - &blend_mode_count, blend_modes.data())); + blend_mode_ = supported_blend_modes[0]; - auto* blend_mode_it = - std::find_first_of(kSupportedBlendMode.begin(), kSupportedBlendMode.end(), - blend_modes.begin(), blend_modes.end()); - if (blend_mode_it == kSupportedBlendMode.end()) { - return XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED; + switch (session_mode) { + case device::mojom::XRSessionMode::kImmersiveVr: + if (base::Contains(supported_blend_modes, + XR_ENVIRONMENT_BLEND_MODE_OPAQUE)) + blend_mode_ = XR_ENVIRONMENT_BLEND_MODE_OPAQUE; + break; + case device::mojom::XRSessionMode::kImmersiveAr: + if (base::Contains(supported_blend_modes, + XR_ENVIRONMENT_BLEND_MODE_ADDITIVE)) + blend_mode_ = XR_ENVIRONMENT_BLEND_MODE_ADDITIVE; + break; + case device::mojom::XRSessionMode::kInline: + NOTREACHED(); } - blend_mode_ = *blend_mode_it; - return XR_SUCCESS; + return GetMojoBlendMode(blend_mode_); } bool OpenXrApiWrapper::UpdateAndGetSessionEnded() {
diff --git a/device/vr/openxr/openxr_api_wrapper.h b/device/vr/openxr/openxr_api_wrapper.h index b04f621..e55d8e5 100644 --- a/device/vr/openxr/openxr_api_wrapper.h +++ b/device/vr/openxr/openxr_api_wrapper.h
@@ -70,6 +70,9 @@ const base::RepeatingCallback<void(mojom::XRVisibilityState)>& visibility_changed_callback); + device::mojom::XREnvironmentBlendMode PickEnvironmentBlendModeForSession( + device::mojom::XRSessionMode session_mode); + static void DEVICE_VR_EXPORT SetTestHook(VRTestHook* hook); private: @@ -78,7 +81,7 @@ void Uninitialize(); XrResult InitializeSystem(); - XrResult PickEnvironmentBlendMode(XrSystemId system); + XrResult InitializeEnvironmentBlendMode(XrSystemId system); XrResult ProcessEvents(); void EnsureEventPolling(); @@ -105,6 +108,9 @@ uint32_t GetRecommendedSwapchainSampleCount() const; XrResult UpdateStageBounds(); + device::mojom::XREnvironmentBlendMode GetMojoBlendMode( + XrEnvironmentBlendMode xr_blend_mode); + // The session is running only after xrBeginSession and before xrEndSession. // It is not considered running after creation but before xrBeginSession. bool session_running_;
diff --git a/device/vr/openxr/openxr_device.cc b/device/vr/openxr/openxr_device.cc index bab86430..3282dc89 100644 --- a/device/vr/openxr/openxr_device.cc +++ b/device/vr/openxr/openxr_device.cc
@@ -61,7 +61,7 @@ weak_ptr_factory_(this) { mojom::VRDisplayInfoPtr display_info = CreateFakeVRDisplayInfo(); SetVRDisplayInfo(std::move(display_info)); - + SetArBlendModeSupported(IsArBlendModeSupported(openxr_statics)); #if defined(OS_WIN) SetLuid(openxr_statics->GetLuid()); #endif @@ -93,7 +93,6 @@ void OpenXrDevice::RequestSession( mojom::XRRuntimeSessionOptionsPtr options, mojom::XRRuntime::RequestSessionCallback callback) { - DCHECK_EQ(options->mode, mojom::XRSessionMode::kImmersiveVr); EnsureRenderLoop(); if (!render_loop_->IsRunning()) { @@ -185,4 +184,18 @@ } } +bool OpenXrDevice::IsArBlendModeSupported(OpenXrStatics* openxr_statics) { + XrSystemId system; + if (XR_FAILED(GetSystem(openxr_statics->GetXrInstance(), &system))) + return false; + + std::vector<XrEnvironmentBlendMode> environment_blend_modes = + GetSupportedBlendModes(openxr_statics->GetXrInstance(), system); + + return base::Contains(environment_blend_modes, + XR_ENVIRONMENT_BLEND_MODE_ADDITIVE) || + base::Contains(environment_blend_modes, + XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND); +} + } // namespace device
diff --git a/device/vr/openxr/openxr_device.h b/device/vr/openxr/openxr_device.h index a20e5af..1ee325d 100644 --- a/device/vr/openxr/openxr_device.h +++ b/device/vr/openxr/openxr_device.h
@@ -50,6 +50,7 @@ bool result, mojom::XRSessionPtr session); void OnPresentingControllerMojoConnectionError(); + bool IsArBlendModeSupported(OpenXrStatics* openxr_statics); XrInstance instance_; std::unique_ptr<OpenXrRenderLoop> render_loop_;
diff --git a/device/vr/openxr/openxr_render_loop.cc b/device/vr/openxr/openxr_render_loop.cc index de8f53b..d4e79fca 100644 --- a/device/vr/openxr/openxr_render_loop.cc +++ b/device/vr/openxr/openxr_render_loop.cc
@@ -132,6 +132,16 @@ texture_helper_.Reset(); } +device::mojom::XREnvironmentBlendMode OpenXrRenderLoop::GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) { + return openxr_->PickEnvironmentBlendModeForSession(session_mode); +} + +device::mojom::XRInteractionMode OpenXrRenderLoop::GetInteractionMode( + device::mojom::XRSessionMode session_mode) { + return device::mojom::XRInteractionMode::kWorldSpace; +} + void OpenXrRenderLoop::OnSessionStart() { LogViewerType(VrViewerType::OPENXR_UNKNOWN); }
diff --git a/device/vr/openxr/openxr_render_loop.h b/device/vr/openxr/openxr_render_loop.h index 2082cf1..3f8259a4 100644 --- a/device/vr/openxr/openxr_render_loop.h +++ b/device/vr/openxr/openxr_render_loop.h
@@ -39,6 +39,10 @@ bool PreComposite() override; bool HasSessionEnded() override; bool SubmitCompositedFrame() override; + device::mojom::XREnvironmentBlendMode GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) override; + device::mojom::XRInteractionMode GetInteractionMode( + device::mojom::XRSessionMode session_mode) override; void InitializeDisplayInfo(); bool UpdateEyeParameters();
diff --git a/device/vr/openxr/openxr_util.cc b/device/vr/openxr/openxr_util.cc index 82d3806..e5fcbf1 100644 --- a/device/vr/openxr/openxr_util.cc +++ b/device/vr/openxr/openxr_util.cc
@@ -158,4 +158,24 @@ return xrCreateInstance(&instance_create_info, instance); } +std::vector<XrEnvironmentBlendMode> GetSupportedBlendModes(XrInstance instance, + XrSystemId system) { + // Query the list of supported environment blend modes for the current system. + uint32_t blend_mode_count; + const XrViewConfigurationType kSupportedViewConfiguration = + XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO; + if (XR_FAILED(xrEnumerateEnvironmentBlendModes(instance, system, + kSupportedViewConfiguration, 0, + &blend_mode_count, nullptr))) + return {}; // empty vector + + std::vector<XrEnvironmentBlendMode> environment_blend_modes(blend_mode_count); + if (XR_FAILED(xrEnumerateEnvironmentBlendModes( + instance, system, kSupportedViewConfiguration, blend_mode_count, + &blend_mode_count, environment_blend_modes.data()))) + return {}; // empty vector + + return environment_blend_modes; +} + } // namespace device
diff --git a/device/vr/openxr/openxr_util.h b/device/vr/openxr/openxr_util.h index 31d55162..dd3ec51 100644 --- a/device/vr/openxr/openxr_util.h +++ b/device/vr/openxr/openxr_util.h
@@ -60,6 +60,9 @@ XrResult CreateInstance(XrInstance* instance); +std::vector<XrEnvironmentBlendMode> GetSupportedBlendModes(XrInstance instance, + XrSystemId system); + } // namespace device #endif // DEVICE_VR_OPENXR_OPENXR_UTIL_H_
diff --git a/device/vr/orientation/orientation_device.cc b/device/vr/orientation/orientation_device.cc index 0c1ca10..400d7ee 100644 --- a/device/vr/orientation/orientation_device.cc +++ b/device/vr/orientation/orientation_device.cc
@@ -139,6 +139,10 @@ if (display_info_) { session->display_info = display_info_.Clone(); } + session->device_config = device::mojom::XRSessionDeviceConfig::New(); + session->enviroment_blend_mode = + device::mojom::XREnvironmentBlendMode::kOpaque; + session->interaction_mode = device::mojom::XRInteractionMode::kScreenSpace; std::move(callback).Run(std::move(session), std::move(controller));
diff --git a/device/vr/public/mojom/isolated_xr_service.mojom b/device/vr/public/mojom/isolated_xr_service.mojom index 842ad986..ca43122 100644 --- a/device/vr/public/mojom/isolated_xr_service.mojom +++ b/device/vr/public/mojom/isolated_xr_service.mojom
@@ -132,6 +132,8 @@ [EnableIf=is_win] // The LUID of the GPU that the device is plugged into. gpu.mojom.Luid? luid; + // Indicates whether the device supports AR or not + bool is_ar_blend_mode_supported; }; // Notify the browser process about a set of runtimes. The browser process
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom index eb140508bf..049acce1 100644 --- a/device/vr/public/mojom/vr_service.mojom +++ b/device/vr/public/mojom/vr_service.mojom
@@ -87,6 +87,27 @@ kImmersiveAr = 3, }; +// These enum names come from the WebXR spec: +// https://immersive-web.github.io/webxr-ar-module/#enumdef-xrenvironmentblendmode +// When presenting content to the XR device, the XR Compositor MUST apply the +// appropriate blend technique to combine virtual pixels with the +// real-world environment. +enum XREnvironmentBlendMode { + kOpaque = 1, + kAlphaBlend = 2, + kAdditive = 3, +}; + +// These enum names come from the WebXR spec: +// https://immersive-web.github.io/webxr-ar-module/#enumdef-xrinteractionmode +// The interactionMode attribute describes the best space +// (according to the user agent) for the application to draw interactive +// UI for the current session. +enum XRInteractionMode { + kScreenSpace = 1, + kWorldSpace = 2, +}; + struct XRSessionOptions { // Represents the type of session that is being requested. XRSessionMode mode; @@ -102,6 +123,25 @@ array<XRSessionFeature> optional_features; }; +// This structure contains a description of the device's active configuration +// for the session being established. +struct XRSessionDeviceConfig { + // Indicates whether the device backing this session sends input events solely + // via eventing (as opposed to polling). + bool uses_input_eventing; + + // The default scale that should be applied to the native framebuffer size + // unless overridden by the developer. + float default_framebuffer_scale = 1.0; + + // Indicates whether the device supports dynamic viewport scaling via + // XRView.requestViewportScale which results in UpdateLayerBounds mojo calls. + // This is opt-in to avoid problems with devices that assume default bounds, + // this would result in broken rendering due to inconsistency between the + // drawn and displayed viewports. + bool supports_viewport_scaling; +}; + // This structure contains all the mojo interfaces for different kinds of // XRSession. The only interface required by all sessions is the // XRFrameDataProvider. It must always be present. Other interfaces are set as @@ -126,20 +166,11 @@ // runtime, and have been consented to by the user. array<XRSessionFeature> enabled_features; - // Indicates whether the device backing this session sends input events solely - // via eventing (as opposed to polling). - bool uses_input_eventing; + // Description of the device's active configuration. + XRSessionDeviceConfig device_config; - // The default scale that should be applied to the native framebuffer size - // unless overridden by the developer. - float default_framebuffer_scale = 1.0; - - // Indicates whether the device supports dynamic viewport scaling via - // XRView.requestViewportScale which results in UpdateLayerBounds mojo calls. - // This is opt-in to avoid problems with devices that assume default bounds, - // this would result in broken rendering due to inconsistency between the - // drawn and displayed viewports. - bool supports_viewport_scaling; + XREnvironmentBlendMode enviroment_blend_mode; + XRInteractionMode interaction_mode; }; // This structure contains the infomation and interfaces needed to create a two
diff --git a/device/vr/vr_device_base.cc b/device/vr/vr_device_base.cc index d72cb09..45f4a4a2 100644 --- a/device/vr/vr_device_base.cc +++ b/device/vr/vr_device_base.cc
@@ -11,7 +11,9 @@ namespace device { -VRDeviceBase::VRDeviceBase(mojom::XRDeviceId id) : id_(id) {} +VRDeviceBase::VRDeviceBase(mojom::XRDeviceId id) : id_(id) { + device_data_.is_ar_blend_mode_supported = false; +} VRDeviceBase::~VRDeviceBase() = default; @@ -78,6 +80,10 @@ listener_->OnVisibilityStateChanged(visibility_state); } +void VRDeviceBase::SetArBlendModeSupported(bool is_ar_blend_mode_supported) { + device_data_.is_ar_blend_mode_supported = is_ar_blend_mode_supported; +} + #if defined(OS_WIN) void VRDeviceBase::SetLuid(const LUID& luid) { if (luid.HighPart != 0 || luid.LowPart != 0) {
diff --git a/device/vr/vr_device_base.h b/device/vr/vr_device_base.h index b5e9ef8..7ed5d64 100644 --- a/device/vr/vr_device_base.h +++ b/device/vr/vr_device_base.h
@@ -62,6 +62,7 @@ bool IsPresenting() { return presenting_; } // Exposed for test. void SetVRDisplayInfo(mojom::VRDisplayInfoPtr display_info); void OnVisibilityStateChanged(mojom::XRVisibilityState visibility_state); + void SetArBlendModeSupported(bool is_ar_blend_mode_supported); #if defined(OS_WIN) void SetLuid(const LUID& luid); #endif
diff --git a/device/vr/windows/compositor_base.cc b/device/vr/windows/compositor_base.cc index 87ea395..7990d64 100644 --- a/device/vr/windows/compositor_base.cc +++ b/device/vr/windows/compositor_base.cc
@@ -44,6 +44,15 @@ return false; } void XRDeviceAbstraction::OnLayerBoundsChanged() {} +device::mojom::XREnvironmentBlendMode +XRDeviceAbstraction::GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) { + return device::mojom::XREnvironmentBlendMode::kOpaque; +} +device::mojom::XRInteractionMode XRDeviceAbstraction::GetInteractionMode( + device::mojom::XRSessionMode session_mode) { + return device::mojom::XRInteractionMode::kWorldSpace; +} XRCompositorCommon::OutstandingFrame::OutstandingFrame() = default; XRCompositorCommon::OutstandingFrame::~OutstandingFrame() = default; @@ -190,7 +199,6 @@ on_visibility_state_changed, mojom::XRRuntimeSessionOptionsPtr options, RequestSessionCallback callback) { - DCHECK_EQ(options->mode, mojom::XRSessionMode::kImmersiveVr); webxr_has_pose_ = false; presentation_receiver_.reset(); frame_data_receiver_.reset(); @@ -239,7 +247,11 @@ auto session = device::mojom::XRSession::New(); session->data_provider = frame_data_receiver_.BindNewPipeAndPassRemote(); session->submit_frame_sink = std::move(submit_frame_sink); - session->uses_input_eventing = UsesInputEventing(); + + session->device_config = device::mojom::XRSessionDeviceConfig::New(); + session->device_config->uses_input_eventing = UsesInputEventing(); + session->enviroment_blend_mode = GetEnvironmentBlendMode(options->mode); + session->interaction_mode = GetInteractionMode(options->mode); main_thread_task_runner_->PostTask( FROM_HERE, base::BindOnce(std::move(callback), true, std::move(session)));
diff --git a/device/vr/windows/compositor_base.h b/device/vr/windows/compositor_base.h index 375fc124..65cb7780 100644 --- a/device/vr/windows/compositor_base.h +++ b/device/vr/windows/compositor_base.h
@@ -39,6 +39,10 @@ virtual bool SubmitCompositedFrame() = 0; virtual void HandleDeviceLost(); virtual void OnLayerBoundsChanged(); + virtual device::mojom::XREnvironmentBlendMode GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode); + virtual device::mojom::XRInteractionMode GetInteractionMode( + device::mojom::XRSessionMode session_mode); }; class XRCompositorCommon : public base::Thread,
diff --git a/device/vr/windows_mixed_reality/mixed_reality_renderloop.cc b/device/vr/windows_mixed_reality/mixed_reality_renderloop.cc index 77d83ab1..a67dead 100644 --- a/device/vr/windows_mixed_reality/mixed_reality_renderloop.cc +++ b/device/vr/windows_mixed_reality/mixed_reality_renderloop.cc
@@ -471,6 +471,19 @@ bounds_updated_ = (bounds_.size() != 0); } +device::mojom::XREnvironmentBlendMode +MixedRealityRenderLoop::GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) { + DCHECK_EQ(session_mode, mojom::XRSessionMode::kImmersiveVr); + return device::mojom::XREnvironmentBlendMode::kOpaque; +} + +device::mojom::XRInteractionMode MixedRealityRenderLoop::GetInteractionMode( + device::mojom::XRSessionMode session_mode) { + DCHECK_EQ(session_mode, mojom::XRSessionMode::kImmersiveVr); + return device::mojom::XRInteractionMode::kWorldSpace; +} + void MixedRealityRenderLoop::OnSessionStart() { LogViewerType(VrViewerType::WINDOWS_MIXED_REALITY_UNKNOWN);
diff --git a/device/vr/windows_mixed_reality/mixed_reality_renderloop.h b/device/vr/windows_mixed_reality/mixed_reality_renderloop.h index 512478b..fe4584f 100644 --- a/device/vr/windows_mixed_reality/mixed_reality_renderloop.h +++ b/device/vr/windows_mixed_reality/mixed_reality_renderloop.h
@@ -54,6 +54,10 @@ void StopRuntime() override; void OnSessionStart() override; bool UsesInputEventing() override; + device::mojom::XREnvironmentBlendMode GetEnvironmentBlendMode( + device::mojom::XRSessionMode session_mode) override; + device::mojom::XRInteractionMode GetInteractionMode( + device::mojom::XRSessionMode session_mode) override; // XRDeviceAbstraction: mojom::XRFrameDataPtr GetNextFrameData() override;
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn index 388b2fa..cae11db 100644 --- a/extensions/browser/BUILD.gn +++ b/extensions/browser/BUILD.gn
@@ -759,7 +759,6 @@ "api/lock_screen_data/lock_screen_value_store_migrator_impl_unittest.cc", "api/media_perception_private/conversion_utils_unittest.cc", "api/media_perception_private/media_perception_api_manager_unittest.cc", - "api/networking_config/networking_config_service_chromeos_unittest.cc", "api/networking_private/networking_private_chromeos_unittest.cc", "api/system_power_source/system_power_source_api_unittest.cc", "api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc",
diff --git a/extensions/browser/api/BUILD.gn b/extensions/browser/api/BUILD.gn index cd771e5d..024980f 100644 --- a/extensions/browser/api/BUILD.gn +++ b/extensions/browser/api/BUILD.gn
@@ -132,7 +132,6 @@ "//extensions/browser/api/clipboard", "//extensions/browser/api/crash_report_private", "//extensions/browser/api/diagnostics", - "//extensions/browser/api/networking_config", "//extensions/browser/api/system_power_source", "//extensions/browser/api/virtual_keyboard", "//extensions/browser/api/vpn_provider",
diff --git a/extensions/browser/api/networking_config/BUILD.gn b/extensions/browser/api/networking_config/BUILD.gn deleted file mode 100644 index 190cadc..0000000 --- a/extensions/browser/api/networking_config/BUILD.gn +++ /dev/null
@@ -1,25 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//extensions/buildflags/buildflags.gni") - -assert(enable_extensions, - "Cannot depend on extensions because enable_extensions=false.") - -assert(is_chromeos) - -source_set("networking_config") { - sources = [ - "networking_config_api.cc", - "networking_config_api.h", - "networking_config_service.cc", - "networking_config_service.h", - "networking_config_service_factory.cc", - "networking_config_service_factory.h", - ] - - deps = [ "//extensions/common/api" ] - - public_deps = [ "//extensions/browser:browser_sources" ] -}
diff --git a/extensions/browser/api/networking_config/OWNERS b/extensions/browser/api/networking_config/OWNERS deleted file mode 100644 index 87bd7ef..0000000 --- a/extensions/browser/api/networking_config/OWNERS +++ /dev/null
@@ -1,4 +0,0 @@ -stevenjb@chromium.org -emaxx@chromium.org - -# COMPONENT: OS>Systems>Network
diff --git a/extensions/browser/api/networking_config/networking_config_api.cc b/extensions/browser/api/networking_config/networking_config_api.cc deleted file mode 100644 index 7973228..0000000 --- a/extensions/browser/api/networking_config/networking_config_api.cc +++ /dev/null
@@ -1,127 +0,0 @@ -// Copyright 2015 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. - -#include <string> - -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "extensions/browser/api/networking_config/networking_config_api.h" -#include "extensions/browser/api/networking_config/networking_config_service.h" -#include "extensions/browser/api/networking_config/networking_config_service_factory.h" -#include "ui/base/l10n/l10n_util.h" - -namespace extensions { - -namespace { - -const char kAuthenticationResultFailed[] = - "Failed to set AuthenticationResult."; -const char kMalformedFilterDescription[] = "Malformed filter description."; -const char kMalformedFilterDescriptionWithSSID[] = - "Malformed filter description. Failed to register network with SSID " - "(hex): *"; -const char kUnsupportedNetworkType[] = "Unsupported network type."; - -} // namespace - -NetworkingConfigSetNetworkFilterFunction:: - NetworkingConfigSetNetworkFilterFunction() { -} - -ExtensionFunction::ResponseAction -NetworkingConfigSetNetworkFilterFunction::Run() { - parameters_ = - api::networking_config::SetNetworkFilter::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(parameters_.get()); - - NetworkingConfigService* service = - NetworkingConfigServiceFactory::GetForBrowserContext(browser_context()); - DCHECK(service); - - // Remove previously registered networks. - service->UnregisterExtension(extension_id()); - - for (const api::networking_config::NetworkInfo& ni : parameters_->networks) { - // |Type| field must be set to |WiFi| - if (ni.type != api::networking_config::NETWORK_TYPE_WIFI) - return RespondNow(Error(kUnsupportedNetworkType)); - - // Either |ssid| or |hex_ssid| must be set. - if (!ni.ssid.get() && !ni.hex_ssid.get()) - return RespondNow(Error(kMalformedFilterDescription)); - - std::string hex_ssid; - if (ni.ssid.get()) { - auto* ssid_field = ni.ssid.get(); - hex_ssid = base::HexEncode(ssid_field->c_str(), ssid_field->size()); - } - if (ni.hex_ssid.get()) - hex_ssid = *ni.hex_ssid.get(); - - if (!service->RegisterHexSsid(hex_ssid, extension_id())) - return RespondNow(Error(kMalformedFilterDescriptionWithSSID, hex_ssid)); - } - - return RespondNow(NoArguments()); -} - -NetworkingConfigSetNetworkFilterFunction:: - ~NetworkingConfigSetNetworkFilterFunction() { -} - -NetworkingConfigFinishAuthenticationFunction:: - NetworkingConfigFinishAuthenticationFunction() { -} - -ExtensionFunction::ResponseAction -NetworkingConfigFinishAuthenticationFunction::Run() { - parameters_ = - api::networking_config::FinishAuthentication::Params::Create(*args_); - EXTENSION_FUNCTION_VALIDATE(parameters_.get()); - - NetworkingConfigService* service = - NetworkingConfigServiceFactory::GetForBrowserContext(browser_context()); - DCHECK(service); - - const NetworkingConfigService::AuthenticationResult& last_result = - service->GetAuthenticationResult(); - if (last_result.authentication_state != NetworkingConfigService::NOTRY || - last_result.guid != parameters_->guid) { - return RespondNow(Error(kAuthenticationResultFailed)); - } - - // Populate NetworkingCaptivePortalAPI::AuthenticationResult. - NetworkingConfigService::AuthenticationResult authentication_result = { - extension_id(), parameters_->guid, NetworkingConfigService::FAILED, - }; - switch (parameters_->result) { - case api::networking_config::AUTHENTICATION_RESULT_NONE: - NOTREACHED(); - break; - case api::networking_config::AUTHENTICATION_RESULT_UNHANDLED: - authentication_result.authentication_state = - NetworkingConfigService::FAILED; - break; - case api::networking_config::AUTHENTICATION_RESULT_REJECTED: - authentication_result.authentication_state = - NetworkingConfigService::REJECTED; - break; - case api::networking_config::AUTHENTICATION_RESULT_FAILED: - authentication_result.authentication_state = - NetworkingConfigService::FAILED; - break; - case api::networking_config::AUTHENTICATION_RESULT_SUCCEEDED: - authentication_result.authentication_state = - NetworkingConfigService::SUCCESS; - break; - } - service->SetAuthenticationResult(authentication_result); - return RespondNow(NoArguments()); -} - -NetworkingConfigFinishAuthenticationFunction:: - ~NetworkingConfigFinishAuthenticationFunction() { -} - -} // namespace extensions
diff --git a/extensions/browser/api/networking_config/networking_config_api.h b/extensions/browser/api/networking_config/networking_config_api.h deleted file mode 100644 index eb4c4eb..0000000 --- a/extensions/browser/api/networking_config/networking_config_api.h +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2015 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 EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_API_H_ -#define EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_API_H_ - -#include "base/macros.h" -#include "extensions/browser/extension_function.h" -#include "extensions/common/api/networking_config.h" - -namespace extensions { - -class NetworkingConfigSetNetworkFilterFunction : public ExtensionFunction { - public: - NetworkingConfigSetNetworkFilterFunction(); - - ResponseAction Run() override; - - DECLARE_EXTENSION_FUNCTION("networking.config.setNetworkFilter", - NETWORKING_CONFIG_SETNETWORKFILTER) - - protected: - ~NetworkingConfigSetNetworkFilterFunction() override; - - std::unique_ptr<api::networking_config::SetNetworkFilter::Params> parameters_; - - private: - DISALLOW_COPY_AND_ASSIGN(NetworkingConfigSetNetworkFilterFunction); -}; - -class NetworkingConfigFinishAuthenticationFunction : public ExtensionFunction { - public: - NetworkingConfigFinishAuthenticationFunction(); - - ResponseAction Run() override; - - DECLARE_EXTENSION_FUNCTION("networking.config.finishAuthentication", - NETWORKING_CONFIG_FINISHAUTHENTICATION) - - protected: - ~NetworkingConfigFinishAuthenticationFunction() override; - - std::unique_ptr<api::networking_config::FinishAuthentication::Params> - parameters_; - - private: - DISALLOW_COPY_AND_ASSIGN(NetworkingConfigFinishAuthenticationFunction); -}; - -} // namespace extensions - -#endif // EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_API_H_
diff --git a/extensions/browser/api/networking_config/networking_config_chromeos_apitest.cc b/extensions/browser/api/networking_config/networking_config_chromeos_apitest.cc deleted file mode 100644 index a87ed7b..0000000 --- a/extensions/browser/api/networking_config/networking_config_chromeos_apitest.cc +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2015 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. - -#include <string> - -#include "chrome/browser/extensions/extension_apitest.h" - -namespace { - -class NetworkingConfigTest : public ExtensionApiTest { - public: - NetworkingConfigTest() {} -}; - -} // namespace - -IN_PROC_BROWSER_TEST_F(NetworkingConfigTest, ApiAvailability) { - ASSERT_TRUE(RunExtensionSubtest("networking_config", "api_availability.html")) - << message_; -} - -IN_PROC_BROWSER_TEST_F(NetworkingConfigTest, RegisterNetworks) { - ASSERT_TRUE( - RunExtensionSubtest("networking_config", "register_networks.html")) - << message_; -}
diff --git a/extensions/browser/api/networking_config/networking_config_service.cc b/extensions/browser/api/networking_config/networking_config_service.cc deleted file mode 100644 index f18c29fe..0000000 --- a/extensions/browser/api/networking_config/networking_config_service.cc +++ /dev/null
@@ -1,229 +0,0 @@ -// Copyright 2015 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. - -#include "extensions/browser/api/networking_config/networking_config_service.h" - -#include <stddef.h> -#include <stdint.h> - -#include <algorithm> -#include <utility> -#include <vector> - -#include "base/bind.h" -#include "base/lazy_instance.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_util.h" -#include "chromeos/network/managed_network_configuration_handler.h" -#include "chromeos/network/network_handler.h" -#include "chromeos/network/network_state.h" -#include "chromeos/network/network_state_handler.h" -#include "extensions/common/api/networking_config.h" - -namespace extensions { - -namespace { - -bool IsValidNonEmptyHexString(const std::string& input) { - size_t count = input.size(); - if (count == 0 || (count % 2) != 0) - return false; - for (const char& c : input) - if (!base::IsHexDigit<char>(c)) - return false; - return true; -} - -} // namespace - -NetworkingConfigService::AuthenticationResult::AuthenticationResult() - : authentication_state(NetworkingConfigService::NOTRY) { -} - -NetworkingConfigService::AuthenticationResult::AuthenticationResult( - ExtensionId extension_id, - std::string guid, - AuthenticationState authentication_state) - : extension_id(extension_id), - guid(guid), - authentication_state(authentication_state) { -} - -NetworkingConfigService::NetworkingConfigService( - content::BrowserContext* browser_context, - std::unique_ptr<EventDelegate> event_delegate, - ExtensionRegistry* extension_registry) - : browser_context_(browser_context), - event_delegate_(std::move(event_delegate)) { - registry_observer_.Add(extension_registry); -} - -NetworkingConfigService::~NetworkingConfigService() = default; - -void NetworkingConfigService::OnExtensionUnloaded( - content::BrowserContext* browser_context, - const Extension* extension, - UnloadedExtensionReason reason) { - UnregisterExtension(extension->id()); -} - -std::string NetworkingConfigService::LookupExtensionIdForHexSsid( - std::string hex_ssid) const { - // Transform hex_ssid to uppercase. - transform(hex_ssid.begin(), hex_ssid.end(), hex_ssid.begin(), toupper); - - const auto it = hex_ssid_to_extension_id_.find(hex_ssid); - if (it == hex_ssid_to_extension_id_.end()) - return std::string(); - return it->second; -} - -bool NetworkingConfigService::IsRegisteredForCaptivePortalEvent( - const std::string& extension_id) const { - return event_delegate_->HasExtensionRegisteredForEvent(extension_id); -} - -bool NetworkingConfigService::RegisterHexSsid(std::string hex_ssid, - const std::string& extension_id) { - if (!IsValidNonEmptyHexString(hex_ssid)) { - LOG(ERROR) << "\'" << hex_ssid << "\' is not a valid hex encoded string."; - return false; - } - - // Transform hex_ssid to uppercase. - transform(hex_ssid.begin(), hex_ssid.end(), hex_ssid.begin(), toupper); - - // If |hex_ssid| is already in the map, i.e. if a hex ssid is already - // registered, this call should fail. TODO(stevenjb): Return an error code so - // that the extension API can respond with a better error. - if (!hex_ssid_to_extension_id_.insert(make_pair(hex_ssid, extension_id)) - .second) { - LOG(ERROR) << "\'" << hex_ssid << "\' is already registered."; - return false; - } - - // This method no longer actually does anything. TODO(1124419) Remove the - // networking.config API entirely in a follow-up. - return true; -} - -void NetworkingConfigService::UnregisterExtension( - const std::string& extension_id) { - // This method no longer actually does anything. TODO(1124419) Remove the - // networking.config API entirely in a follow-up. -} - -const NetworkingConfigService::AuthenticationResult& -NetworkingConfigService::GetAuthenticationResult() const { - return authentication_result_; -} - -void NetworkingConfigService::ResetAuthenticationResult() { - authentication_result_ = AuthenticationResult(); - authentication_callback_.Reset(); -} - -void NetworkingConfigService::SetAuthenticationResult( - const AuthenticationResult& authentication_result) { - authentication_result_ = authentication_result; - if (authentication_result.authentication_state != SUCCESS) { - LOG(WARNING) << "Captive Portal Authentication failed."; - return; - } - - if (!authentication_callback_.is_null()) { - authentication_callback_.Run(); - authentication_callback_.Reset(); - } -} - -void NetworkingConfigService::OnGetProperties( - const std::string& extension_id, - const std::string& guid, - const base::Closure& authentication_callback, - const std::string& service_path, - base::Optional<base::Value> onc_network_config, - base::Optional<std::string> error) { - if (!onc_network_config) { - LOG(WARNING) << "Failed to determine BSSID for network with guid " << guid - << ": " << error.value_or("Failed"); - std::unique_ptr<Event> event = - CreatePortalDetectedEventAndDispatch(extension_id, guid, nullptr); - EventRouter::Get(browser_context_) - ->DispatchEventToExtension(extension_id, std::move(event)); - return; - } - authentication_result_ = NetworkingConfigService::AuthenticationResult( - std::string(), guid, NetworkingConfigService::NOTRY); - authentication_callback_ = authentication_callback; - - // Try to extract |bssid| field. - const base::Value* wifi_with_state = - onc_network_config->FindDictKey(::onc::network_config::kWiFi); - const std::string* bssid = - wifi_with_state ? wifi_with_state->FindStringKey(::onc::wifi::kBSSID) - : nullptr; - std::unique_ptr<Event> event = - CreatePortalDetectedEventAndDispatch(extension_id, guid, bssid); - - EventRouter::Get(browser_context_) - ->DispatchEventToExtension(extension_id, std::move(event)); -} - -std::unique_ptr<Event> -NetworkingConfigService::CreatePortalDetectedEventAndDispatch( - const std::string& extension_id, - const std::string& guid, - const std::string* bssid) { - const chromeos::NetworkState* network = chromeos::NetworkHandler::Get() - ->network_state_handler() - ->GetNetworkStateFromGuid(guid); - if (!network) - return nullptr; - - // Populate the NetworkInfo object. - api::networking_config::NetworkInfo network_info; - network_info.type = api::networking_config::NETWORK_TYPE_WIFI; - const std::vector<uint8_t>& raw_ssid = network->raw_ssid(); - std::string hex_ssid = base::HexEncode(raw_ssid.data(), raw_ssid.size()); - network_info.hex_ssid = std::make_unique<std::string>(hex_ssid); - network_info.ssid = std::make_unique<std::string>(network->name()); - network_info.guid = std::make_unique<std::string>(network->guid()); - if (bssid) - network_info.bssid.reset(new std::string(*bssid)); - std::unique_ptr<base::ListValue> results = - api::networking_config::OnCaptivePortalDetected::Create(network_info); - std::unique_ptr<Event> event( - new Event(events::NETWORKING_CONFIG_ON_CAPTIVE_PORTAL_DETECTED, - api::networking_config::OnCaptivePortalDetected::kEventName, - std::move(results))); - return event; -} - -void NetworkingConfigService::DispatchPortalDetectedEvent( - const std::string& extension_id, - const std::string& guid, - const base::Closure& authentication_callback) { - // This dispatch starts a new cycle of portal detection and authentication. - // Ensure that any old |authentication_callback_| is dropped. - authentication_callback_.Reset(); - - // Determine |service_path| of network identified by |guid|. - chromeos::NetworkHandler* network_handler = chromeos::NetworkHandler::Get(); - const chromeos::NetworkState* network = - network_handler->network_state_handler()->GetNetworkStateFromGuid(guid); - if (!network) - return; - const std::string service_path = network->path(); - - // We do not provide |userhash| here because we only care about properties - // that are not affected by policy, i.e BSSID. - network_handler->managed_network_configuration_handler()->GetProperties( - "" /* empty userhash */, service_path, - base::BindOnce(&NetworkingConfigService::OnGetProperties, - weak_factory_.GetWeakPtr(), extension_id, guid, - authentication_callback)); -} - -} // namespace extensions
diff --git a/extensions/browser/api/networking_config/networking_config_service.h b/extensions/browser/api/networking_config/networking_config_service.h deleted file mode 100644 index e43f354..0000000 --- a/extensions/browser/api/networking_config/networking_config_service.h +++ /dev/null
@@ -1,144 +0,0 @@ -// Copyright 2015 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 EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_SERVICE_H_ -#define EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_SERVICE_H_ - -#include <map> -#include <memory> -#include <string> - -#include "base/macros.h" -#include "base/memory/weak_ptr.h" -#include "base/scoped_observer.h" -#include "base/values.h" -#include "components/keyed_service/core/keyed_service.h" -#include "content/public/browser/browser_context.h" -#include "extensions/browser/event_router.h" -#include "extensions/browser/extension_registry.h" -#include "extensions/browser/extension_registry_observer.h" - -namespace extensions { - -// This class provides the session-scoped storage backing the networking config -// extension API. Currently only the parts relevant for captive portal handling -// are implemented. -class NetworkingConfigService : public ExtensionRegistryObserver, - public KeyedService { - public: - class EventDelegate { - public: - EventDelegate() {} - virtual ~EventDelegate() {} - virtual bool HasExtensionRegisteredForEvent( - const std::string& extension_id) const = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(EventDelegate); - }; - - // Indicates the authentication state of the portal. - enum AuthenticationState { NOTRY, TRYING, SUCCESS, REJECTED, FAILED }; - - // Provides information about the current authentication state of the portal. - struct AuthenticationResult { - AuthenticationResult(); - AuthenticationResult(ExtensionId extension_id, - std::string guid, - AuthenticationState authentication_state); - ExtensionId extension_id; - std::string guid; - AuthenticationState authentication_state; - }; - - // Note: |extension_registry| must outlive this class. - NetworkingConfigService(content::BrowserContext* browser_context, - std::unique_ptr<EventDelegate> event_delegate, - ExtensionRegistry* extension_registry); - ~NetworkingConfigService() override; - - // ExtensionRegistryObserver - void OnExtensionUnloaded(content::BrowserContext* browser_context, - const Extension* extension, - UnloadedExtensionReason reason) override; - - // Returns the extension id registered for |hex_ssid|. If no extension is - // registered for this |hex_ssid|, the function returns an empty string. - // |hex_ssid|: SSID in hex encoding. - std::string LookupExtensionIdForHexSsid(std::string hex_ssid) const; - - // Returns true if the extension with id |extension_id| registered for - // |onCaptivePortalDetected| events, otherwise false. - bool IsRegisteredForCaptivePortalEvent(const std::string& extension_id) const; - - // Registers |hex_ssid| as being handled by the extension with extension ID - // |extension_id|. Returns true on success and false if another extension - // already registered for |hex_ssid|. - // |hex_ssid|: SSID in hex encoding of the network to be registered. - // |extension_id|: Extension ID of the extension handling the network - // configuration for this network. - bool RegisterHexSsid(std::string hex_ssid, const std::string& extension_id); - - // Unregisters extension with the ID |extension_id| removing all associated - // HexSSIDs from the map. - // |extension_id|: ID identifying the extension to be removed - void UnregisterExtension(const std::string& extensionId); - - // Returns the current AuthenticationResult. - const AuthenticationResult& GetAuthenticationResult() const; - - // Sets the authentication_state to NOTRY and clears all other fields. - void ResetAuthenticationResult(); - - // Sets the current AuthenticationResult. - void SetAuthenticationResult( - const AuthenticationResult& authentication_result); - - // Sends a PortalDetected event for the network with |guid| to the extension - // with |extension_id|. - // |authentication_callback| is stored and called if the extension finishes - // authentication succesfully. This Service handles at most one portal - // detection at a time, i.e. another call to this function or a not successful - // authentication will drop a previously provided |authentication_callback|. - void DispatchPortalDetectedEvent( - const std::string& extension_id, - const std::string& guid, - const base::Closure& authentication_callback); - - private: - void OnGetProperties(const std::string& extension_id, - const std::string& guid, - const base::Closure& authentication_callback, - const std::string& service_path, - base::Optional<base::Value> onc_network_config, - base::Optional<std::string> error); - - // Creates the captive portal event about the network with guid |guid| that is - // to be dispatched to the extension identified by |extension_id|. |bssid| - // contains a human readable, hex-encoded version of the BSSID with bytes - // separated by colons, e.g. 45:67:89:ab:cd:ef. - std::unique_ptr<Event> CreatePortalDetectedEventAndDispatch( - const std::string& extension_id, - const std::string& guid, - const std::string* bssid); - - content::BrowserContext* const browser_context_; - - AuthenticationResult authentication_result_; - base::Closure authentication_callback_; - - ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> - registry_observer_{this}; - - std::unique_ptr<EventDelegate> event_delegate_; - - // This map associates a given hex encoded SSID to an extension entry. - std::map<std::string, std::string> hex_ssid_to_extension_id_; - - base::WeakPtrFactory<NetworkingConfigService> weak_factory_{this}; -}; - -} // namespace extensions - -#endif // EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_SERVICE_H_
diff --git a/extensions/browser/api/networking_config/networking_config_service_chromeos_unittest.cc b/extensions/browser/api/networking_config/networking_config_service_chromeos_unittest.cc deleted file mode 100644 index cfb4704d..0000000 --- a/extensions/browser/api/networking_config/networking_config_service_chromeos_unittest.cc +++ /dev/null
@@ -1,86 +0,0 @@ -// Copyright 2014 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. - -#include "extensions/browser/api/networking_config/networking_config_service.h" - -#include <utility> - -#include "chromeos/dbus/dbus_thread_manager.h" -#include "chromeos/network/network_handler.h" -#include "extensions/browser/api_unittest.h" -#include "extensions/browser/extension_registry.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace extensions { - -namespace { - -const char kExtensionId[] = "necdpnkfgondfageiompbacibhgmfebg"; -const char kHexSsid[] = "54657374535349445F5A5A5A5A"; -const char kHexSsidLower[] = "54657374535349445f5a5a5a5a"; - -class MockEventDelegate : public NetworkingConfigService::EventDelegate { - public: - MockEventDelegate() : extension_registered_(false) {} - ~MockEventDelegate() override {} - - bool HasExtensionRegisteredForEvent( - const std::string& extension_id) const override { - return extension_registered_; - } - - void SetExtensionRegisteredForEvent(bool extension_registered) { - extension_registered_ = extension_registered; - } - - private: - bool extension_registered_; -}; - -} // namespace - -class NetworkingConfigServiceTest : public ApiUnitTest { - public: - NetworkingConfigServiceTest() {} - ~NetworkingConfigServiceTest() override {} - - void SetUp() override { - ApiUnitTest::SetUp(); - chromeos::DBusThreadManager::Initialize(); - chromeos::NetworkHandler::Initialize(); - extension_registry_ = std::unique_ptr<ExtensionRegistry>( - new ExtensionRegistry(browser_context())); - std::unique_ptr<MockEventDelegate> mock_event_delegate = - std::unique_ptr<MockEventDelegate>(new MockEventDelegate()); - service_ = - std::unique_ptr<NetworkingConfigService>(new NetworkingConfigService( - browser_context(), std::move(mock_event_delegate), - extension_registry_.get())); - DCHECK(service_); - } - - void TearDown() override { - chromeos::NetworkHandler::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); - ApiUnitTest::TearDown(); - } - - protected: - std::unique_ptr<ExtensionRegistry> extension_registry_; - std::unique_ptr<NetworkingConfigService> service_; -}; - -TEST_F(NetworkingConfigServiceTest, BasicRegisterHexSsid) { - EXPECT_TRUE(service_->RegisterHexSsid(kHexSsid, kExtensionId)); - EXPECT_EQ(kExtensionId, service_->LookupExtensionIdForHexSsid(kHexSsid)); - EXPECT_EQ(kExtensionId, service_->LookupExtensionIdForHexSsid(kHexSsidLower)); -} - -TEST_F(NetworkingConfigServiceTest, BasicRegisterHexSsidLower) { - EXPECT_TRUE(service_->RegisterHexSsid(kHexSsidLower, kExtensionId)); - EXPECT_EQ(kExtensionId, service_->LookupExtensionIdForHexSsid(kHexSsid)); - EXPECT_EQ(kExtensionId, service_->LookupExtensionIdForHexSsid(kHexSsidLower)); -} - -} // namespace extensions
diff --git a/extensions/browser/api/networking_config/networking_config_service_factory.cc b/extensions/browser/api/networking_config/networking_config_service_factory.cc deleted file mode 100644 index b44b9e2..0000000 --- a/extensions/browser/api/networking_config/networking_config_service_factory.cc +++ /dev/null
@@ -1,83 +0,0 @@ -// Copyright 2015 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. - -#include "extensions/browser/api/networking_config/networking_config_service_factory.h" - -#include <string> - -#include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "extensions/browser/api/networking_config/networking_config_service.h" -#include "extensions/browser/extension_registry_factory.h" -#include "extensions/browser/extension_system_provider.h" -#include "extensions/browser/extensions_browser_client.h" -#include "extensions/common/api/networking_config.h" - -namespace extensions { - -namespace { - -class DefaultEventDelegate : public NetworkingConfigService::EventDelegate { - public: - explicit DefaultEventDelegate(content::BrowserContext* context); - ~DefaultEventDelegate() override; - - bool HasExtensionRegisteredForEvent( - const std::string& extension_id) const override; - - private: - content::BrowserContext* const context_; -}; - -DefaultEventDelegate::DefaultEventDelegate(content::BrowserContext* context) - : context_(context) { -} - -DefaultEventDelegate::~DefaultEventDelegate() { -} - -bool DefaultEventDelegate::HasExtensionRegisteredForEvent( - const std::string& extension_id) const { - return EventRouter::Get(context_)->ExtensionHasEventListener( - extension_id, - api::networking_config::OnCaptivePortalDetected::kEventName); -} - -} // namespace - -// static -NetworkingConfigService* NetworkingConfigServiceFactory::GetForBrowserContext( - content::BrowserContext* context) { - return static_cast<NetworkingConfigService*>( - GetInstance()->GetServiceForBrowserContext(context, true)); -} - -// static -NetworkingConfigServiceFactory* NetworkingConfigServiceFactory::GetInstance() { - return base::Singleton<NetworkingConfigServiceFactory>::get(); -} - -NetworkingConfigServiceFactory::NetworkingConfigServiceFactory() - : BrowserContextKeyedServiceFactory( - "NetworkingConfigService", - BrowserContextDependencyManager::GetInstance()) { - DependsOn(ExtensionsBrowserClient::Get()->GetExtensionSystemFactory()); - DependsOn(extensions::ExtensionRegistryFactory::GetInstance()); -} - -NetworkingConfigServiceFactory::~NetworkingConfigServiceFactory() { -} - -KeyedService* NetworkingConfigServiceFactory::BuildServiceInstanceFor( - content::BrowserContext* context) const { - return new NetworkingConfigService( - context, std::make_unique<DefaultEventDelegate>(context), - ExtensionRegistry::Get(context)); -} - -content::BrowserContext* NetworkingConfigServiceFactory::GetBrowserContextToUse( - content::BrowserContext* context) const { - return ExtensionsBrowserClient::Get()->GetOriginalContext(context); -} - -} // namespace extensions
diff --git a/extensions/browser/api/networking_config/networking_config_service_factory.h b/extensions/browser/api/networking_config/networking_config_service_factory.h deleted file mode 100644 index 135d8b01..0000000 --- a/extensions/browser/api/networking_config/networking_config_service_factory.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2015 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 EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_SERVICE_FACTORY_H_ -#define EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_SERVICE_FACTORY_H_ - -#include "base/memory/singleton.h" -#include "components/keyed_service/content/browser_context_keyed_service_factory.h" - -namespace content { -class BrowserContext; -} // namespace content - -namespace extensions { -class NetworkingConfigService; - -class NetworkingConfigServiceFactory - : public BrowserContextKeyedServiceFactory { - public: - static NetworkingConfigService* GetForBrowserContext( - content::BrowserContext* context); - - static NetworkingConfigServiceFactory* GetInstance(); - - private: - friend struct base::DefaultSingletonTraits<NetworkingConfigServiceFactory>; - - NetworkingConfigServiceFactory(); - ~NetworkingConfigServiceFactory() override; - - // BrowserContextKeyedServiceFactory - KeyedService* BuildServiceInstanceFor( - content::BrowserContext* context) const override; - content::BrowserContext* GetBrowserContextToUse( - content::BrowserContext* context) const override; -}; - -} // namespace extensions - -#endif // EXTENSIONS_BROWSER_API_NETWORKING_CONFIG_NETWORKING_CONFIG_SERVICE_FACTORY_H_
diff --git a/extensions/browser/browser_context_keyed_service_factories.cc b/extensions/browser/browser_context_keyed_service_factories.cc index 176bf55..8d3763e6 100644 --- a/extensions/browser/browser_context_keyed_service_factories.cc +++ b/extensions/browser/browser_context_keyed_service_factories.cc
@@ -47,7 +47,6 @@ #if defined(OS_CHROMEOS) #include "extensions/browser/api/clipboard/clipboard_api.h" -#include "extensions/browser/api/networking_config/networking_config_service_factory.h" #include "extensions/browser/api/system_power_source/system_power_source_api.h" #include "extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h" #include "extensions/browser/api/vpn_provider/vpn_service_factory.h" @@ -93,9 +92,6 @@ HidDeviceManager::GetFactoryInstance(); IdleManagerFactory::GetInstance(); ManagementAPI::GetFactoryInstance(); -#if defined(OS_CHROMEOS) - NetworkingConfigServiceFactory::GetInstance(); -#endif #if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_WIN) || \ defined(OS_MAC) NetworkingPrivateEventRouterFactory::GetInstance();
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h index 8459d9d..18480352 100644 --- a/extensions/browser/extension_event_histogram_value.h +++ b/extensions/browser/extension_event_histogram_value.h
@@ -203,7 +203,7 @@ MEDIA_PLAYER_PRIVATE_ON_NEXT_TRACK = 182, MEDIA_PLAYER_PRIVATE_ON_PREV_TRACK = 183, MEDIA_PLAYER_PRIVATE_ON_TOGGLE_PLAY_STATE = 184, - NETWORKING_CONFIG_ON_CAPTIVE_PORTAL_DETECTED = 185, + DELETED_NETWORKING_CONFIG_ON_CAPTIVE_PORTAL_DETECTED = 185, NETWORKING_PRIVATE_ON_DEVICE_STATE_LIST_CHANGED = 186, NETWORKING_PRIVATE_ON_NETWORK_LIST_CHANGED = 187, NETWORKING_PRIVATE_ON_NETWORKS_CHANGED = 188,
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 5789324..60c1d10 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1013,8 +1013,8 @@ FILEMANAGERPRIVATE_SEARCHFILESBYHASHES = 952, DELETED_EASYUNLOCKPRIVATE_SHOWERRORBUBBLE = 953, DELETED_EXTENSIONVIEWINTERNAL_NAVIGATE = 954, // Obsolete: crbug.com/982858 - NETWORKING_CONFIG_SETNETWORKFILTER = 955, - NETWORKING_CONFIG_FINISHAUTHENTICATION = 956, + DELETED_NETWORKING_CONFIG_SETNETWORKFILTER = 955, + DELETED_NETWORKING_CONFIG_FINISHAUTHENTICATION = 956, PLATFORMKEYSINTERNAL_SELECTCLIENTCERTIFICATES = 957, CRYPTOTOKENPRIVATE_CANORIGINASSERTAPPID = 958, DELETED_EASYUNLOCKPRIVATE_SETAUTOPAIRINGRESULT = 959,
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 1c0e38a..04f111d 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json
@@ -387,10 +387,6 @@ "location": "policy", "platforms": ["chromeos"] }], - "networking.config": { - "dependencies": ["permission:networking.config"], - "contexts": ["blessed_extension"] - }, "networking.onc": { "dependencies": ["permission:networking.onc"], "contexts": ["blessed_extension"],
diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json index 6991d9e7..a49fef94 100644 --- a/extensions/common/api/_permission_features.json +++ b/extensions/common/api/_permission_features.json
@@ -460,11 +460,6 @@ "extension", "legacy_packaged_app", "platform_app" ] }, - "networking.config": { - "channel": "stable", - "platforms": ["chromeos"], - "extension_types": ["extension", "platform_app"] - }, "networking.onc": [{ "channel": "stable", "extension_types": ["platform_app"],
diff --git a/extensions/common/api/automation.idl b/extensions/common/api/automation.idl index 4b5c3fc7..e23a7ac8 100644 --- a/extensions/common/api/automation.idl +++ b/extensions/common/api/automation.idl
@@ -33,6 +33,7 @@ documentSelectionChanged, documentTitleChanged, dropeffectChanged, + editableTextChanged, enabledChanged, endOfTest, expanded, @@ -852,6 +853,10 @@ // The purpose of the node, other than the role, if any. DOMString? description; + // Description of the state of the checkbox. + // Used only when the node is checkable. + DOMString? checkedStateDescription; + // The placeholder for this text field, if any. DOMString? placeholder;
diff --git a/extensions/common/api/networking_config.idl b/extensions/common/api/networking_config.idl deleted file mode 100644 index 78b5bc6..0000000 --- a/extensions/common/api/networking_config.idl +++ /dev/null
@@ -1,103 +0,0 @@ -// Copyright 2015 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. - -// Use the <code>networking.config</code> API to authenticate to captive -// portals. -namespace networking.config { - // Indicator for the type of network used in $(ref:NetworkInfo). - enum NetworkType { WiFi }; - - // A dictionary identifying filtered networks. One of <code>GUID</code>, - // <code>SSID</code> or <code>HexSSID</code> must be set. <code>BSSID</code> - // and <code>Security</code> are ignored when filtering networks. - dictionary NetworkInfo { - // Currently only WiFi supported. - NetworkType Type; - - // A unique identifier of the network. - DOMString? GUID; - - // A hex-encoded byte sequence. - DOMString? HexSSID; - - // The decoded SSID of the network (default encoding is UTF-8). To filter - // for non-UTF-8 SSIDs, use HexSSID instead. - DOMString? SSID; - - // The basic service set identification (BSSID) uniquely identifying the - // basic service set. <code>BSSID</code> is represented as a human readable, - // hex-encoded string with bytes separated by colons, e.g. - // 45:67:89:ab:cd:ef. - DOMString? BSSID; - - // Identifier indicating the security type of the network. Valid values are - // <code>None</code>, <code>WEP-PSK</code>, <code>WPA-PSK</code> and - // <code>WPA-EAP</code>. - DOMString? Security; - }; - - // Argument to $(ref:finishAuthentication) indicating the result of the - // captive portal authentication attempt. - enum AuthenticationResult { - // The extension does not handle this network or captive portal (e.g. server - // end-point not found or not compatible). - unhandled, - - // The extension handled this network and authenticated successfully. - succeeded, - - // The extension handled this network, tried to authenticate, however was - // rejected by the server. - rejected, - - // The extension handled this network, tried to authenticate, however failed - // due to an unspecified error. - failed - }; - - // Invoked by $(ref:setNetworkFilter) when the respective operation is - // finished. - callback SetNetworkFilterCallback = void(); - - // Invoked by $(ref:finishAuthentication) when the respective operation is - // finished. - callback FinishAuthenticationCallback = void(); - - interface Functions { - // Allows an extension to define network filters for the networks it can - // handle. A call to this function will remove all filters previously - // installed by the extension before setting the new list. - // |networks|: Network filters to set. Every <code>NetworkInfo</code> must - // either have the <code>SSID</code> or <code>HexSSID</code> - // set. Other fields will be ignored. - // |callback|: Called back when this operation is finished. - void setNetworkFilter(NetworkInfo[] networks, - SetNetworkFilterCallback callback); - - // Called by the extension to notify the network config API that it finished - // a captive portal authentication attempt and hand over the result of the - // attempt. This function must only be called with the GUID of the latest - // $(ref:onCaptivePortalDetected) event. - // |GUID|: Unique network identifier obtained from - // $(ref:onCaptivePortalDetected). - // |result|: The result of the authentication attempt. - // |callback|: Called back when this operation is finished. - void finishAuthentication(DOMString GUID, AuthenticationResult result, - optional FinishAuthenticationCallback callback); - }; - - interface Events { - // This event fires everytime a captive portal is detected on a network - // matching any of the currently registered network filters and the user - // consents to use the extension for authentication. Network filters may be - // set using the $(ref:setNetworkFilter). - // Upon receiving this event the extension should start its authentication - // attempt with the captive portal. When the extension finishes its attempt, - // it must call $(ref:finishAuthentication) with the <code>GUID</code> - // received with this event and the appropriate authentication result. - // |networkInfo|: Information about the network on which a captive portal - // was detected. - static void onCaptivePortalDetected(NetworkInfo networkInfo); - }; -};
diff --git a/extensions/common/api/schema.gni b/extensions/common/api/schema.gni index 0b26dcf..2ab6ca6b8 100644 --- a/extensions/common/api/schema.gni +++ b/extensions/common/api/schema.gni
@@ -70,7 +70,6 @@ "diagnostics.idl", "lock_screen_data.idl", "media_perception_private.idl", - "networking_config.idl", "vpn_provider.idl", "webcam_private.idl", ]
diff --git a/extensions/common/permissions/api_permission.h b/extensions/common/permissions/api_permission.h index 8bf8990..cea3330a 100644 --- a/extensions/common/permissions/api_permission.h +++ b/extensions/common/permissions/api_permission.h
@@ -147,7 +147,7 @@ kMDns = 103, kMusicManagerPrivate = 104, kNativeMessaging = 105, - kNetworkingConfig = 106, + kDeleted_NetworkingConfig = 106, kNetworkingPrivate = 107, kDeleted_NotificationProvider = 108, kNotifications = 109,
diff --git a/extensions/common/permissions/extensions_api_permissions.cc b/extensions/common/permissions/extensions_api_permissions.cc index 71c8646..89acd1b 100644 --- a/extensions/common/permissions/extensions_api_permissions.cc +++ b/extensions/common/permissions/extensions_api_permissions.cc
@@ -100,8 +100,6 @@ APIPermissionInfo::kFlagCannotBeOptional}, {APIPermission::kNativeMessaging, "nativeMessaging", APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning}, - {APIPermission::kNetworkingConfig, "networking.config", - APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning}, {APIPermission::kNetworkingOnc, "networking.onc"}, {APIPermission::kNetworkingPrivate, "networkingPrivate", APIPermissionInfo::kFlagCannotBeOptional},
diff --git a/extensions/renderer/api/automation/automation_api_util.cc b/extensions/renderer/api/automation/automation_api_util.cc index c53ac2a5..f68ca03 100644 --- a/extensions/renderer/api/automation/automation_api_util.cc +++ b/extensions/renderer/api/automation/automation_api_util.cc
@@ -14,7 +14,7 @@ namespace extensions { -bool IsEventTypeHandledByAXEventGenerator(ax::mojom::Event event_type) { +bool ShouldIgnoreAXEvent(ax::mojom::Event event_type) { // Important note: if you are getting here as a result of a compilation error // while adding or removing enum values from ax::mojom::Event, please ensure // you keep that enum in sync with EventType in @@ -37,7 +37,6 @@ case ax::mojom::Event::kRowCollapsed: case ax::mojom::Event::kRowCountChanged: case ax::mojom::Event::kRowExpanded: - case ax::mojom::Event::kScrollPositionChanged: case ax::mojom::Event::kSelectedChildrenChanged: return true; @@ -73,6 +72,7 @@ case ax::mojom::Event::kMousePressed: case ax::mojom::Event::kMouseReleased: case ax::mojom::Event::kScrolledToAnchor: + case ax::mojom::Event::kScrollPositionChanged: case ax::mojom::Event::kSelection: case ax::mojom::Event::kSelectionAdd: case ax::mojom::Event::kSelectionRemove: @@ -118,6 +118,7 @@ case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED: case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED: + case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: case ui::AXEventGenerator::Event::ENABLED_CHANGED: case ui::AXEventGenerator::Event::EXPANDED: case ui::AXEventGenerator::Event::FOCUS_CHANGED:
diff --git a/extensions/renderer/api/automation/automation_api_util.h b/extensions/renderer/api/automation/automation_api_util.h index 0f4a925..1873f923 100644 --- a/extensions/renderer/api/automation/automation_api_util.h +++ b/extensions/renderer/api/automation/automation_api_util.h
@@ -11,7 +11,7 @@ namespace extensions { -bool IsEventTypeHandledByAXEventGenerator(ax::mojom::Event event_type); +bool ShouldIgnoreAXEvent(ax::mojom::Event event_type); bool ShouldIgnoreGeneratedEvent(ui::AXEventGenerator::Event event_type);
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc index 39cc85a..3ff57624 100644 --- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc +++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
@@ -145,9 +145,8 @@ event.event_type == ax::mojom::Event::kBlur) continue; - // Send some events directly from the event message, if they're not - // handled by AXEventGenerator yet. - if (!IsEventTypeHandledByAXEventGenerator(event.event_type)) { + // Send some events directly. + if (!ShouldIgnoreAXEvent(event.event_type)) { owner_->SendAutomationEvent(event_bundle.tree_id, event_bundle.mouse_location, event); }
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc index 0f3df82..298144b 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -155,7 +155,7 @@ for (int i = static_cast<int>(ax::mojom::Event::kMinValue); i <= static_cast<int>(ax::mojom::Event::kMaxValue); i++) { auto ax_event_type = static_cast<ax::mojom::Event>(i); - if (IsEventTypeHandledByAXEventGenerator(ax_event_type) || + if (ShouldIgnoreAXEvent(ax_event_type) || ax_event_type == ax::mojom::Event::kNone) { enum_map->emplace_back(api::automation::EVENT_TYPE_NONE); continue;
diff --git a/fuchsia/engine/browser/ax_tree_converter.cc b/fuchsia/engine/browser/ax_tree_converter.cc index 652c7ae..da2b25e0 100644 --- a/fuchsia/engine/browser/ax_tree_converter.cc +++ b/fuchsia/engine/browser/ax_tree_converter.cc
@@ -29,21 +29,6 @@ // so as to not conflict with other values used by Chromium. constexpr uint32_t kZeroIdRemappedForFuchsia = 1u + INT32_MAX; -fuchsia::accessibility::semantics::Role ConvertRole(ax::mojom::Role role) { - if (role == ax::mojom::Role::kButton) - return fuchsia::accessibility::semantics::Role::BUTTON; - if (role == ax::mojom::Role::kHeader) - return fuchsia::accessibility::semantics::Role::HEADER; - if (role == ax::mojom::Role::kImage) - return fuchsia::accessibility::semantics::Role::IMAGE; - if (role == ax::mojom::Role::kSlider) - return fuchsia::accessibility::semantics::Role::SLIDER; - if (role == ax::mojom::Role::kTextField) - return fuchsia::accessibility::semantics::Role::TEXT_FIELD; - - return fuchsia::accessibility::semantics::Role::UNKNOWN; -} - fuchsia::accessibility::semantics::Attributes ConvertAttributes( const ui::AXNodeData& node) { fuchsia::accessibility::semantics::Attributes attributes; @@ -79,6 +64,35 @@ return attributes; } +// Converts an ax::mojom::Role to a fuchsia::accessibility::semantics::Role. +fuchsia::accessibility::semantics::Role AxRoleToFuchsiaSemanticRole( + ax::mojom::Role role) { + switch (role) { + case ax::mojom::Role::kButton: + return fuchsia::accessibility::semantics::Role::BUTTON; + case ax::mojom::Role::kCheckBox: + return fuchsia::accessibility::semantics::Role::CHECK_BOX; + case ax::mojom::Role::kHeader: + return fuchsia::accessibility::semantics::Role::HEADER; + case ax::mojom::Role::kImage: + return fuchsia::accessibility::semantics::Role::IMAGE; + case ax::mojom::Role::kLink: + return fuchsia::accessibility::semantics::Role::LINK; + case ax::mojom::Role::kRadioButton: + return fuchsia::accessibility::semantics::Role::RADIO_BUTTON; + case ax::mojom::Role::kSlider: + return fuchsia::accessibility::semantics::Role::SLIDER; + case ax::mojom::Role::kTextField: + return fuchsia::accessibility::semantics::Role::TEXT_FIELD; + case ax::mojom::Role::kStaticText: + return fuchsia::accessibility::semantics::Role::STATIC_TEXT; + default: + return fuchsia::accessibility::semantics::Role::UNKNOWN; + } + + return fuchsia::accessibility::semantics::Role::UNKNOWN; +} + // This function handles conversions for all data that is part of a Semantic // Node's state. The corresponding data in an AXNodeData is stored in various // attributes. @@ -196,7 +210,7 @@ const ui::AXNodeData& node) { fuchsia::accessibility::semantics::Node fuchsia_node; fuchsia_node.set_node_id(base::checked_cast<uint32_t>(node.id)); - fuchsia_node.set_role(ConvertRole(node.role)); + fuchsia_node.set_role(AxRoleToFuchsiaSemanticRole(node.role)); fuchsia_node.set_states(ConvertStates(node)); fuchsia_node.set_attributes(ConvertAttributes(node)); fuchsia_node.set_actions(ConvertActions(node));
diff --git a/fuchsia/engine/browser/ax_tree_converter_unittest.cc b/fuchsia/engine/browser/ax_tree_converter_unittest.cc index a0f3f94..00c9a9ec 100644 --- a/fuchsia/engine/browser/ax_tree_converter_unittest.cc +++ b/fuchsia/engine/browser/ax_tree_converter_unittest.cc
@@ -250,4 +250,44 @@ EXPECT_EQ(10u, ConvertToFuchsiaNodeId(10, 0)); } +TEST_F(AXTreeConverterTest, ConvertRoles) { + ui::AXNodeData node; + node.id = 0; + node.role = ax::mojom::Role::kButton; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::BUTTON, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kCheckBox; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::CHECK_BOX, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kHeader; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::HEADER, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kImage; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::IMAGE, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kLink; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::LINK, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kRadioButton; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::RADIO_BUTTON, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kSlider; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::SLIDER, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kTextField; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::TEXT_FIELD, + AXNodeDataToSemanticNode(node).role()); + + node.role = ax::mojom::Role::kStaticText; + EXPECT_EQ(fuchsia::accessibility::semantics::Role::STATIC_TEXT, + AXNodeDataToSemanticNode(node).role()); +} + } // namespace
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn index 2c913fd..c90b427 100644 --- a/gpu/BUILD.gn +++ b/gpu/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//build/config/ui.gni") +import("//gpu/vulkan/features.gni") import("//testing/libfuzzer/fuzzer_test.gni") import("//testing/test.gni") import("//third_party/protobuf/proto_library.gni") @@ -424,6 +425,13 @@ sources += [ "command_buffer/service/shared_image_backing_factory_d3d_unittest.cc", ] + } else if (is_linux || is_chromeos) { + # Simply loading the Vulkan driver leaks crbug.com/1134681 + if (enable_vulkan && !is_lsan) { + deps += [ "//gpu/vulkan/init:init" ] + sources += + [ "command_buffer/service/external_vk_image_factory_unittest.cc" ] + } } if (use_dawn) {
diff --git a/gpu/command_buffer/client/webgpu_implementation.cc b/gpu/command_buffer/client/webgpu_implementation.cc index c558e42..cbc55df8 100644 --- a/gpu/command_buffer/client/webgpu_implementation.cc +++ b/gpu/command_buffer/client/webgpu_implementation.cc
@@ -229,10 +229,10 @@ memory_transfer_service_ = std::make_unique<DawnClientMemoryTransferService>(mapped_memory_.get()); - procs_ = dawn_wire::WireClient::GetProcs(); + procs_ = dawn_wire::client::GetProcs(); // TODO(senorblanco): Do this only once per process. Doing it once per - // WebGPUImplementation is non-optimal but valid valid, since the returned + // WebGPUImplementation is non-optimal but valid, since the returned // procs are always the same. dawnProcSetProcs(&procs_); #endif
diff --git a/gpu/command_buffer/service/DEPS b/gpu/command_buffer/service/DEPS index ff50b4a7..eb0ba63 100644 --- a/gpu/command_buffer/service/DEPS +++ b/gpu/command_buffer/service/DEPS
@@ -10,3 +10,9 @@ "+components/viz/common/resources/resource_format_utils.h", "+components/viz/common/resources/resource_sizes.h", ] + +specific_include_rules = { + "external_vk_image_factory_unittest\.cc": [ + "+components/viz/common/gpu/vulkan_in_process_context_provider.h", + ], +}
diff --git a/gpu/command_buffer/service/external_vk_image_backing.cc b/gpu/command_buffer/service/external_vk_image_backing.cc index 48bb0d8..ac5bb38 100644 --- a/gpu/command_buffer/service/external_vk_image_backing.cc +++ b/gpu/command_buffer/service/external_vk_image_backing.cc
@@ -218,6 +218,15 @@ } } + if (is_external && (usage & SHARED_IMAGE_USAGE_WEBGPU)) { + // The following additional usage flags are provided for Dawn: + // + // - TRANSFER_SRC: Used for copies from this image. + // - TRANSFER_DST: Used for copies to this image or clears. + vk_usage |= + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + } + auto* vulkan_implementation = context_state->vk_context_provider()->GetVulkanImplementation(); VkImageCreateFlags vk_flags = 0;
diff --git a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc index a3db84f..3a31092 100644 --- a/gpu/command_buffer/service/external_vk_image_dawn_representation.cc +++ b/gpu/command_buffer/service/external_vk_image_dawn_representation.cc
@@ -62,8 +62,19 @@ descriptor.memoryTypeIndex = backing_impl()->image()->memory_type_index(); descriptor.memoryFD = dup(memory_fd_.get()); - // TODO(http://crbug.com/dawn/200): We may not be obeying all of the rules - // specified by Vulkan for external queue transfer barriers. Investigate this. + const GrBackendTexture& backend_texture = backing_impl()->backend_texture(); + GrVkImageInfo image_info; + backend_texture.getVkImageInfo(&image_info); + // We should either be importing the image from the external queue, or it + // was just created with no queue ownership. + DCHECK(image_info.fCurrentQueueFamily == VK_QUEUE_FAMILY_IGNORED || + image_info.fCurrentQueueFamily == VK_QUEUE_FAMILY_EXTERNAL); + + // Note: This assumes the previous owner of the shared image did not do a + // layout transition on EndAccess, and saved the exported layout on the + // GrBackendTexture. + descriptor.releasedOldLayout = image_info.fImageLayout; + descriptor.releasedNewLayout = image_info.fImageLayout; for (auto& external_semaphore : begin_access_semaphores_) { descriptor.waitFDs.push_back( @@ -89,6 +100,16 @@ SetCleared(); } + // Exporting to VK_IMAGE_LAYOUT_UNDEFINED means no transition should be + // done. The old/new layouts are the same. + DCHECK_EQ(export_info.releasedOldLayout, export_info.releasedNewLayout); + + // Save the layout on the GrBackendTexture. Other shared image + // representations read it from here. + GrBackendTexture backend_texture = backing_impl()->backend_texture(); + backend_texture.setMutableState(GrBackendSurfaceMutableState( + export_info.releasedNewLayout, VK_QUEUE_FAMILY_EXTERNAL)); + // TODO(enga): Handle waiting on multiple semaphores from dawn DCHECK(export_info.semaphoreHandles.size() == 1);
diff --git a/gpu/command_buffer/service/external_vk_image_factory.h b/gpu/command_buffer/service/external_vk_image_factory.h index f736400c..2e77498 100644 --- a/gpu/command_buffer/service/external_vk_image_factory.h +++ b/gpu/command_buffer/service/external_vk_image_factory.h
@@ -10,6 +10,7 @@ #include "gpu/command_buffer/service/external_vk_image_backing.h" #include "gpu/command_buffer/service/shared_image_backing_factory.h" +#include "gpu/gpu_gles2_export.h" namespace gpu { class SharedContextState; @@ -20,7 +21,8 @@ // can be exported out of Vulkan and be used in GL. Synchronization between // Vulkan and GL is done using VkSemaphores that are created with special flags // that allow it to be exported out and shared with GL. -class ExternalVkImageFactory : public SharedImageBackingFactory { +class GPU_GLES2_EXPORT ExternalVkImageFactory + : public SharedImageBackingFactory { public: explicit ExternalVkImageFactory( scoped_refptr<SharedContextState> context_state);
diff --git a/gpu/command_buffer/service/external_vk_image_factory_unittest.cc b/gpu/command_buffer/service/external_vk_image_factory_unittest.cc new file mode 100644 index 0000000..f682f81 --- /dev/null +++ b/gpu/command_buffer/service/external_vk_image_factory_unittest.cc
@@ -0,0 +1,388 @@ +// Copyright 2020 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. + +#include "gpu/command_buffer/service/external_vk_image_factory.h" + +#include <memory> +#include <utility> + +#include "base/bind_helpers.h" +#include "components/viz/common/gpu/vulkan_in_process_context_provider.h" +#include "gpu/command_buffer/service/external_vk_image_dawn_representation.h" +#include "gpu/command_buffer/service/external_vk_image_skia_representation.h" +#include "gpu/command_buffer/service/shared_context_state.h" +#include "gpu/command_buffer/service/shared_image_factory.h" +#include "gpu/command_buffer/service/shared_image_manager.h" +#include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/skia_utils.h" +#include "gpu/config/gpu_test_config.h" +#include "gpu/vulkan/init/vulkan_factory.h" +#include "gpu/vulkan/vulkan_implementation.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkImage.h" +#include "third_party/skia/include/core/SkPromiseImageTexture.h" +#include "third_party/skia/include/core/SkSurface.h" +#include "third_party/skia/include/gpu/GrBackendSemaphore.h" +#include "ui/gl/buildflags.h" +#include "ui/gl/gl_context.h" +#include "ui/gl/gl_surface.h" +#include "ui/gl/init/gl_factory.h" + +#if BUILDFLAG(USE_DAWN) +#include <dawn/dawn_proc.h> +#include <dawn/webgpu_cpp.h> +#include <dawn_native/DawnNative.h> +#endif // BUILDFLAG(USE_DAWN) + +namespace gpu { +namespace { + +class ExternalVkImageFactoryTest : public testing::Test { + protected: + void SetUp() override { + // Set up the Vulkan implementation and context provider. + vulkan_implementation_ = gpu::CreateVulkanImplementation(); + DCHECK(vulkan_implementation_) << "Failed to create Vulkan implementation"; + + auto initialize_vulkan = vulkan_implementation_->InitializeVulkanInstance(); + DCHECK(initialize_vulkan) << "Failed to initialize Vulkan implementation."; + + vulkan_context_provider_ = viz::VulkanInProcessContextProvider::Create( + vulkan_implementation_.get()); + DCHECK(vulkan_context_provider_) + << "Failed to create Vulkan context provider"; + + // Set up a GL context. We don't actually need it, but we can't make + // a SharedContextState without one. + gl_surface_ = gl::init::CreateOffscreenGLSurface(gfx::Size()); + DCHECK(gl_surface_); + gl_context_ = gl::init::CreateGLContext(nullptr, gl_surface_.get(), + gl::GLContextAttribs()); + DCHECK(gl_context_); + bool make_current_result = gl_context_->MakeCurrent(gl_surface_.get()); + DCHECK(make_current_result); + + scoped_refptr<gl::GLShareGroup> share_group = new gl::GLShareGroup(); + context_state_ = base::MakeRefCounted<SharedContextState>( + std::move(share_group), gl_surface_, gl_context_, + false /* use_virtualized_gl_contexts */, base::DoNothing(), + GrContextType::kVulkan, vulkan_context_provider_.get()); + + GpuPreferences gpu_preferences = {}; + GpuDriverBugWorkarounds workarounds = {}; + context_state_->InitializeGrContext(gpu_preferences, workarounds, nullptr); + + memory_type_tracker_ = std::make_unique<MemoryTypeTracker>(nullptr); + shared_image_representation_factory_ = + std::make_unique<SharedImageRepresentationFactory>( + &shared_image_manager_, nullptr); + shared_image_factory_ = + std::make_unique<ExternalVkImageFactory>(context_state_); + +#if BUILDFLAG(USE_DAWN) + // Create a Dawn Vulkan device + dawn_instance_.DiscoverDefaultAdapters(); + + std::vector<dawn_native::Adapter> adapters = dawn_instance_.GetAdapters(); + auto adapter_it = std::find_if( + adapters.begin(), adapters.end(), [](dawn_native::Adapter adapter) { + return adapter.GetBackendType() == dawn_native::BackendType::Vulkan; + }); + ASSERT_NE(adapter_it, adapters.end()); + + DawnProcTable procs = dawn_native::GetProcs(); + dawnProcSetProcs(&procs); + + dawn_device_ = wgpu::Device::Acquire(adapter_it->CreateDevice()); + DCHECK(dawn_device_) << "Failed to create Dawn device"; +#endif // BUILDFLAG(USE_DAWN) + } + + void TearDown() override { +#if BUILDFLAG(USE_DAWN) + dawn_device_ = wgpu::Device(); + dawnProcSetProcs(nullptr); +#endif // BUILDFLAG(USE_DAWN) + } + + std::unique_ptr<VulkanImplementation> vulkan_implementation_; + scoped_refptr<viz::VulkanInProcessContextProvider> vulkan_context_provider_; + + scoped_refptr<gl::GLSurface> gl_surface_; + scoped_refptr<gl::GLContext> gl_context_; + scoped_refptr<SharedContextState> context_state_; + + SharedImageManager shared_image_manager_; + std::unique_ptr<MemoryTypeTracker> memory_type_tracker_; + std::unique_ptr<SharedImageRepresentationFactory> + shared_image_representation_factory_; + std::unique_ptr<ExternalVkImageFactory> shared_image_factory_; + +#if BUILDFLAG(USE_DAWN) + dawn_native::Instance dawn_instance_; + wgpu::Device dawn_device_; +#endif // BUILDFLAG(USE_DAWN) +}; + +#if BUILDFLAG(USE_DAWN) + +TEST_F(ExternalVkImageFactoryTest, DawnWrite_SkiaVulkanRead) { + // Create a backing using mailbox. + auto mailbox = Mailbox::GenerateForSharedImage(); + const auto format = viz::ResourceFormat::RGBA_8888; + const gfx::Size size(4, 4); + const auto color_space = gfx::ColorSpace::CreateSRGB(); + const uint32_t usage = SHARED_IMAGE_USAGE_DISPLAY | SHARED_IMAGE_USAGE_WEBGPU; + const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; + auto backing = shared_image_factory_->CreateSharedImage( + mailbox, format, surface_handle, size, color_space, + kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, usage, + false /* is_thread_safe */); + ASSERT_NE(backing, nullptr); + + std::unique_ptr<SharedImageRepresentationFactoryRef> factory_ref = + shared_image_manager_.Register(std::move(backing), + memory_type_tracker_.get()); + + { + // Create a Dawn representation to clear the texture contents to a green. + auto dawn_representation = + shared_image_representation_factory_->ProduceDawn(mailbox, + dawn_device_.Get()); + ASSERT_TRUE(dawn_representation); + + auto dawn_scoped_access = dawn_representation->BeginScopedAccess( + WGPUTextureUsage_OutputAttachment, + SharedImageRepresentation::AllowUnclearedAccess::kYes); + ASSERT_TRUE(dawn_scoped_access); + + wgpu::Texture texture(dawn_scoped_access->texture()); + wgpu::RenderPassColorAttachmentDescriptor color_desc; + color_desc.attachment = texture.CreateView(); + color_desc.resolveTarget = nullptr; + color_desc.loadOp = wgpu::LoadOp::Clear; + color_desc.storeOp = wgpu::StoreOp::Store; + color_desc.clearColor = {0, 255, 0, 255}; + + wgpu::RenderPassDescriptor renderPassDesc = {}; + renderPassDesc.colorAttachmentCount = 1; + renderPassDesc.colorAttachments = &color_desc; + renderPassDesc.depthStencilAttachment = nullptr; + + wgpu::CommandEncoder encoder = dawn_device_.CreateCommandEncoder(); + wgpu::RenderPassEncoder pass = encoder.BeginRenderPass(&renderPassDesc); + pass.EndPass(); + wgpu::CommandBuffer commands = encoder.Finish(); + + wgpu::Queue queue = dawn_device_.GetDefaultQueue(); + queue.Submit(1, &commands); + } + + EXPECT_TRUE(factory_ref->IsCleared()); + + { + auto skia_representation = + shared_image_representation_factory_->ProduceSkia(mailbox, + context_state_.get()); + + std::vector<GrBackendSemaphore> begin_semaphores; + std::vector<GrBackendSemaphore> end_semaphores; + auto skia_scoped_access = skia_representation->BeginScopedReadAccess( + &begin_semaphores, &end_semaphores); + + context_state_->gr_context()->wait(begin_semaphores.size(), + begin_semaphores.data()); + + EXPECT_TRUE(skia_scoped_access); + + auto* promise_texture = skia_scoped_access->promise_image_texture(); + GrBackendTexture backend_texture = promise_texture->backendTexture(); + + EXPECT_TRUE(backend_texture.isValid()); + EXPECT_EQ(size.width(), backend_texture.width()); + EXPECT_EQ(size.height(), backend_texture.height()); + + // Create an Sk Image from GrBackendTexture. + auto sk_image = SkImage::MakeFromTexture( + context_state_->gr_context(), backend_texture, kTopLeft_GrSurfaceOrigin, + kRGBA_8888_SkColorType, kOpaque_SkAlphaType, nullptr); + + const SkImageInfo dst_info = + SkImageInfo::Make(size.width(), size.height(), kRGBA_8888_SkColorType, + kOpaque_SkAlphaType, nullptr); + + const int num_pixels = size.width() * size.height(); + std::vector<uint8_t> dst_pixels(num_pixels * 4); + + // Read back pixels from Sk Image. + EXPECT_TRUE(sk_image->readPixels(dst_info, dst_pixels.data(), + dst_info.minRowBytes(), 0, 0)); + + for (int i = 0; i < num_pixels; i++) { + // Compare the pixel values. + const uint8_t* pixel = dst_pixels.data() + (i * 4); + EXPECT_EQ(pixel[0], 0); + EXPECT_EQ(pixel[1], 255); + EXPECT_EQ(pixel[2], 0); + EXPECT_EQ(pixel[3], 255); + } + + GrFlushInfo flush_info; + flush_info.fNumSemaphores = end_semaphores.size(); + flush_info.fSignalSemaphores = end_semaphores.data(); + gpu::AddVulkanCleanupTaskForSkiaFlush(vulkan_context_provider_.get(), + &flush_info); + + context_state_->gr_context()->flush(flush_info); + context_state_->gr_context()->submit(); + } +} + +TEST_F(ExternalVkImageFactoryTest, SkiaVulkanWrite_DawnRead) { + // Create a backing using mailbox. + auto mailbox = Mailbox::GenerateForSharedImage(); + const auto format = viz::ResourceFormat::RGBA_8888; + const gfx::Size size(4, 4); + const auto color_space = gfx::ColorSpace::CreateSRGB(); + const uint32_t usage = SHARED_IMAGE_USAGE_DISPLAY | SHARED_IMAGE_USAGE_WEBGPU; + const gpu::SurfaceHandle surface_handle = gpu::kNullSurfaceHandle; + auto backing = shared_image_factory_->CreateSharedImage( + mailbox, format, surface_handle, size, color_space, + kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, usage, + false /* is_thread_safe */); + ASSERT_NE(backing, nullptr); + + std::unique_ptr<SharedImageRepresentationFactoryRef> factory_ref = + shared_image_manager_.Register(std::move(backing), + memory_type_tracker_.get()); + + { + // Create a SkiaRepresentation + auto skia_representation = + shared_image_representation_factory_->ProduceSkia(mailbox, + context_state_.get()); + + // Begin access for writing + std::vector<GrBackendSemaphore> begin_semaphores; + std::vector<GrBackendSemaphore> end_semaphores; + auto skia_scoped_access = skia_representation->BeginScopedWriteAccess( + 1 /* final_msaa_count */, + SkSurfaceProps(0 /* flags */, kUnknown_SkPixelGeometry), + &begin_semaphores, &end_semaphores, + gpu::SharedImageRepresentation::AllowUnclearedAccess::kYes); + + SkSurface* dest_surface = skia_scoped_access->surface(); + dest_surface->wait(begin_semaphores.size(), begin_semaphores.data()); + SkCanvas* dest_canvas = dest_surface->getCanvas(); + + // Color the top half blue, and the bottom half green + dest_canvas->drawRect(SkRect{0, 0, size.width(), size.height() / 2}, + SkPaint(SkColors::kBlue)); + dest_canvas->drawRect( + SkRect{0, size.height() / 2, size.width(), size.height()}, + SkPaint(SkColors::kGreen)); + skia_representation->SetCleared(); + + GrFlushInfo flush_info; + flush_info.fNumSemaphores = end_semaphores.size(); + flush_info.fSignalSemaphores = end_semaphores.data(); + gpu::AddVulkanCleanupTaskForSkiaFlush(vulkan_context_provider_.get(), + &flush_info); + dest_surface->flush(flush_info, skia_scoped_access->end_state()); + if (skia_scoped_access->end_state()) { + context_state_->gr_context()->setBackendTextureState( + dest_surface->getBackendTexture( + SkSurface::BackendHandleAccess::kFlushRead_BackendHandleAccess), + *skia_scoped_access->end_state()); + } + context_state_->gr_context()->submit(); + } + + { + // Create a Dawn representation + auto dawn_representation = + shared_image_representation_factory_->ProduceDawn(mailbox, + dawn_device_.Get()); + ASSERT_TRUE(dawn_representation); + + // Begin access to copy the data out. Skia should have initialized the + // contents. + auto dawn_scoped_access = dawn_representation->BeginScopedAccess( + WGPUTextureUsage_CopySrc, + SharedImageRepresentation::AllowUnclearedAccess::kNo); + ASSERT_TRUE(dawn_scoped_access); + + wgpu::Texture src_texture(dawn_scoped_access->texture()); + + // Create a buffer to read back the texture data + wgpu::BufferDescriptor dst_buffer_desc = {}; + dst_buffer_desc.usage = + wgpu::BufferUsage::CopyDst | wgpu::BufferUsage::MapRead; + dst_buffer_desc.size = 256 * size.height(); + wgpu::Buffer dst_buffer = dawn_device_.CreateBuffer(&dst_buffer_desc); + + // Encode the buffer copy + wgpu::CommandEncoder encoder = dawn_device_.CreateCommandEncoder(); + { + wgpu::TextureCopyView src_copy_view = {}; + src_copy_view.origin = {0, 0, 0}; + src_copy_view.texture = src_texture; + + wgpu::BufferCopyView dst_copy_view = {}; + dst_copy_view.buffer = dst_buffer; + dst_copy_view.layout.bytesPerRow = 256; + dst_copy_view.layout.offset = 0; + dst_copy_view.layout.rowsPerImage = 0; + + wgpu::Extent3D copy_extent = {size.width(), size.height(), 1}; + + encoder.CopyTextureToBuffer(&src_copy_view, &dst_copy_view, ©_extent); + } + + wgpu::CommandBuffer commands = encoder.Finish(); + wgpu::Queue queue = dawn_device_.GetDefaultQueue(); + queue.Submit(1, &commands); + + // Map the buffer to read back data + bool done = false; + dst_buffer.MapAsync( + wgpu::MapMode::Read, 0, 256 * size.height(), + [](WGPUBufferMapAsyncStatus status, void* userdata) { + EXPECT_EQ(status, WGPUBufferMapAsyncStatus_Success); + *static_cast<bool*>(userdata) = true; + }, + &done); + + while (!done) { + base::PlatformThread::Sleep(base::TimeDelta::FromMicroseconds(100)); + dawn_device_.Tick(); + } + + // Check the pixel data + const uint8_t* pixel_data = + static_cast<const uint8_t*>(dst_buffer.GetConstMappedRange()); + for (int h = 0; h < size.height(); ++h) { + for (int w = 0; w < size.width(); ++w) { + const uint8_t* pixel = (pixel_data + h * 256) + w * 4; + if (h < size.height() / 2) { + EXPECT_EQ(pixel[0], 0); + EXPECT_EQ(pixel[1], 0); + EXPECT_EQ(pixel[2], 255); + EXPECT_EQ(pixel[3], 255); + } else { + EXPECT_EQ(pixel[0], 0); + EXPECT_EQ(pixel[1], 255); + EXPECT_EQ(pixel[2], 0); + EXPECT_EQ(pixel[3], 255); + } + } + } + } +} + +#endif // BUILDFLAG(USE_DAWN) + +} // anonymous namespace +} // namespace gpu \ No newline at end of file
diff --git a/gpu/command_buffer/service/external_vk_image_skia_representation.cc b/gpu/command_buffer/service/external_vk_image_skia_representation.cc index 380d617b..f562e80 100644 --- a/gpu/command_buffer/service/external_vk_image_skia_representation.cc +++ b/gpu/command_buffer/service/external_vk_image_skia_representation.cc
@@ -80,7 +80,7 @@ access_mode_ = kWrite; - // If Vulkan and GL (or Dawn) share the same memory backing, we need set + // If Vulkan/GL/Dawn share the same memory backing, we need set // |end_state| VK_QUEUE_FAMILY_EXTERNAL, and then the caller will set the // VkImage to VK_QUEUE_FAMILY_EXTERNAL before calling EndAccess(). if (backing_impl()->need_synchronization()) { @@ -120,10 +120,10 @@ return nullptr; } - // If Vulkan and GLSet share the same memory backing, we need set |end_state| + // If Vulkan/GL/Dawn share the same memory backing, we need set |end_state| // VK_QUEUE_FAMILY_EXTERNAL, and then the caller will set the VkImage to // VK_QUEUE_FAMILY_EXTERNAL before calling EndAccess(). - if (!backing_impl()->use_separate_gl_texture()) { + if (backing_impl()->need_synchronization()) { *end_state = std::make_unique<GrBackendSurfaceMutableState>( VK_IMAGE_LAYOUT_UNDEFINED, VK_QUEUE_FAMILY_EXTERNAL); }
diff --git a/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc b/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc index ab25393e..626b6f0 100644 --- a/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc +++ b/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
@@ -135,7 +135,7 @@ base::CheckedNumeric<uint64_t> safe_total_image_size = 0u; for (const auto& plane_image : decode_entry->plane_images()) { safe_total_image_size += base::strict_cast<uint64_t>( - GrContext::ComputeImageSize(plane_image, GrMipMapped::kYes)); + GrDirectContext::ComputeImageSize(plane_image, GrMipMapped::kYes)); } return safe_total_image_size; }
diff --git a/infra/config/dev/dev.star b/infra/config/dev/dev.star index 51e9f51d..d514e1c 100755 --- a/infra/config/dev/dev.star +++ b/infra/config/dev/dev.star
@@ -54,6 +54,9 @@ ], ) +# Launch Swarming tasks in "realms-aware mode", crbug.com/1136313. +luci.builder.defaults.experiments.set({"luci.use_realms": 100}) + exec("//dev/swarming.star") exec("//dev/subprojects/chromium/subproject.star")
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 49ee9fb1..4529f76 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -1001,7 +1001,6 @@ } builders { name: "chromium/try/linux-chromeos-rel" - cancel_stale: NO location_regexp: ".*" location_regexp_exclude: ".+/[+]/docs/.+" location_regexp_exclude: ".+/[+]/infra/config/.+"
diff --git a/infra/config/generated/cr-buildbucket-dev.cfg b/infra/config/generated/cr-buildbucket-dev.cfg index ba6dea44..c62a86d1 100644 --- a/infra/config/generated/cr-buildbucket-dev.cfg +++ b/infra/config/generated/cr-buildbucket-dev.cfg
@@ -39,6 +39,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports { @@ -66,6 +70,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports { @@ -93,6 +101,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports { @@ -121,6 +133,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports { @@ -148,6 +164,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports { @@ -175,6 +195,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports { @@ -202,6 +226,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 100 + } resultdb { enable: true bq_exports {
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 8dea24d..9e8b1a5 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -37,6 +37,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -66,6 +70,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -95,6 +103,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -124,6 +136,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -153,6 +169,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -182,6 +202,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -211,6 +235,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -240,6 +268,10 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -269,6 +301,10 @@ execution_timeout_secs: 16200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -298,6 +334,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -337,6 +377,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -376,6 +420,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -415,6 +463,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -454,6 +506,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -493,6 +549,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -532,6 +592,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -571,6 +635,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -610,6 +678,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -649,6 +721,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -688,6 +764,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -727,6 +807,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -766,6 +850,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -805,6 +893,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -844,6 +936,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -883,6 +979,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -922,6 +1022,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -951,6 +1055,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -980,6 +1088,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1009,6 +1121,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1038,6 +1154,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1067,6 +1187,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1096,6 +1220,10 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1125,6 +1253,10 @@ execution_timeout_secs: 18000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1154,6 +1286,10 @@ execution_timeout_secs: 18000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1183,6 +1319,10 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1212,6 +1352,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1241,6 +1385,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1270,6 +1418,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1299,6 +1451,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1328,6 +1484,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1357,6 +1517,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1396,6 +1560,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1435,6 +1603,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1464,6 +1636,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1493,6 +1669,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1522,6 +1702,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1551,6 +1735,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1580,6 +1768,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1609,6 +1801,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1638,6 +1834,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1667,6 +1867,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1694,6 +1898,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1721,6 +1929,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1750,6 +1962,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1779,6 +1995,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1808,6 +2028,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1837,6 +2061,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1866,6 +2094,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1895,6 +2127,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1924,6 +2160,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1953,6 +2193,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -1982,6 +2226,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2011,6 +2259,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2040,6 +2292,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2069,6 +2325,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2098,6 +2358,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2127,6 +2391,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2156,6 +2424,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2185,6 +2457,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2214,6 +2490,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2243,6 +2523,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2272,6 +2556,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2301,6 +2589,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2330,6 +2622,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2359,6 +2655,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2388,6 +2688,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2417,6 +2721,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2446,6 +2754,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2485,6 +2797,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2524,6 +2840,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2563,6 +2883,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2600,6 +2924,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2637,6 +2965,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2674,6 +3006,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2713,6 +3049,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2752,6 +3092,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2791,6 +3135,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2830,6 +3178,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2869,6 +3221,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2908,6 +3264,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2947,6 +3307,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -2986,6 +3350,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3025,6 +3393,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3064,6 +3436,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3103,6 +3479,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3142,6 +3522,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3179,6 +3563,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3216,6 +3604,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3255,6 +3647,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3294,6 +3690,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3333,6 +3733,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3362,6 +3766,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3391,6 +3799,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3420,6 +3832,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3449,6 +3865,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3477,6 +3897,10 @@ execution_timeout_secs: 12600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3506,6 +3930,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3535,6 +3963,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3564,6 +3996,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3593,6 +4029,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3622,6 +4062,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3651,6 +4095,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3679,6 +4127,10 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3707,6 +4159,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3736,6 +4192,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3765,6 +4225,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3794,6 +4258,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3823,6 +4291,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3852,6 +4324,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3881,6 +4357,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3910,6 +4390,10 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3939,6 +4423,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3968,6 +4456,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -3997,6 +4489,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4026,6 +4522,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4055,6 +4555,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4084,6 +4588,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4123,6 +4631,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4162,6 +4674,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4201,6 +4717,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4240,6 +4760,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4279,6 +4803,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4318,6 +4846,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4357,6 +4889,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4396,6 +4932,10 @@ execution_timeout_secs: 64800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4435,6 +4975,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4474,6 +5018,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4513,6 +5061,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4552,6 +5104,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4591,6 +5147,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4630,6 +5190,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4669,6 +5233,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4698,6 +5266,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4727,6 +5299,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4756,6 +5332,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4785,6 +5365,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4814,6 +5398,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4853,6 +5441,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4882,6 +5474,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4911,6 +5507,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4940,6 +5540,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -4973,6 +5577,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5006,6 +5614,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5039,6 +5651,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5068,6 +5684,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5097,6 +5717,10 @@ execution_timeout_secs: 72000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5126,6 +5750,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5155,6 +5783,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5183,6 +5815,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5211,6 +5847,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5238,6 +5878,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5266,6 +5910,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5293,6 +5941,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5320,6 +5972,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5350,6 +6006,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5379,6 +6039,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5418,6 +6082,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5457,6 +6125,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5496,6 +6168,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5535,6 +6211,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5572,6 +6252,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5611,6 +6295,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5650,6 +6338,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5689,6 +6381,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5728,6 +6424,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5767,6 +6467,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5804,6 +6508,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5843,6 +6551,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5882,6 +6594,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5921,6 +6637,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5960,6 +6680,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -5999,6 +6723,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6038,6 +6766,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6079,6 +6811,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6110,6 +6846,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6139,6 +6879,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6168,6 +6912,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6197,6 +6945,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6226,6 +6978,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6255,6 +7011,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6284,6 +7044,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6313,6 +7077,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6342,6 +7110,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6371,6 +7143,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6400,6 +7176,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6429,6 +7209,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6458,6 +7242,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6487,6 +7275,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6515,6 +7307,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6544,6 +7340,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6573,6 +7373,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6602,6 +7406,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6635,6 +7443,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6664,6 +7476,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6693,6 +7509,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6722,6 +7542,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6751,6 +7575,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6780,6 +7608,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6809,6 +7641,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6838,6 +7674,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6867,6 +7707,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6896,6 +7740,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6925,6 +7773,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6954,6 +7806,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -6983,6 +7839,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7011,6 +7871,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7040,6 +7904,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7069,6 +7937,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7098,6 +7970,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7127,6 +8003,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7156,6 +8036,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7185,6 +8069,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7214,6 +8102,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7243,6 +8135,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7272,6 +8168,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7301,6 +8201,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7330,6 +8234,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7359,6 +8267,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7388,6 +8300,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7417,6 +8333,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7446,6 +8366,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7475,6 +8399,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7507,6 +8435,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7539,6 +8471,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7568,6 +8504,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7597,6 +8537,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7626,6 +8570,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7659,6 +8607,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7688,6 +8640,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7717,6 +8673,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7746,6 +8706,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7774,6 +8738,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7806,6 +8774,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7834,6 +8806,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7862,6 +8838,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7890,6 +8870,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7918,6 +8902,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7946,6 +8934,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -7974,6 +8966,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8003,6 +8999,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8032,6 +9032,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8071,6 +9075,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8110,6 +9118,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8149,6 +9161,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8188,6 +9204,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8227,6 +9247,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8266,6 +9290,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8305,6 +9333,10 @@ execution_timeout_secs: 64800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8344,6 +9376,10 @@ execution_timeout_secs: 64800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8383,6 +9419,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8422,6 +9462,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8461,6 +9505,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8500,6 +9548,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8539,6 +9591,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8578,6 +9634,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8616,6 +9676,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8644,6 +9708,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8676,6 +9744,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8708,6 +9780,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8737,6 +9813,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8776,6 +9856,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8814,6 +9898,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8843,6 +9931,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8882,6 +9974,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8921,6 +10017,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8960,6 +10060,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -8999,6 +10103,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9038,6 +10146,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9076,6 +10188,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9104,6 +10220,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9132,6 +10252,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9161,6 +10285,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9190,6 +10318,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9219,6 +10351,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9248,6 +10384,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9277,6 +10417,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9306,6 +10450,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9335,6 +10483,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9364,6 +10516,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9393,6 +10549,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9426,6 +10586,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9459,6 +10623,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9488,6 +10656,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9517,6 +10689,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9546,6 +10722,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9575,6 +10755,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9604,6 +10788,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9633,6 +10821,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9662,6 +10854,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9691,6 +10887,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9717,6 +10917,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9746,6 +10950,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9775,6 +10983,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9804,6 +11016,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9833,6 +11049,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9862,6 +11082,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9891,6 +11115,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9920,6 +11148,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9949,6 +11181,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -9978,6 +11214,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10007,6 +11247,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10036,6 +11280,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10065,6 +11313,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10094,6 +11346,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10123,6 +11379,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10152,6 +11412,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10181,6 +11445,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10210,6 +11478,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10239,6 +11511,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10268,6 +11544,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10297,6 +11577,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10326,6 +11610,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10355,6 +11643,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10388,6 +11680,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10417,6 +11713,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10446,6 +11746,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10475,6 +11779,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10504,6 +11812,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10533,6 +11845,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10566,6 +11882,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10599,6 +11919,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10632,6 +11956,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10665,6 +11993,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10694,6 +12026,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10723,6 +12059,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10752,6 +12092,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10787,6 +12131,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10818,6 +12166,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10849,6 +12201,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10885,6 +12241,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10920,6 +12280,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10955,6 +12319,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -10986,6 +12354,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11021,6 +12393,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11052,6 +12428,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11087,6 +12467,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11122,6 +12506,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11157,6 +12545,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11192,6 +12584,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11227,6 +12623,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11262,6 +12662,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11295,6 +12699,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11324,6 +12732,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11353,6 +12765,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11386,6 +12802,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11415,6 +12835,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11448,6 +12872,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11481,6 +12909,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11514,6 +12946,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11546,6 +12982,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11578,6 +13018,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11611,6 +13055,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11644,6 +13092,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11677,6 +13129,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11706,6 +13162,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11739,6 +13199,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11768,6 +13232,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11801,6 +13269,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11834,6 +13306,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11867,6 +13343,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11900,6 +13380,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11929,6 +13413,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11962,6 +13450,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -11995,6 +13487,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12024,6 +13520,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12057,6 +13557,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12086,6 +13590,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12114,6 +13622,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12143,6 +13655,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12176,6 +13692,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12205,6 +13725,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12234,6 +13758,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12263,6 +13791,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12292,6 +13824,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12321,6 +13857,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12350,6 +13890,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12379,6 +13923,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12408,6 +13956,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12441,6 +13993,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12470,6 +14026,10 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12504,6 +14064,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12538,6 +14102,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12572,6 +14140,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12600,6 +14172,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12628,6 +14204,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12655,6 +14235,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12684,6 +14268,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12717,6 +14305,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12749,6 +14341,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12777,6 +14373,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12804,6 +14404,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12835,6 +14439,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12868,6 +14476,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12895,6 +14507,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12927,6 +14543,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12960,6 +14580,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -12993,6 +14617,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13026,6 +14654,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13059,6 +14691,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13092,6 +14728,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13125,6 +14765,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13154,6 +14798,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13187,6 +14835,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13215,6 +14867,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13243,6 +14899,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13272,6 +14932,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13300,6 +14964,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13328,6 +14996,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13356,6 +15028,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13388,6 +15064,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13420,6 +15100,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13451,6 +15135,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13480,6 +15168,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13509,6 +15201,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13538,6 +15234,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13567,6 +15267,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13596,6 +15300,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13625,6 +15333,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13654,6 +15366,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13687,6 +15403,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13720,6 +15440,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13752,6 +15476,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13780,6 +15508,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13808,6 +15540,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13840,6 +15576,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13868,6 +15608,10 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13901,6 +15645,10 @@ key: "chromium.resultdb.result_sink" value: 0 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13951,6 +15699,10 @@ } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -13985,6 +15737,10 @@ } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -14019,6 +15775,10 @@ } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -14053,6 +15813,10 @@ } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -14087,6 +15851,10 @@ } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -14121,6 +15889,10 @@ } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -14170,6 +15942,10 @@ } build_numbers: YES service_account: "findit-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14194,6 +15970,10 @@ } build_numbers: YES service_account: "findit-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14219,6 +15999,10 @@ } build_numbers: YES service_account: "findit-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14257,6 +16041,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14279,6 +16067,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14301,6 +16093,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14323,6 +16119,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14345,6 +16145,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14367,6 +16171,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14389,6 +16197,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14411,6 +16223,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14433,6 +16249,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14455,6 +16275,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14477,6 +16301,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14499,6 +16327,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14521,6 +16353,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14543,6 +16379,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14565,6 +16405,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14587,6 +16431,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14609,6 +16457,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14631,6 +16483,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14657,6 +16513,10 @@ } build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14679,6 +16539,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14702,6 +16566,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14725,6 +16593,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14748,6 +16620,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14771,6 +16647,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14793,6 +16673,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14815,6 +16699,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14837,6 +16725,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14859,6 +16751,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14881,6 +16777,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14903,6 +16803,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14925,6 +16829,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14947,6 +16855,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14969,6 +16881,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -14991,6 +16907,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15013,6 +16933,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15035,6 +16959,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15057,6 +16985,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15079,6 +17011,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15101,6 +17037,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15123,6 +17063,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15145,6 +17089,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15167,6 +17115,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15190,6 +17142,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15213,6 +17169,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15236,6 +17196,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15259,6 +17223,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15282,6 +17250,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15305,6 +17277,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15328,6 +17304,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15351,6 +17331,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15374,6 +17358,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15397,6 +17385,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15419,6 +17411,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15441,6 +17437,10 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15466,6 +17466,10 @@ } build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15491,6 +17495,10 @@ } build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15516,6 +17524,10 @@ } build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15541,6 +17553,10 @@ } build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15564,6 +17580,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15587,6 +17607,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15610,6 +17634,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15633,6 +17661,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15656,6 +17688,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15679,6 +17715,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15702,6 +17742,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15725,6 +17769,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15747,6 +17795,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15769,6 +17821,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15791,6 +17847,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15813,6 +17873,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15835,6 +17899,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15857,6 +17925,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15879,6 +17951,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15901,6 +17977,10 @@ execution_timeout_secs: 36000 build_numbers: YES service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -15980,6 +18060,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16017,6 +18101,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16054,6 +18142,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16091,6 +18183,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16128,6 +18224,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16165,6 +18265,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16202,6 +18306,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16239,6 +18347,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16276,6 +18388,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16313,6 +18429,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16350,6 +18470,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16387,6 +18511,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16424,6 +18552,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16461,6 +18593,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16498,6 +18634,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16535,6 +18675,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16572,6 +18716,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16609,6 +18757,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16646,6 +18798,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16683,6 +18839,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16720,6 +18880,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16757,6 +18921,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16794,6 +18962,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16831,6 +19003,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16868,6 +19044,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16905,6 +19085,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16942,6 +19126,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -16979,6 +19167,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17015,6 +19207,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17051,6 +19247,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17087,6 +19287,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17123,6 +19327,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17159,6 +19367,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17195,6 +19407,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17232,6 +19448,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17269,6 +19489,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17306,6 +19530,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17343,6 +19571,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17380,6 +19612,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17417,6 +19653,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17454,6 +19694,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17491,6 +19735,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17528,6 +19776,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17565,6 +19817,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17602,6 +19858,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17638,6 +19898,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17675,6 +19939,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17712,6 +19980,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17749,6 +20021,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17786,6 +20062,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17823,6 +20103,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17860,6 +20144,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17897,6 +20185,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17934,6 +20226,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -17971,6 +20267,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18008,6 +20308,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18045,6 +20349,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18082,6 +20390,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18117,6 +20429,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18152,6 +20468,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18187,6 +20507,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18222,6 +20546,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18257,6 +20585,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18292,6 +20624,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18328,6 +20664,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18365,6 +20705,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18402,6 +20746,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18439,6 +20787,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18476,6 +20828,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18513,6 +20869,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18550,6 +20910,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18587,6 +20951,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18624,6 +20992,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18661,6 +21033,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18698,6 +21074,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18734,6 +21114,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18770,6 +21154,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18806,6 +21194,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18842,6 +21234,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18878,6 +21274,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18914,6 +21314,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18950,6 +21354,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -18986,6 +21394,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19022,6 +21434,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19058,6 +21474,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19094,6 +21514,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19130,6 +21554,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19166,6 +21594,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19202,6 +21634,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19238,6 +21674,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19274,6 +21714,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19310,6 +21754,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19346,6 +21794,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19382,6 +21834,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19418,6 +21874,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19454,6 +21914,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19490,6 +21954,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19526,6 +21994,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19562,6 +22034,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19598,6 +22074,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19634,6 +22114,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19670,6 +22154,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19705,6 +22193,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19740,6 +22232,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19775,6 +22271,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19810,6 +22310,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19845,6 +22349,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19880,6 +22388,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19915,6 +22427,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19950,6 +22466,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -19985,6 +22505,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20020,6 +22544,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20055,6 +22583,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20090,6 +22622,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20125,6 +22661,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20160,6 +22700,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20196,6 +22740,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20232,6 +22780,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20268,6 +22820,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20304,6 +22860,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20340,6 +22900,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20376,6 +22940,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20412,6 +22980,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20448,6 +23020,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20484,6 +23060,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20520,6 +23100,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20556,6 +23140,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20592,6 +23180,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20628,6 +23220,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20664,6 +23260,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20700,6 +23300,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20736,6 +23340,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20772,6 +23380,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20808,6 +23420,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20844,6 +23460,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20880,6 +23500,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20915,6 +23539,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20950,6 +23578,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -20986,6 +23618,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21025,6 +23661,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21064,6 +23704,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21103,6 +23747,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21142,6 +23790,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21181,6 +23833,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21220,6 +23876,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21259,6 +23919,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21298,6 +23962,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21337,6 +24005,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21376,6 +24048,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21415,6 +24091,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21454,6 +24134,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21491,6 +24175,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21528,6 +24216,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21564,6 +24256,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21601,6 +24297,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21638,6 +24338,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21675,6 +24379,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21712,6 +24420,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21749,6 +24461,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21786,6 +24502,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21823,6 +24543,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21860,6 +24584,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21897,6 +24625,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21934,6 +24666,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -21971,6 +24707,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22008,6 +24748,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22045,6 +24789,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22080,6 +24828,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22117,6 +24869,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22154,6 +24910,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22191,6 +24951,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22228,6 +24992,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22265,6 +25033,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22302,6 +25074,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22339,6 +25115,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22376,6 +25156,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22413,6 +25197,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22450,6 +25238,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22487,6 +25279,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22524,6 +25320,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22560,6 +25360,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22597,6 +25401,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22634,6 +25442,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22671,6 +25483,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22708,6 +25524,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22745,6 +25565,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22782,6 +25606,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22819,6 +25647,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22856,6 +25688,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22893,6 +25729,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22930,6 +25770,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -22967,6 +25811,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23004,6 +25852,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23041,6 +25893,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23078,6 +25934,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23114,6 +25974,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23150,6 +26014,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23187,6 +26055,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23224,6 +26096,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23261,6 +26137,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23298,6 +26178,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23335,6 +26219,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23372,6 +26260,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23409,6 +26301,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23446,6 +26342,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23483,6 +26383,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23524,6 +26428,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23561,6 +26469,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23602,6 +26514,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23639,6 +26555,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23676,6 +26596,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23713,6 +26637,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23750,6 +26678,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23787,6 +26719,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23824,6 +26760,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23861,6 +26801,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23897,6 +26841,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23934,6 +26882,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -23971,6 +26923,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24006,6 +26962,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24042,6 +27002,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24078,6 +27042,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24113,6 +27081,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24148,6 +27120,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24184,6 +27160,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24220,6 +27200,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24255,6 +27239,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24291,6 +27279,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24327,6 +27319,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24363,6 +27359,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24399,6 +27399,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24435,6 +27439,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24471,6 +27479,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24507,6 +27519,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24543,6 +27559,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24579,6 +27599,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24615,6 +27639,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24651,6 +27679,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24687,6 +27719,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24723,6 +27759,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24759,6 +27799,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24795,6 +27839,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24831,6 +27879,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24866,6 +27918,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24906,6 +27962,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24943,6 +28003,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -24980,6 +28044,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25017,6 +28085,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25053,6 +28125,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25089,6 +28165,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25125,6 +28205,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25161,6 +28245,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25198,6 +28286,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25235,6 +28327,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25272,6 +28368,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25307,6 +28407,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25343,6 +28447,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25380,6 +28488,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25417,6 +28529,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25454,6 +28570,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25491,6 +28611,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25528,6 +28652,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25565,6 +28693,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25602,6 +28734,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25639,6 +28775,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25676,6 +28816,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25712,6 +28856,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25749,6 +28897,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25786,6 +28938,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25822,6 +28978,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25859,6 +29019,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25896,6 +29060,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25933,6 +29101,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -25970,6 +29142,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26007,6 +29183,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26044,6 +29224,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26081,6 +29265,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26118,6 +29306,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26155,6 +29347,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26192,6 +29388,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26228,6 +29428,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26265,6 +29469,10 @@ task_template_canary_percentage { value: 5 } + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true bq_exports { @@ -26307,6 +29515,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26327,6 +29539,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26347,6 +29563,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26367,6 +29587,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26388,6 +29612,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26408,6 +29636,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26428,6 +29660,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26448,6 +29684,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26468,6 +29708,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26488,6 +29732,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26524,6 +29772,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26544,6 +29796,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26564,6 +29820,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26584,6 +29844,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26604,6 +29868,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26624,6 +29892,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26644,6 +29916,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26664,6 +29940,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26689,6 +29969,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26714,6 +29998,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26738,6 +30026,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26758,6 +30050,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26778,6 +30074,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26798,6 +30098,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26818,6 +30122,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26838,6 +30146,10 @@ execution_timeout_secs: 7200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26862,6 +30174,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true } @@ -26886,6 +30202,10 @@ } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.use_realms" + value: 5 + } resultdb { enable: true }
diff --git a/infra/config/main.star b/infra/config/main.star index 18d4123..d35b0c5 100755 --- a/infra/config/main.star +++ b/infra/config/main.star
@@ -118,6 +118,9 @@ ], ) +# Launch a portion of Swarming tasks in "realms-aware mode", crbug.com/1136313. +luci.builder.defaults.experiments.set({"luci.use_realms": 5}) + exec("//swarming.star") exec("//recipes.star")
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star index 65f69fe..e82f77f 100644 --- a/infra/config/subprojects/chromium/try.star +++ b/infra/config/subprojects/chromium/try.star
@@ -600,7 +600,7 @@ branch_selector = branches.ALL_BRANCHES, goma_jobs = goma.jobs.J150, main_list_view = settings.main_list_view_name, - tryjob = try_.job(cancel_stale = False), + tryjob = try_.job(), use_clang_coverage = True, )
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb index 2d2abb6..2ca8715a 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -69,6 +69,7 @@ <translation id="8240981428553046115">Chromium-ന് അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="8252885722420466166">Chromium-ത്തിൽ നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഒരു മികച്ച Google അനുഭവം സ്വന്തമാക്കുക.</translation> <translation id="8586442755830160949">പകർപ്പവകാശം <ph name="YEAR" /> Chromium രചയിതാക്കൾ. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</translation> +<translation id="8663480472502753423">Chromium അപ് ടു ഡേറ്റ് ആയി നിലനിർത്തുക</translation> <translation id="8776843108004031667">ഈ അക്കൗണ്ടും സംരക്ഷിക്കാത്ത എല്ലാ ഡാറ്റയും Chromium-ൽ നിന്ന് നീക്കം ചെയ്യും.</translation> <translation id="9022552996538154597">Chromium-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="9089354809943900324">Chromium കാലഹരണപ്പെട്ടു</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb index f0bc0b2..4a6b5e31bc 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sk.xtb
@@ -69,6 +69,7 @@ <translation id="8240981428553046115">Prehliadaču Chromium sa nepodarilo skontrolovať dostupnosť aktualizácií. Skúste to znova neskôr.</translation> <translation id="8252885722420466166">Získajte lepšie prostredie Google v prehliadači Chromium na základe svojej polohy.</translation> <translation id="8586442755830160949">Copyright <ph name="YEAR" /> Autori Chromium. Všetky práva vyhradené.</translation> +<translation id="8663480472502753423">Udržujte prehliadač Chromium aktuálny</translation> <translation id="8776843108004031667">Tento účet bude spolu so všetkými neuloženými údajmi odstránený z prehliadača Chromium.</translation> <translation id="9022552996538154597">Prihlásiť sa do prehliadača Chromium</translation> <translation id="9089354809943900324">Prehliadač Chromium je zastaraný</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb index 2203119..6c79d103 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -55,6 +55,7 @@ <translation id="6648150602980899529"><ph name="DOMAIN" /> മാനേജ് ചെയ്യുന്ന ഒരു അക്കൗണ്ട് ഉപയോഗിച്ച് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുകയും ഇതിന്റെ അഡ്മിനിസ്ട്രേറ്റർക്ക് നിങ്ങളുടെ Chrome വിവരങ്ങളിന്മേൽ നിയന്ത്രണം നൽകുകയും ചെയ്യുന്നു. വിവരങ്ങളെ ഈ അക്കൗണ്ടുമായി ശാശ്വതമായി ബന്ധിപ്പിക്കും. Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യുന്നത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ വിവരങ്ങളെ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ സൂക്ഷിക്കുന്നതാണ്.</translation> <translation id="6676840375528380067">ഉപകരണത്തില് നിന്ന് Chrome ഡാറ്റ മായ്ക്കണോ?</translation> <translation id="6822673484890854830">എല്ലാ പാസ്വേഡുകളും Chrome-ന് പരിശോധിക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="7124339256045485976">Chrome അപ് ടു ഡേറ്റ് ആയി നിലനിർത്തുക</translation> <translation id="7161390184744336561">Google Chrome കാലഹരണപ്പെട്ടു</translation> <translation id="7165736900384873061">Google Chrome QR സ്കാനർ ഉപയോഗിക്കാൻ തുടങ്ങൂ</translation> <translation id="7172660552945675509">നുറുങ്ങ്: <ph name="BEGIN_LINK" />Chrome-നെ നിങ്ങളുടെ ഡോക്കിലേക്ക് നീക്കുക<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb index 7207264c..6f53d2c 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sk.xtb
@@ -55,6 +55,7 @@ <translation id="6648150602980899529">Prihlasujete sa pomocou účtu spravovaného doménou <ph name="DOMAIN" /> a jej správcovi tým dávate kontrolu nad vašimi údajmi prehliadača Chrome. Vaše údaje budú natrvalo prepojené s týmto účtom. Odhlásením z Chromu odstránite údaje z príslušného zariadenia, avšak naďalej zostanú uložené vo vašom účte Google.</translation> <translation id="6676840375528380067">Chcete vymazať údaje Chromu z tohto zariadenia?</translation> <translation id="6822673484890854830">Chromu sa nepodarilo skontrolovať všetky heslá. Skúste to znova neskôr.</translation> +<translation id="7124339256045485976">Udržuje Chrome aktuálny</translation> <translation id="7161390184744336561">Prehliadač Google Chrome je zastaraný.</translation> <translation id="7165736900384873061">Začnite používať čítačku QR prehliadača Google Chrome</translation> <translation id="7172660552945675509">Tip: <ph name="BEGIN_LINK" />Presuňte Chrome do doku<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index a9d6b95..5f2d630 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -497,7 +497,7 @@ <translation id="6418346271604475326">מכין PDF</translation> <translation id="6434591244308415567">אירעה שגיאה. יש לנסות שוב מאוחר יותר.</translation> <translation id="6439338047467462846">מתן הרשאה לכל קובצי ה-cookie</translation> -<translation id="6445051938772793705">ארץ</translation> +<translation id="6445051938772793705">מדינה</translation> <translation id="6445981559479772097">ההודעה נשלחה.</translation> <translation id="6447842834002726250">קובצי Cookie</translation> <translation id="6453018583485750254">מעולם לא נעשתה בדיקה.</translation> @@ -509,7 +509,7 @@ <translation id="648164694371393720">שגיאת אימות</translation> <translation id="6482629121755362506"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> פריטים נמחקו</translation> <translation id="651505212789431520">לבטל את הסנכרון? אפשר להפעיל את הסנכרון בכל זמן דרך 'הגדרות'.</translation> -<translation id="6561262006871132942">התקרבות</translation> +<translation id="6561262006871132942">הגדלת התצוגה</translation> <translation id="6585618849026997638">כדי לחזור אל דף חשוב עבורך אפשר להוסיף אותו לסימניות</translation> <translation id="6610002944194042868">אפשרויות תרגום</translation> <translation id="6620279676667515405">ביטול</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 4b283e6d..d72954a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -61,6 +61,7 @@ <translation id="1545749641540134597">QR കോഡ് സ്കാൻ ചെയ്യുക</translation> <translation id="1552525382687785070">നിങ്ങളുടെ അഡ്മിൻ സമന്വയം പ്രവർത്തനരഹിതമാക്കി</translation> <translation id="1554477036522844996">പുതിയ വിന്ഡോ</translation> +<translation id="1580715474678097352">അപകടകരമായ വെബ്സൈറ്റുകളിൽ നിന്ന് പരിരക്ഷിതമായി തുടരുക</translation> <translation id="1580783302095112590">മെയിൽ അയച്ചു.</translation> <translation id="1582732959743469162">ഇത്, നിലവിലെ ഡൗൺലോഡിന്റെ എല്ലാ പുരോഗതിയും നിർത്തും.</translation> <translation id="1605405588277479165">ഓഫാണ് - ശുപാർശ ചെയ്യുന്നില്ല</translation> @@ -728,6 +729,7 @@ <translation id="9087108903408689779">Chrome നിർദ്ദേശിക്കുന്ന പാസ്വേഡ്:</translation> <translation id="9094033019050270033">പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="9100610230175265781">പാസ്ഫ്രെയ്സ് ആവശ്യമാണ്</translation> +<translation id="9107664647686727385">അപഹരിക്കപ്പെട്ട പാസ്വേഡുകൾ കണ്ടെത്താൻ പരിശോധിക്കുക</translation> <translation id="9137526406337347448">Google സേവനങ്ങൾ</translation> <translation id="9148126808321036104">വീണ്ടും പ്രവേശിക്കുക</translation> <translation id="9152539721251340337">QR കോഡ് സൃഷ്ടിക്കുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 51e7a77..26d0f6d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -61,6 +61,7 @@ <translation id="1545749641540134597">Naskenovať kód QR</translation> <translation id="1552525382687785070">Synchronizáciu zakázal správca</translation> <translation id="1554477036522844996">Nové okno</translation> +<translation id="1580715474678097352">Chráňte sa pred nebezpečenými webmi</translation> <translation id="1580783302095112590">E-mail bol odoslaný.</translation> <translation id="1582732959743469162">Tým zastavíte ďalší postup aktuálneho sťahovania.</translation> <translation id="1605405588277479165">Vypnuté – neodporúča sa</translation> @@ -728,6 +729,7 @@ <translation id="9087108903408689779">Heslo navrhnuté Chromom:</translation> <translation id="9094033019050270033">Aktualizovať heslo</translation> <translation id="9100610230175265781">Vyžaduje sa prístupová fráza</translation> +<translation id="9107664647686727385">Kontrolujte, či neboli prelomené heslá</translation> <translation id="9137526406337347448">Služby Google</translation> <translation id="9148126808321036104">Znova sa prihlásiť</translation> <translation id="9152539721251340337">Vytvoriť QR kód</translation>
diff --git a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm index 0f0cc9c..bb1557d68 100644 --- a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm +++ b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
@@ -6,7 +6,6 @@ #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" #import "ios/chrome/browser/feature_engagement/feature_engagement_app_interface.h" #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller_constants.h"
diff --git a/ios/chrome/browser/net/cookie_util_unittest.mm b/ios/chrome/browser/net/cookie_util_unittest.mm index 86ac9f7..d01f8c92 100644 --- a/ios/chrome/browser/net/cookie_util_unittest.mm +++ b/ios/chrome/browser/net/cookie_util_unittest.mm
@@ -11,7 +11,6 @@ #include "base/run_loop.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" #include "ios/net/cookies/cookie_store_ios_test_util.h" #import "ios/net/cookies/ns_http_system_cookie_store.h" #import "ios/net/cookies/system_cookie_store.h"
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm index b7ceb2e..9fd956280 100644 --- a/ios/chrome/browser/passwords/password_controller_unittest.mm +++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -16,7 +16,6 @@ #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/values.h" #include "components/autofill/core/browser/ui/popup_item_ids.h"
diff --git a/ios/chrome/browser/policy/browser_policy_connector_ios.mm b/ios/chrome/browser/policy/browser_policy_connector_ios.mm index ba1e7bd9..b405a40 100644 --- a/ios/chrome/browser/policy/browser_policy_connector_ios.mm +++ b/ios/chrome/browser/policy/browser_policy_connector_ios.mm
@@ -58,7 +58,8 @@ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) { std::unique_ptr<policy::DeviceManagementService::Configuration> configuration( new policy::DeviceManagementServiceConfigurationIOS( - GetDeviceManagementUrl(), GetRealtimeReportingUrl())); + GetDeviceManagementUrl(), GetRealtimeReportingUrl(), + GetEncryptedReportingUrl())); std::unique_ptr<policy::DeviceManagementService> device_management_service( new policy::DeviceManagementService(std::move(configuration))); device_management_service->ScheduleInitialization(
diff --git a/ios/chrome/browser/policy/device_management_service_configuration_ios.h b/ios/chrome/browser/policy/device_management_service_configuration_ios.h index ecf57472..ca6cbed 100644 --- a/ios/chrome/browser/policy/device_management_service_configuration_ios.h +++ b/ios/chrome/browser/policy/device_management_service_configuration_ios.h
@@ -19,8 +19,9 @@ : public DeviceManagementService::Configuration { public: DeviceManagementServiceConfigurationIOS( - const std::string& server_url, - const std::string& reporting_server_url); + const std::string& dm_server_url, + const std::string& realtime_reporting_server_url, + const std::string& encrypted_reporting_server_url); DeviceManagementServiceConfigurationIOS( const DeviceManagementServiceConfigurationIOS&) = delete; DeviceManagementServiceConfigurationIOS& operator=( @@ -31,12 +32,14 @@ std::string GetDMServerUrl() override; std::string GetAgentParameter() override; std::string GetPlatformParameter() override; - std::string GetReportingServerUrl() override; + std::string GetRealtimeReportingServerUrl() override; + std::string GetEncryptedReportingServerUrl() override; std::string GetReportingConnectorServerUrl() override; private: - const std::string server_url_; - const std::string reporting_server_url_; + const std::string dm_server_url_; + const std::string realtime_reporting_server_url_; + const std::string encrypted_reporting_server_url_; }; } // namespace policy
diff --git a/ios/chrome/browser/policy/device_management_service_configuration_ios.mm b/ios/chrome/browser/policy/device_management_service_configuration_ios.mm index 3b9eb5c..3cb29cf 100644 --- a/ios/chrome/browser/policy/device_management_service_configuration_ios.mm +++ b/ios/chrome/browser/policy/device_management_service_configuration_ios.mm
@@ -21,15 +21,18 @@ DeviceManagementServiceConfigurationIOS:: DeviceManagementServiceConfigurationIOS( - const std::string& server_url, - const std::string& reporting_server_url) - : server_url_(server_url), reporting_server_url_(reporting_server_url) {} + const std::string& dm_server_url, + const std::string& realtime_reporting_server_url, + const std::string& encrypted_reporting_server_url) + : dm_server_url_(dm_server_url), + realtime_reporting_server_url_(realtime_reporting_server_url), + encrypted_reporting_server_url_(encrypted_reporting_server_url) {} DeviceManagementServiceConfigurationIOS:: ~DeviceManagementServiceConfigurationIOS() = default; std::string DeviceManagementServiceConfigurationIOS::GetDMServerUrl() { - return server_url_; + return dm_server_url_; } std::string DeviceManagementServiceConfigurationIOS::GetAgentParameter() { @@ -56,8 +59,14 @@ os_version.c_str()); } -std::string DeviceManagementServiceConfigurationIOS::GetReportingServerUrl() { - return reporting_server_url_; +std::string +DeviceManagementServiceConfigurationIOS::GetRealtimeReportingServerUrl() { + return realtime_reporting_server_url_; +} + +std::string +DeviceManagementServiceConfigurationIOS::GetEncryptedReportingServerUrl() { + return encrypted_reporting_server_url_; } std::string
diff --git a/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm b/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm index 5026745..60f247d 100644 --- a/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm +++ b/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
@@ -13,7 +13,6 @@ #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" #include "components/strings/grit/components_strings.h" #include "components/translate/core/browser/translate_download_manager.h" #include "components/translate/core/browser/translate_manager.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm index 4a29e345..4febc81 100644 --- a/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm +++ b/ios/chrome/browser/ui/authentication/signin/signin_coordinator_egtest.mm
@@ -6,7 +6,6 @@ #include "base/ios/ios_util.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h" #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h"
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm index b6a5febd..b788eef 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
@@ -4,7 +4,6 @@ #import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h" -#include "base/test/scoped_feature_list.h" #include "components/bookmarks/browser/bookmark_model.h" #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/ui/bookmarks/bookmark_ios_unittest.h"
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index c7eb5eb..c79fe8a 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -4866,6 +4866,14 @@ newTabPageCoordinator.toolbarDelegate = self.toolbarInterface; newTabPageCoordinator.webState = webState; _ntpCoordinatorsForWebStates[webState] = newTabPageCoordinator; + [newTabPageCoordinator.viewController + willMoveToParentViewController:self.browserContainerViewController]; + [self.browserContainerViewController + addChildViewController:newTabPageCoordinator.viewController]; + [self.browserContainerViewController.view + addSubview:newTabPageCoordinator.viewController.view]; + [newTabPageCoordinator.viewController + didMoveToParentViewController:self.browserContainerViewController]; } else { NewTabPageCoordinator* newTabPageCoordinator = _ntpCoordinatorsForWebStates[webState];
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm index 16a54d6..855012f6f 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_coordinator.mm
@@ -265,8 +265,8 @@ self.suggestionsViewController.overscrollDelegate = self; self.suggestionsViewController.themeChangeDelegate = self; self.suggestionsViewController.metricsRecorder = self.metricsRecorder; - id<SnackbarCommands> dispatcher = HandlerForProtocol( - self.browser->GetCommandDispatcher(), SnackbarCommands); + id<SnackbarCommands> dispatcher = + static_cast<id<SnackbarCommands>>(self.browser->GetCommandDispatcher()); self.suggestionsViewController.dispatcher = dispatcher; self.suggestionsViewController.discoverFeedMenuHandler = self; self.suggestionsViewController.discoverFeedMetricsRecorder =
diff --git a/ios/chrome/browser/ui/infobars/OWNERS b/ios/chrome/browser/ui/infobars/OWNERS index a5cbae4f..2580b2a 100644 --- a/ios/chrome/browser/ui/infobars/OWNERS +++ b/ios/chrome/browser/ui/infobars/OWNERS
@@ -1,5 +1,5 @@ -rohitrao@chromium.org sczs@chromium.org +thegreenfrog@chromium.org # TEAM: ios-directory-owners@chromium.org # OS: iOS
diff --git a/ios/chrome/browser/ui/infobars/translate_infobar_egtest.mm b/ios/chrome/browser/ui/infobars/translate_infobar_egtest.mm index b3215d5c5..8d3a027 100644 --- a/ios/chrome/browser/ui/infobars/translate_infobar_egtest.mm +++ b/ios/chrome/browser/ui/infobars/translate_infobar_egtest.mm
@@ -10,7 +10,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" #include "components/infobars/core/infobar_feature.h" #include "components/translate/core/browser/translate_pref_names.h" #include "components/translate/core/common/translate_constants.h"
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm index 9628a6b..092191f3 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -72,6 +72,9 @@ - (void)stop { if (!self.started) return; + [self.viewController willMoveToParentViewController:nil]; + [self.viewController.view removeFromSuperview]; + [self.viewController removeFromParentViewController]; [self.contentSuggestionsCoordinator stop]; self.contentSuggestionsCoordinator = nil; self.incognitoViewController = nil;
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm index 58d3137..834fd84 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
@@ -4,7 +4,6 @@ #import "base/test/ios/wait_util.h" #include "base/test/scoped_command_line.h" -#include "base/test/scoped_feature_list.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h" #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/overscroll_actions/OWNERS b/ios/chrome/browser/ui/overscroll_actions/OWNERS new file mode 100644 index 0000000..f58cd95 --- /dev/null +++ b/ios/chrome/browser/ui/overscroll_actions/OWNERS
@@ -0,0 +1,4 @@ +thegreenfrog@chromium.org + +# TEAM: ios-directory-owners@chromium.org +# OS: iOS
diff --git a/ios/chrome/browser/ui/passwords/password_breach_egtest.mm b/ios/chrome/browser/ui/passwords/password_breach_egtest.mm index f760a5b..1fdb4f0 100644 --- a/ios/chrome/browser/ui/passwords/password_breach_egtest.mm +++ b/ios/chrome/browser/ui/passwords/password_breach_egtest.mm
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include "base/strings/sys_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/strings/grit/components_strings.h" #import "ios/chrome/browser/ui/passwords/password_breach_app_interface.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm index 0f2d7dd3..b58c41c 100644 --- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm +++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -4,7 +4,6 @@ #import <UIKit/UIKit.h> -#import "base/test/scoped_feature_list.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui.h" #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h"
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm index 3a0f305..712b9a7 100644 --- a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm +++ b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
@@ -6,7 +6,6 @@ #include <memory> -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/chrome_url_constants.h"
diff --git a/ios/web/navigation/navigation_manager_impl_unittest.mm b/ios/web/navigation/navigation_manager_impl_unittest.mm index 30254db..53a69e8 100644 --- a/ios/web/navigation/navigation_manager_impl_unittest.mm +++ b/ios/web/navigation/navigation_manager_impl_unittest.mm
@@ -11,7 +11,6 @@ #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "ios/web/common/features.h" #import "ios/web/navigation/navigation_manager_delegate.h" #import "ios/web/navigation/wk_based_navigation_manager_impl.h"
diff --git a/ios/web/web_state/web_state_unittest.mm b/ios/web/web_state/web_state_unittest.mm index c9fbfb5..cacbd5f 100644 --- a/ios/web/web_state/web_state_unittest.mm +++ b/ios/web/web_state/web_state_unittest.mm
@@ -12,7 +12,6 @@ #include "base/strings/utf_string_conversions.h" #import "base/test/ios/wait_util.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/values.h" #import "ios/net/protocol_handler_util.h" #include "ios/web/common/features.h"
diff --git a/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm b/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm index 417bb1c..a011663 100644 --- a/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm +++ b/ios/web_view/internal/autofill/cwv_credit_card_verifier_unittest.mm
@@ -17,7 +17,6 @@ #include "base/strings/sys_string_conversions.h" #include "base/task/post_task.h" #import "base/test/ios/wait_util.h" -#include "base/test/scoped_feature_list.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/payments/card_unmask_delegate.h"
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn index d8a06df..676eb651 100644 --- a/media/base/BUILD.gn +++ b/media/base/BUILD.gn
@@ -334,6 +334,8 @@ "video_types.h", "video_util.cc", "video_util.h", + "wait_and_replace_sync_token_client.cc", + "wait_and_replace_sync_token_client.h", "waiting.h", "wall_clock_time_source.cc", "wall_clock_time_source.h", @@ -354,6 +356,7 @@ "//base/allocator:buildflags", "//base/util/values:values_util", "//components/system_media_controls/linux/buildflags", + "//gpu/command_buffer/client:interface_base", "//gpu/command_buffer/common", "//gpu/ipc/common:common", "//third_party/libyuv",
diff --git a/media/base/wait_and_replace_sync_token_client.cc b/media/base/wait_and_replace_sync_token_client.cc new file mode 100644 index 0000000..b78a6b0 --- /dev/null +++ b/media/base/wait_and_replace_sync_token_client.cc
@@ -0,0 +1,24 @@ +// Copyright 2020 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. + +#include "media/base/wait_and_replace_sync_token_client.h" +#include "gpu/command_buffer/client/interface_base.h" + +namespace media { + +WaitAndReplaceSyncTokenClient::WaitAndReplaceSyncTokenClient( + gpu::InterfaceBase* ib) + : ib_(ib) {} + +void WaitAndReplaceSyncTokenClient::GenerateSyncToken( + gpu::SyncToken* sync_token) { + ib_->GenSyncTokenCHROMIUM(sync_token->GetData()); +} + +void WaitAndReplaceSyncTokenClient::WaitSyncToken( + const gpu::SyncToken& sync_token) { + ib_->WaitSyncTokenCHROMIUM(sync_token.GetConstData()); +} + +} // namespace media
diff --git a/media/base/wait_and_replace_sync_token_client.h b/media/base/wait_and_replace_sync_token_client.h new file mode 100644 index 0000000..6aa1e1f --- /dev/null +++ b/media/base/wait_and_replace_sync_token_client.h
@@ -0,0 +1,34 @@ +// Copyright 2020 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 MEDIA_BASE_WAIT_AND_REPLACE_SYNC_TOKEN_CLIENT_H_ +#define MEDIA_BASE_WAIT_AND_REPLACE_SYNC_TOKEN_CLIENT_H_ + +#include "base/macros.h" +#include "gpu/command_buffer/common/sync_token.h" +#include "media/base/media_export.h" +#include "media/base/video_frame.h" + +namespace gpu { +class InterfaceBase; +} + +namespace media { + +class MEDIA_EXPORT WaitAndReplaceSyncTokenClient + : public VideoFrame::SyncTokenClient { + public: + explicit WaitAndReplaceSyncTokenClient(gpu::InterfaceBase* ib); + void GenerateSyncToken(gpu::SyncToken* sync_token) final; + void WaitSyncToken(const gpu::SyncToken& sync_token) final; + + private: + gpu::InterfaceBase* ib_; + + DISALLOW_COPY_AND_ASSIGN(WaitAndReplaceSyncTokenClient); +}; + +} // namespace media + +#endif // MEDIA_BASE_WAIT_AND_REPLACE_SYNC_TOKEN_CLIENT_H_
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index effd342..128ba69 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -976,6 +976,11 @@ if (watch_time_reporter_) watch_time_reporter_->OnSeeking(); + // Send the seek updates only when the seek pipeline hasn't started, + // OnPipelineSeeked is not called yet. + if (!seeking_) + delegate_->DidSeek(delegate_id_); + // TODO(sandersd): Move |seeking_| to PipelineController. // TODO(sandersd): Do we want to reset the idle timer here? delegate_->SetIdle(delegate_id_, false);
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 3fb0d5e..834f74a 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -249,6 +249,8 @@ DCHECK_EQ(player_id_, player_id); } + void DidSeek(int player_id) override { DCHECK_EQ(player_id_, player_id); } + bool IsFrameHidden() override { return is_hidden_; } bool IsFrameClosed() override { return is_closed_; }
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 0104b120..c09fc76 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -33,6 +33,7 @@ #include "gpu/command_buffer/common/shared_image_usage.h" #include "media/base/data_buffer.h" #include "media/base/video_frame.h" +#include "media/base/wait_and_replace_sync_token_client.h" #include "third_party/libyuv/include/libyuv.h" #include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkImageGenerator.h" @@ -136,23 +137,6 @@ // We delete the temporary resource if it is not used for 3 seconds. const int kTemporaryResourceDeletionDelay = 3; // Seconds; -class SyncTokenClientImpl : public VideoFrame::SyncTokenClient { - public: - explicit SyncTokenClientImpl(gpu::InterfaceBase* ib) : ib_(ib) {} - ~SyncTokenClientImpl() override = default; - void GenerateSyncToken(gpu::SyncToken* sync_token) override { - ib_->GenSyncTokenCHROMIUM(sync_token->GetData()); - } - void WaitSyncToken(const gpu::SyncToken& sync_token) override { - ib_->WaitSyncTokenCHROMIUM(sync_token.GetConstData()); - } - - private: - gpu::InterfaceBase* ib_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(SyncTokenClientImpl); -}; - // Helper class that begins/ends access to a mailbox within a scope. The mailbox // must have been imported into |texture|. class ScopedSharedImageAccess { @@ -327,7 +311,7 @@ gpu::raster::RasterInterface* ri, gpu::ContextSupport* context_support) { DCHECK(ri); - SyncTokenClientImpl client(ri); + WaitAndReplaceSyncTokenClient client(ri); video_frame->UpdateReleaseSyncToken(&client); if (video_frame->metadata()->read_lock_fences_enabled) { @@ -1337,7 +1321,7 @@ CopyVideoFrameSingleTextureToGLTexture( destination_gl, video_frame.get(), target, texture, internal_format, format, type, level, premultiply_alpha, flip_y); - SyncTokenClientImpl client(destination_gl); + WaitAndReplaceSyncTokenClient client(destination_gl); video_frame->UpdateReleaseSyncToken(&client); } DCHECK(!cache_ || !cache_->wraps_video_frame_texture); @@ -1408,7 +1392,7 @@ destination_gl->WaitSyncTokenCHROMIUM( mailbox_holder.sync_token.GetConstData()); - SyncTokenClientImpl client(source_ri); + WaitAndReplaceSyncTokenClient client(source_ri); video_frame->UpdateReleaseSyncToken(&client); return true; @@ -1468,7 +1452,7 @@ destination_gl->WaitSyncTokenCHROMIUM( mailbox_holder.sync_token.GetConstData()); - SyncTokenClientImpl client(source_ri); + WaitAndReplaceSyncTokenClient client(source_ri); video_frame->UpdateReleaseSyncToken(&client); DCHECK(!cache_ || !cache_->wraps_video_frame_texture);
diff --git a/mojo/public/cpp/bindings/associated_binding.h b/mojo/public/cpp/bindings/associated_binding.h index a0b6eea..62f12b16 100644 --- a/mojo/public/cpp/bindings/associated_binding.h +++ b/mojo/public/cpp/bindings/associated_binding.h
@@ -149,9 +149,29 @@ return old_impl; } + // Acquires a callback which may be run to report the currently dispatching + // message as bad and close this binding. Note that this is only legal to + // call from directly within stack frame of a message dispatch, but the + // returned callback may be called exactly once any time thereafter to report + // the message as bad. |GetBadMessageCallback()| may only be called once per + // message, and the returned callback must be run on the same sequence to + // which this binding is bound. + ReportBadMessageCallback GetBadMessageCallback() { + return base::BindOnce( + [](ReportBadMessageCallback inner_callback, + base::WeakPtr<AssociatedBinding> binding, const std::string& error) { + std::move(inner_callback).Run(error); + if (binding) + binding->Close(); + }, + mojo::GetBadMessageCallback(), weak_ptr_factory_.GetWeakPtr()); + } + private: typename Interface::template Stub_<ImplRefTraits> stub_; + base::WeakPtrFactory<AssociatedBinding> weak_ptr_factory_{this}; + DISALLOW_COPY_AND_ASSIGN(AssociatedBinding); };
diff --git a/mojo/public/cpp/bindings/associated_receiver.h b/mojo/public/cpp/bindings/associated_receiver.h index f03b37d..2d9ed6a 100644 --- a/mojo/public/cpp/bindings/associated_receiver.h +++ b/mojo/public/cpp/bindings/associated_receiver.h
@@ -241,6 +241,26 @@ return binding_.SwapImplForTesting(new_impl); } + // Reports the currently dispatching message as bad and resets this receiver. + // Note that this is only legal to call from within the stack frame of a + // message dispatch. If you need to do asynchronous work before determining + // the legitimacy of a message, use GetBadMessageCallback() and retain its + // result until ready to invoke or discard it. + void ReportBadMessage(const std::string& error) { + GetBadMessageCallback().Run(error); + } + + // Acquires a callback which may be run to report the currently dispatching + // message as bad and reset this receiver. Note that this is only legal to + // call from directly within stack frame of a message dispatch, but the + // returned callback may be called exactly once any time thereafter to report + // the message as bad. |GetBadMessageCallback()| may only be called once per + // message, and the returned callback must be run on the same sequence to + // which this Receiver is bound. + ReportBadMessageCallback GetBadMessageCallback() { + return binding_.GetBadMessageCallback(); + } + private: // TODO(https://crbug.com/875030): Move AssociatedBinding details into this // class.
diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc index 225fbe43..38ef52e7 100644 --- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc +++ b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
@@ -53,6 +53,10 @@ } void Echo(int32_t value, EchoCallback callback) override { + if (value == -1) { + receiver_.ReportBadMessage("Reporting bad message for value == -1"); + return; + } std::move(callback).Run(value); } void Send(int32_t value) override { notify_send_method_called_.Run(value); } @@ -1076,6 +1080,34 @@ EXPECT_TRUE(error_handler_invoked); } +TEST_F(AssociatedInterfaceTest, AssociatedReceiverReportBadMessage) { + PendingAssociatedReceiver<IntegerSender> pending_receiver; + PendingAssociatedRemote<IntegerSender> pending_remote; + CreateIntegerSender(&pending_remote, &pending_receiver); + + IntegerSenderImpl impl(std::move(pending_receiver)); + AssociatedRemote<IntegerSender> remote(std::move(pending_remote)); + + bool called = false; + base::RunLoop run_loop; + remote.set_disconnect_handler(base::BindLambdaForTesting([&] { + called = true; + run_loop.Quit(); + })); + + std::string received_error; + SetDefaultProcessErrorHandler(base::BindLambdaForTesting( + [&](const std::string& error) { received_error = error; })); + + remote->Echo(-1, IntegerSenderImpl::EchoCallback()); + EXPECT_FALSE(called); + run_loop.Run(); + EXPECT_TRUE(called); + EXPECT_EQ("Reporting bad message for value == -1", received_error); + + SetDefaultProcessErrorHandler(base::NullCallback()); +} + } // namespace } // namespace test } // namespace mojo
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index 293c5ce..3d16eea 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -1497,7 +1497,8 @@ HostCache::Entry* out_results) { base::Optional<base::TimeDelta> response_ttl; const HostCache::Entry default_entry( - OK, std::vector<bool>(), HostCache::Entry::SOURCE_DNS, response_ttl); + ERR_NAME_NOT_RESOLVED, std::vector<bool>(), + HostCache::Entry::SOURCE_DNS, response_ttl); if (response == nullptr) { *out_results = default_entry; @@ -1523,8 +1524,9 @@ condensed_results.push_back(rdata.IsIntact()); } - *out_results = HostCache::Entry(OK, std::move(condensed_results), - HostCache::Entry::SOURCE_DNS, response_ttl); + *out_results = + HostCache::Entry(ERR_NAME_NOT_RESOLVED, std::move(condensed_results), + HostCache::Entry::SOURCE_DNS, response_ttl); DCHECK_EQ(parse_result, DnsResponse::DNS_PARSE_OK); return parse_result; }
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc index d9092521..95c6713 100644 --- a/net/dns/host_resolver_manager_unittest.cc +++ b/net/dns/host_resolver_manager_unittest.cc
@@ -8909,6 +8909,69 @@ Optional(UnorderedElementsAre(true))); } +// Ensure that a successful INTEGRITY query cannot mask the appropriate +// ERR_NAME_NOT_RESOLVED of A/AAAA responses with empty bodies. +TEST_F(HostResolverManagerDnsTestIntegrity, + IntegrityQueryCannotMaskAddressNodata) { + net::MockDnsClientRuleList rules; + AddSecureDnsRule(&rules, "host", dns_protocol::kTypeA, + MockDnsClientRule::EMPTY, true /* delay */); + AddSecureDnsRule(&rules, "host", dns_protocol::kTypeAAAA, + MockDnsClientRule::EMPTY, true /* delay */); + + IntegrityAddRulesOptions rules_options; + rules_options.add_a = false; + rules_options.add_aaaa = false; + rules_options.add_integrity = true; + rules_options.delay_integrity = true; + + AddRules(std::move(rules), rules_options); + + std::unique_ptr<ResolveHostResponseHelper> response = + DoIntegrityQuery(true /* use_secure */); + + ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType( + DnsQueryType::INTEGRITY)); + ASSERT_TRUE( + dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A)); + ASSERT_TRUE( + dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA)); + + ASSERT_EQ(response->result_error(), net::ERR_NAME_NOT_RESOLVED); +} + +// Ensure that a successful INTEGRITY query cannot mask the appropriate +// ERR_NAME_NOT_RESOLVED of A/AAAA queries that fail. +TEST_F(HostResolverManagerDnsTestIntegrity, + IntegrityQueryCannotMaskAddressFail) { + net::MockDnsClientRuleList rules; + AddSecureDnsRule(&rules, "host", dns_protocol::kTypeA, + MockDnsClientRule::FAIL, true /* delay */); + AddSecureDnsRule(&rules, "host", dns_protocol::kTypeAAAA, + MockDnsClientRule::FAIL, true /* delay */); + + IntegrityAddRulesOptions rules_options; + rules_options.add_a = false; + rules_options.add_aaaa = false; + rules_options.add_integrity = true; + rules_options.delay_integrity = true; + + AddRules(std::move(rules), rules_options); + + std::unique_ptr<ResolveHostResponseHelper> response = + DoIntegrityQuery(true /* use_secure */); + + ASSERT_TRUE(dns_client_->CompleteOneDelayedTransactionOfType( + DnsQueryType::INTEGRITY)); + ASSERT_TRUE( + dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::A)); + // After the A query fails, the pending AAAA query is cleared. + ASSERT_FALSE( + dns_client_->CompleteOneDelayedTransactionOfType(DnsQueryType::AAAA)); + + ASSERT_EQ(response->result_error(), net::ERR_NAME_NOT_RESOLVED); +} + // For symmetry with |IntegrityQueryCompletesLast|, test the case where the // INTEGRITY query completes first. TEST_F(HostResolverManagerDnsTestIntegrity, IntegrityQueryCompletesFirst) {
diff --git a/net/ssl/openssl_ssl_util.cc b/net/ssl/openssl_ssl_util.cc index b03c9b3..5853386 100644 --- a/net/ssl/openssl_ssl_util.cc +++ b/net/ssl/openssl_ssl_util.cc
@@ -91,8 +91,8 @@ case SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED: case SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN: case SSL_R_TLSV1_ALERT_ACCESS_DENIED: + case SSL_R_TLSV1_ALERT_CERTIFICATE_REQUIRED: case SSL_R_TLSV1_ALERT_UNKNOWN_CA: - case SSL_R_TLSV1_CERTIFICATE_REQUIRED: return ERR_BAD_SSL_CLIENT_AUTH_CERT; case SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE: return ERR_SSL_DECOMPRESSION_FAILURE_ALERT;
diff --git a/sandbox/policy/win/sandbox_win.cc b/sandbox/policy/win/sandbox_win.cc index 8801b717..eef1a60d 100644 --- a/sandbox/policy/win/sandbox_win.cc +++ b/sandbox/policy/win/sandbox_win.cc
@@ -699,7 +699,7 @@ !profile->AddCapability(L"lpacServicesManagement") || !profile->AddCapability(L"lpacSessionManagement") || !profile->AddCapability(L"lpacAppExperience") || - !profile->AddCapability(L"lpacAppServices") || + !profile->AddCapability(L"lpacInstrumentation") || !profile->AddCapability(L"lpacCryptoServices") || !profile->AddCapability(L"lpacEnterprisePolicyChangeNotifications")) { DLOG(ERROR)
diff --git a/services/device/usb/usb_device_handle_usbfs.cc b/services/device/usb/usb_device_handle_usbfs.cc index 1bf79d4..6ca4296 100644 --- a/services/device/usb/usb_device_handle_usbfs.cc +++ b/services/device/usb/usb_device_handle_usbfs.cc
@@ -358,7 +358,7 @@ FROM_HERE, base::BlockingType::MAY_BLOCK); usbdevfs_urb* urb = nullptr; int rc = HANDLE_EINTR(ioctl(fd_.get(), USBDEVFS_REAPURBNDELAY, &urb)); - if (rc) { + if (rc || !urb) { if (errno == EAGAIN) break; USB_PLOG(DEBUG) << "Failed to reap urbs";
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 79aeb81..cea38190 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -33778,42 +33778,6 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://components:components_perftests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "isolate_name": "monochrome_public_apk_checker", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "monochrome_public_apk_checker", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4", - "os": "Ubuntu-16.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "avd_generic_android23", - "path": ".android" - }, - { - "name": "system_images_android_23_google_apis_x86", - "path": ".emulator_sdk" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/android/monochrome:monochrome_public_apk_checker/" } ] },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 9ce1a40c..22b0d62 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1693,6 +1693,11 @@ }, }, }, + 'remove_from': [ + # TODO(crbug.com/1137405): Re-enable once the test harness supports + # the --avd-config flag. + 'android-marshmallow-x86-rel-non-cq', + ], }, 'monochrome_public_test_ar_apk': { 'modifications': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 3a8ea96..db3a832 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -7080,6 +7080,27 @@ ] } ], + "UserAgentClientHintRollout": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "UserAgentClientHintRollout", + "enable_features": [ + "UserAgentClientHint" + ] + } + ] + } + ], "UserDataSnapshot": [ { "platforms": [
diff --git a/third_party/blink/perf_tests/accessibility/many-text-changes-small-wait-between.html b/third_party/blink/perf_tests/accessibility/many-text-changes-small-wait-between.html new file mode 100644 index 0000000..b39e0e9 --- /dev/null +++ b/third_party/blink/perf_tests/accessibility/many-text-changes-small-wait-between.html
@@ -0,0 +1,84 @@ +<!DOCTYPE html> +<html> +<head> + <style> + container, leaf {display: block;} + </style> + <script src="../resources/runner.js"></script> +</head> +<body> +</body> + +<script> + +var isDone = false; +var startTime; + +function runTest() { + if (startTime) { + PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime); + PerfTestRunner.addRunTestEndMarker(); + } + if (!isDone) { + PerfTestRunner.addRunTestStartMarker(); + startTime = PerfTestRunner.now(); + + document.body.innerHTML = ''; + appendManyElements(document.body, 7); // Create tree 7 levels deep. + + setTimeout(changeLeafText, 10); + + // Re-run the same test. + // Wait to allow the asynchronous accessibility code that's + // covered by traceEventsToMeasure to have a chance to run. + setTimeout(runTest, 1500); + } +} + +// Recursively add layers of descendants. +function appendManyElements(start, depth) { + if (depth == 0) { + start.innerHTML = '<leaf>A</leaf>'; + } + else { + // Each element receives 3 new children. + for (let count = 0; count < 3; count++) { + let newContainer = document.createElement('container'); + appendManyElements(start.appendChild(newContainer), depth - 1); + } + } +} + +function changeLeafText(text) { + let elements = document.querySelectorAll('leaf'); + let count = 0; + function changeSome() { + const end = Math.min(count + 100, elements.length); + for (; count < end; count ++) + elements[count].textContent = 'B'; + setTimeout(changeSome, 0); + } + + setTimeout(changeSome, 0); +} + + +PerfTestRunner.startMeasureValuesAsync({ + description: 'Test accessibility performance when changing text inside ignored inlines.', + unit: 'ms', + done: function () { + isDone = true; + }, + run: function() { + runTest(); + }, + iterationCount: 6, + tracingCategories: 'accessibility', + traceEventsToMeasure: [ + 'ProcessDeferredAccessibilityEvents', + 'RenderAccessibilityImpl::SendPendingAccessibilityEvents' + ] +}); +</script> + +</html>
diff --git a/third_party/blink/public/mojom/hyphenation/hyphenation.mojom b/third_party/blink/public/mojom/hyphenation/hyphenation.mojom index 2b072d2..4ec9094 100644 --- a/third_party/blink/public/mojom/hyphenation/hyphenation.mojom +++ b/third_party/blink/public/mojom/hyphenation/hyphenation.mojom
@@ -4,12 +4,12 @@ module blink.mojom; -import "mojo/public/mojom/base/file.mojom"; +import "mojo/public/mojom/base/read_only_file.mojom"; // Loads hyphenation dictionary. interface Hyphenation { - // Returns a handle to the raw hyphneation dictionary. + // Returns a handle to the raw hyphenation dictionary. [Sync] OpenDictionary(string locale) => ( - mojo_base.mojom.File? hyphenation_dictionary_handle); + mojo_base.mojom.ReadOnlyFile? hyphenation_dictionary_handle); };
diff --git a/third_party/blink/public/platform/media/webmediaplayer_delegate.h b/third_party/blink/public/platform/media/webmediaplayer_delegate.h index 39528c8..f48f9a3f 100644 --- a/third_party/blink/public/platform/media/webmediaplayer_delegate.h +++ b/third_party/blink/public/platform/media/webmediaplayer_delegate.h
@@ -142,6 +142,9 @@ // Notify that a buffer underflow event happened for the media player. virtual void DidBufferUnderflow(int player_id) = 0; + // Notify that a playback seek event happened for the media player. + virtual void DidSeek(int player_id) = 0; + // Notify that playback is stopped. This will drop wake locks and remove any // external controls. //
diff --git a/third_party/blink/public/strings/blink_strings.grd b/third_party/blink/public/strings/blink_strings.grd index c3ad7aa..579947c 100644 --- a/third_party/blink/public/strings/blink_strings.grd +++ b/third_party/blink/public/strings/blink_strings.grd
@@ -799,6 +799,12 @@ <message name="IDS_AX_CHECKBOX_PARTIALLY_CHECKED" desc="Accessibility state description for a checkbox that is in the partially checked state"> Partially Checked </message> + <message name="IDS_AX_LIST_BOX_STATE_DESCRIPTION" desc="Accessibility state description for a list box of items"> + <ph name="COUNT">$1<ex>3</ex></ph> items + </message> + <message name="IDS_AX_LIST_BOX_ITEM_STATE_DESCRIPTION" desc="Accessibility state description for an item that is part of a list box"> + in list, item <ph name="INDEX">$1<ex>1</ex></ph> of <ph name="COUNT">$2<ex>3</ex></ph> + </message> </if> <!-- Automatic image annotations for accessibility -->
diff --git a/third_party/blink/public/strings/blink_strings_grd/IDS_AX_LIST_BOX_ITEM_STATE_DESCRIPTION.png.sha1 b/third_party/blink/public/strings/blink_strings_grd/IDS_AX_LIST_BOX_ITEM_STATE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..a1e3e18 --- /dev/null +++ b/third_party/blink/public/strings/blink_strings_grd/IDS_AX_LIST_BOX_ITEM_STATE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +5e7e6ff99f7cb86524aba3dd7cb307a29e82b886 \ No newline at end of file
diff --git a/third_party/blink/public/strings/blink_strings_grd/IDS_AX_LIST_BOX_STATE_DESCRIPTION.png.sha1 b/third_party/blink/public/strings/blink_strings_grd/IDS_AX_LIST_BOX_STATE_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..6ab500c --- /dev/null +++ b/third_party/blink/public/strings/blink_strings_grd/IDS_AX_LIST_BOX_STATE_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +988bf891873b693e8ce4a638eae73df2e1adfd57 \ No newline at end of file
diff --git a/third_party/blink/public/strings/translations/blink_strings_ml.xtb b/third_party/blink/public/strings/translations/blink_strings_ml.xtb index 800b8341..9522837 100644 --- a/third_party/blink/public/strings/translations/blink_strings_ml.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_ml.xtb
@@ -29,6 +29,7 @@ <translation id="1806710327868736751">അലേർട്ട്_ഡയലോഗ്</translation> <translation id="1821985195704844674">ട്രീ ഗ്രിഡ്</translation> <translation id="1822429046913737220">AM/PM</translation> +<translation id="1823704031293214298">പേജിന്റെ അടിക്കുറിപ്പ്</translation> <translation id="1832974991323546415">റിമോട്ട് ഉപകരണത്തിൽ പ്ലേ ചെയ്യുക</translation> <translation id="190587075670221089">ഇല്ലാതാക്കൽ</translation> <translation id="1907737156431278478">ഉദാഹരണം</translation> @@ -103,6 +104,7 @@ <translation id="4201051445878709314">മുമ്പത്തെ മാസം കാണിക്കുക</translation> <translation id="421884353938374759">വർണ്ണ പിക്കർ</translation> <translation id="4248100235867064564">മെനു ബാർ</translation> +<translation id="4293574643247337246">പേജിന്റെ തലക്കെട്ട്</translation> <translation id="4360991593054037559">സാധുവായ മൂല്യം നൽകുക. സാധുവായ ഏറ്റവുമടുത്ത രണ്ട് മൂല്യങ്ങൾ <ph name="VALID_VALUE_LOW" />, <ph name="VALID_VALUE_HIGHER" /> എന്നിവയാണ്.</translation> <translation id="4384583879834880242">ചോദ്യോത്തരം</translation> <translation id="4444765639179266822">പറയാൻ ദൃശ്യമാകുന്നത്: <ph name="OCR_TEXT" /></translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_sk.xtb b/third_party/blink/public/strings/translations/blink_strings_sk.xtb index 83bb510..e64e71fc 100644 --- a/third_party/blink/public/strings/translations/blink_strings_sk.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_sk.xtb
@@ -29,6 +29,7 @@ <translation id="1806710327868736751">dialóg_upozornenia</translation> <translation id="1821985195704844674">stromová mriežka</translation> <translation id="1822429046913737220">AM / PM</translation> +<translation id="1823704031293214298">päta stránky</translation> <translation id="1832974991323546415">prehrať na vzdialenom zariadení</translation> <translation id="190587075670221089">odstránenie</translation> <translation id="1907737156431278478">príklad</translation> @@ -103,6 +104,7 @@ <translation id="4201051445878709314">Zobraziť predchádzajúci mesiac</translation> <translation id="421884353938374759">výber farieb</translation> <translation id="4248100235867064564">panel s ponukami</translation> +<translation id="4293574643247337246">hlavička stránky</translation> <translation id="4360991593054037559">Zadajte platnú hodnotu. Najbližšie platné hodnoty sú <ph name="VALID_VALUE_LOW" /> a <ph name="VALID_VALUE_HIGHER" />.</translation> <translation id="4384583879834880242">Otázky a odpovede</translation> <translation id="4444765639179266822">Zrejme znamená: <ph name="OCR_TEXT" /></translation>
diff --git a/third_party/blink/public/web/web_document.h b/third_party/blink/public/web/web_document.h index 8a30460..b6f3b4e 100644 --- a/third_party/blink/public/web/web_document.h +++ b/third_party/blink/public/web/web_document.h
@@ -132,6 +132,8 @@ // See cc/paint/element_id.h for the definition of these id. BLINK_EXPORT uint64_t GetVisualViewportScrollingElementIdForTesting(); + BLINK_EXPORT bool IsLoaded(); + #if INSIDE_BLINK BLINK_EXPORT WebDocument(Document*); BLINK_EXPORT WebDocument& operator=(Document*);
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.cc b/third_party/blink/renderer/core/css/element_rule_collector.cc index 84e0377..3d7609f 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector.cc
@@ -150,7 +150,7 @@ &context_.GetElement(), SelectorChecker::kVisitedMatchEnabled); context.scope = match_request.scope; context.pseudo_id = pseudo_style_request_.pseudo_id; - context.is_from_vtt = match_request.is_from_vtt; + context.vtt_originating_element = match_request.vtt_originating_element; unsigned rejected = 0; unsigned fast_rejected = 0;
diff --git a/third_party/blink/renderer/core/css/mathml.css b/third_party/blink/renderer/core/css/mathml.css index aa528915..fdbf23a 100644 --- a/third_party/blink/renderer/core/css/mathml.css +++ b/third_party/blink/renderer/core/css/mathml.css
@@ -74,6 +74,11 @@ text-transform: math-auto; } +/* Tables */ +mtable { + math-style: compact; +} + /* Fractions */ mfrac { padding-inline-start: 1px; @@ -121,4 +126,3 @@ munderover[accent="true" i] > :first-child { math-shift: compact; } -
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_selector.cc b/third_party/blink/renderer/core/css/parser/css_parser_selector.cc index 1322bf3..6dca8808d 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_selector.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_selector.cc
@@ -59,8 +59,17 @@ } bool CSSParserSelector::IsSimple() const { - if (selector_->SelectorList() || - selector_->Match() == CSSSelector::kPseudoElement) + if (selector_->SelectorList()) { + switch (selector_->GetPseudoType()) { + case CSSSelector::kPseudoIs: + case CSSSelector::kPseudoWhere: + break; + default: + return false; + } + } + + if (selector_->Match() == CSSSelector::kPseudoElement) return false; if (!tag_history_)
diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc index 6a927d7..dd3371f0 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc
@@ -511,6 +511,10 @@ {":is(.a :is(.b .c), .d)"}, {":is(.a :where(.b .c), .d)"}, {":where(.a :is(.b .c), .d)"}, + {":not(:is(.a))"}, + {":not(:is(.a, .b))"}, + {":not(:is(.a + .b, .c .d))"}, + {":not(:where(:not(.a)))"}, {"::slotted(:is(.a))"}, {"::slotted(:is(div.a))"}, {"::slotted(:is(.a, .b))"},
diff --git a/third_party/blink/renderer/core/css/resolver/match_request.h b/third_party/blink/renderer/core/css/resolver/match_request.h index e7911422..2409fd6 100644 --- a/third_party/blink/renderer/core/css/resolver/match_request.h +++ b/third_party/blink/renderer/core/css/resolver/match_request.h
@@ -42,12 +42,12 @@ const ContainerNode* scope = nullptr, const CSSStyleSheet* css_sheet = nullptr, unsigned style_sheet_index = 0, - bool is_from_vtt = false) + Element* vtt_originating_element = nullptr) : rule_set(rule_set), scope(scope), style_sheet(css_sheet), style_sheet_index(style_sheet_index), - is_from_vtt(is_from_vtt) { + vtt_originating_element(vtt_originating_element) { // Now that we're about to read from the RuleSet, we're done adding more // rules to the set and we should make sure it's compacted. rule_set->CompactRulesIfNeeded(); @@ -57,7 +57,10 @@ const ContainerNode* scope; const CSSStyleSheet* style_sheet; const unsigned style_sheet_index; - bool is_from_vtt; + // For WebVTT STYLE blocks, this is set to the featureless-like Element + // described by the spec: + // https://w3c.github.io/webvtt/#obtaining-css-boxes + Element* vtt_originating_element; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index 4d0b9d76..8717609 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -409,12 +409,12 @@ int style_sheet_index = 0; collector.ClearMatchedRules(); for (CSSStyleSheet* style : styles) { - RuleSet* rule_set = - element.GetDocument().GetStyleEngine().RuleSetForSheet(*style); + StyleEngine& style_engine = element.GetDocument().GetStyleEngine(); + RuleSet* rule_set = style_engine.RuleSetForSheet(*style); if (rule_set) { - collector.CollectMatchingRules( - MatchRequest(rule_set, nullptr /* scope */, style, - style_sheet_index, true /* is_from_webvtt */)); + collector.CollectMatchingRules(MatchRequest( + rule_set, nullptr /* scope */, style, style_sheet_index, + style_engine.EnsureVTTOriginatingElement())); style_sheet_index++; } }
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc index 4fc9a27..8cc5fe553 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -720,7 +720,8 @@ void RuleFeatureSet::ExtractInvalidationSetFeaturesFromSelectorList( const CSSSelector& simple_selector, InvalidationSetFeatures& features, - PositionType position) { + PositionType position, + CSSSelector::PseudoType pseudo_type) { AutoRestoreMaxDirectAdjacentSelectors restore_max(&features); const CSSSelectorList* selector_list = simple_selector.SelectorList(); @@ -755,10 +756,15 @@ } // Don't add any features if one of the sub-selectors of does not contain // any invalidation set features. E.g. :-webkit-any(*, span). - if (all_sub_selectors_have_features) - features.NarrowToFeatures(any_features); - features.has_features_for_rule_set_invalidation |= - all_sub_selectors_have_features_for_ruleset_invalidation; + // + // :not() counts as not having features, since we should invalidate elements + // _without_ those features. + if (pseudo_type != CSSSelector::kPseudoNot) { + if (all_sub_selectors_have_features) + features.NarrowToFeatures(any_features); + features.has_features_for_rule_set_invalidation |= + all_sub_selectors_have_features_for_ruleset_invalidation; + } } const CSSSelector* RuleFeatureSet::ExtractInvalidationSetFeaturesFromCompound( @@ -805,7 +811,7 @@ } ExtractInvalidationSetFeaturesFromSelectorList(*simple_selector, features, - position); + position, pseudo); if (features.invalidation_flags.InvalidatesParts()) metadata_.invalidates_parts = true;
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.h b/third_party/blink/renderer/core/css/rule_feature_set.h index dbe1e93..b2128dd9 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.h +++ b/third_party/blink/renderer/core/css/rule_feature_set.h
@@ -403,7 +403,8 @@ CSSSelector::PseudoType = CSSSelector::kPseudoUnknown); void ExtractInvalidationSetFeaturesFromSelectorList(const CSSSelector&, InvalidationSetFeatures&, - PositionType); + PositionType, + CSSSelector::PseudoType); void UpdateFeaturesFromCombinator( const CSSSelector&, const CSSSelector* last_compound_selector_in_adjacent_chain,
diff --git a/third_party/blink/renderer/core/css/rule_feature_set_test.cc b/third_party/blink/renderer/core/css/rule_feature_set_test.cc index 59f4ef9..1bd43c3 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set_test.cc
@@ -1566,6 +1566,22 @@ {":is(.a, *) .b", ".a .b, * .b"}, {":is(.a + .b, .c) *", ".a + .b *, .c *"}, {":is(.a + *, .c) *", ".a + * *, .c *"}, + // TODO(andruud): At the time of writing these :not() tests, we only + // support a single simple selector inside :not(). When a complex selector + // list is supported, some refs should be rewritten to be less strange. + {":not(:is(.a))", ":not(.a)"}, + {":not(:is(.a, .b))", ":not(.a), :not(.b)"}, + {":not(:is(.a .b))", ":not(.b), .a .b"}, + {":not(:is(.a .b, .c + .d))", ":not(.b), :not(.d), .a .b, .c + .d"}, + {".a :not(:is(.b .c))", ".a :not(.c), .b .c"}, + {":not(:is(.a)) .b", ":not(.a) .b"}, + {":not(:is(.a .b, .c)) :not(:is(.d + .e, .f))", + ":not(.a):not(.b) :not(.f), :not(.a):not(.b) :not(.e)," + ":not(.c) :not(.f), .d + .e"}, + // We don't have any special support for nested :not(): it's treated + // as a single :not() level in terms of invalidation: + {".a :not(:is(:not(.b), .c))", ".a :not(.b), .a :not(.c)"}, + {":not(:is(:not(.a), .b)) .c", ":not(.a) .c, :not(.b) .c"}, // clang-format on };
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc index 850d812..7c9724f 100644 --- a/third_party/blink/renderer/core/css/selector_checker.cc +++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -123,38 +123,6 @@ namespace_uri == element.namespaceURI(); } -static bool MatchesTagNameForVTT( - const Element& element, - const QualifiedName& tag_q_name, - const SelectorChecker::SelectorCheckingContext& context) { - if (tag_q_name == AnyQName()) - return true; - - const AtomicString& local_name = tag_q_name.LocalName(); - - // The originating element for the cues has no explicit name. - if (!context.in_rightmost_compound && !local_name.IsEmpty() && - local_name != CSSSelector::UniversalSelectorAtom()) { - return false; - } - - if (local_name != CSSSelector::UniversalSelectorAtom() && - local_name != element.localName()) { - if (element.IsHTMLElement() || !IsA<HTMLDocument>(element.GetDocument())) - return false; - - // Non-html elements in html documents are normalized to their camel-cased - // version during parsing if applicable. Yet, type selectors are lower-cased - // for selectors in html documents. Compare the upper case converted names - // instead to allow matching SVG elements like foreignObject. - if (element.TagQName().LocalNameUpper() != tag_q_name.LocalNameUpper()) - return false; - } - - const AtomicString& namespace_uri = tag_q_name.NamespaceURI(); - return namespace_uri == g_star_atom || namespace_uri.IsEmpty(); -} - static Element* ParentElement( const SelectorChecker::SelectorCheckingContext& context) { // - If context.scope is a shadow root, we should walk up to its shadow host. @@ -260,21 +228,14 @@ bool SelectorChecker::Match(const SelectorCheckingContext& context, MatchResult& result) const { DCHECK(context.selector); - if (context.is_from_vtt) - return MatchVTTBlockSelector(context, result); + if (UNLIKELY(context.vtt_originating_element)) { + // A kShadowPseudo combinator is required for VTT matching. + if (context.selector->IsLastInTagHistory()) + return false; + } return MatchSelector(context, result) == kSelectorMatches; } -bool SelectorChecker::MatchVTTBlockSelector( - const SelectorCheckingContext& context, - MatchResult& result) const { - DCHECK(context.selector); - if (context.selector->IsLastInTagHistory()) - return false; - - return MatchSelectorForVTT(context, result) == kSelectorMatches; -} - // Recursive check of selectors and combinators // It can return 4 different values: // * SelectorMatches - the selector matches the element e @@ -320,44 +281,6 @@ return match; } -SelectorChecker::MatchStatus SelectorChecker::MatchSelectorForVTT( - const SelectorCheckingContext& context, - MatchResult& result) const { - MatchResult sub_result; - if (!CheckOneForVTT(context, sub_result)) - return kSelectorFailsLocally; - - if (sub_result.dynamic_pseudo != kPseudoIdNone) - result.dynamic_pseudo = sub_result.dynamic_pseudo; - - if (context.selector->IsLastInTagHistory()) { - if (ScopeContainsLastMatchedElement(context)) { - result.specificity += sub_result.specificity; - return kSelectorMatches; - } - return kSelectorFailsLocally; - } - - MatchStatus match; - if (context.selector->Relation() != CSSSelector::kSubSelector) { - if (NextSelectorExceedsScope(context)) - return kSelectorFailsCompletely; - - if (context.pseudo_id != kPseudoIdNone && - context.pseudo_id != result.dynamic_pseudo) - return kSelectorFailsCompletely; - - base::AutoReset<PseudoId> dynamic_pseudo_scope(&result.dynamic_pseudo, - kPseudoIdNone); - match = MatchForRelationForVTT(context, result); - } else { - match = MatchForSubSelectorForVTT(context, result); - } - if (match == kSelectorMatches) - result.specificity += sub_result.specificity; - return match; -} - static inline SelectorChecker::SelectorCheckingContext PrepareNextContextForRelation( const SelectorChecker::SelectorCheckingContext& context) { @@ -393,14 +316,6 @@ return MatchSelector(next_context, result); } -SelectorChecker::MatchStatus SelectorChecker::MatchForSubSelectorForVTT( - const SelectorCheckingContext& context, - MatchResult& result) const { - SelectorCheckingContext next_context = PrepareNextContextForRelation(context); - next_context.is_sub_selector = true; - return MatchSelectorForVTT(next_context, result); -} - static inline bool IsV0ShadowRoot(const Node* node) { auto* shadow_root = DynamicTo<ShadowRoot>(node); return shadow_root && shadow_root->GetType() == ShadowRootType::V0; @@ -562,6 +477,10 @@ Element* shadow_host = context.element->OwnerShadowHost(); if (!shadow_host) return kSelectorFailsCompletely; + // Match against featureless-like Element described by spec: + // https://w3c.github.io/webvtt/#obtaining-css-boxes + if (context.vtt_originating_element) + shadow_host = context.vtt_originating_element; next_context.element = shadow_host; return MatchSelector(next_context, result); } @@ -641,49 +560,6 @@ return kSelectorFailsCompletely; } -SelectorChecker::MatchStatus SelectorChecker::MatchForRelationForVTT( - const SelectorCheckingContext& context, - MatchResult& result) const { - SelectorCheckingContext next_context = PrepareNextContextForRelation(context); - - CSSSelector::RelationType relation = context.selector->Relation(); - - // Rules that come from a WebVTT STYLE block apply to a hypothetical - // document with a single empty element with no explicit name, no namespace, - // no attribute, no classes, no IDs, and unknown primary language that acts - // as the originating element for the cue pseudo-elements. This element - // must not be generally selectable. - if (relation != CSSSelector::kShadowPseudo) - return kSelectorFailsCompletely; - - if (!context.is_sub_selector) - next_context.visited_match_type = kVisitedMatchDisabled; - - next_context.in_rightmost_compound = false; - next_context.is_sub_selector = false; - next_context.previous_element = context.element; - next_context.pseudo_id = kPseudoIdNone; - - DCHECK(mode_ == kQueryingRules || - context.selector->GetPseudoType() != CSSSelector::kPseudoShadow); - if (context.selector->GetPseudoType() == CSSSelector::kPseudoShadow) { - UseCounter::Count(context.element->GetDocument(), - WebFeature::kPseudoShadowInStaticProfile); - } - // If we're in the same tree-scope as the scoping element, then following - // a shadow descendant combinator would escape that and thus the scope. - if (context.scope && context.scope->OwnerShadowHost() && - context.scope->OwnerShadowHost()->GetTreeScope() == - context.element->GetTreeScope()) - return kSelectorFailsCompletely; - - Element* shadow_host = context.element->OwnerShadowHost(); - if (!shadow_host) - return kSelectorFailsCompletely; - next_context.element = shadow_host; - return MatchSelectorForVTT(next_context, result); -} - SelectorChecker::MatchStatus SelectorChecker::MatchForPseudoContent( const SelectorCheckingContext& context, const Element& element, @@ -879,35 +755,6 @@ } } -bool SelectorChecker::CheckOneForVTT(const SelectorCheckingContext& context, - MatchResult& result) const { - DCHECK(context.element); - Element& element = *context.element; - DCHECK(context.selector); - const CSSSelector& selector = *context.selector; - - switch (selector.Match()) { - case CSSSelector::kTag: - return MatchesTagNameForVTT(element, selector.TagQName(), context); - // Attribute selectors - case CSSSelector::kAttributeExact: - case CSSSelector::kAttributeSet: - case CSSSelector::kAttributeHyphen: - case CSSSelector::kAttributeList: - case CSSSelector::kAttributeContain: - case CSSSelector::kAttributeBegin: - case CSSSelector::kAttributeEnd: - return AnyAttributeMatches(element, selector.Match(), selector); - case CSSSelector::kPseudoClass: - return CheckPseudoClassForVTT(context, result); - case CSSSelector::kPseudoElement: - return CheckPseudoElementForVTT(context, result); - - default: - return false; - } -} - bool SelectorChecker::CheckPseudoNot(const SelectorCheckingContext& context, MatchResult& result) const { const CSSSelector& selector = *context.selector; @@ -934,32 +781,6 @@ return false; } -bool SelectorChecker::CheckPseudoNotForVTT( - const SelectorCheckingContext& context, - MatchResult& result) const { - const CSSSelector& selector = *context.selector; - SelectorCheckingContext sub_context(context); - sub_context.is_sub_selector = true; - DCHECK(selector.SelectorList()); - for (sub_context.selector = selector.SelectorList()->First(); - sub_context.selector; - sub_context.selector = sub_context.selector->TagHistory()) { - // :not cannot nest. I don't really know why this is a - // restriction in CSS3, but it is, so let's honor it. - // the parser enforces that this never occurs - DCHECK_NE(sub_context.selector->GetPseudoType(), CSSSelector::kPseudoNot); - // We select between :visited and :link when applying. We don't know which - // one applied (or not) yet. - if (sub_context.selector->GetPseudoType() == CSSSelector::kPseudoVisited || - (sub_context.selector->GetPseudoType() == CSSSelector::kPseudoLink && - sub_context.visited_match_type == kVisitedMatchEnabled)) - return true; - if (!CheckOneForVTT(sub_context, result)) - return true; - } - return false; -} - bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, MatchResult& result) const { Element& element = *context.element; @@ -1361,36 +1182,6 @@ return false; } -bool SelectorChecker::CheckPseudoClassForVTT( - const SelectorCheckingContext& context, - MatchResult& result) const { - const CSSSelector& selector = *context.selector; - - switch (selector.GetPseudoType()) { - case CSSSelector::kPseudoNot: - return CheckPseudoNotForVTT(context, result); - case CSSSelector::kPseudoAny: { - SelectorCheckingContext sub_context(context); - sub_context.is_sub_selector = true; - DCHECK(selector.SelectorList()); - for (sub_context.selector = selector.SelectorList()->First(); - sub_context.selector; sub_context.selector = CSSSelectorList::Next( - *sub_context.selector)) { - MatchResult sub_result; - if (MatchSelectorForVTT(sub_context, sub_result) == kSelectorMatches) - return true; - } - } break; - case CSSSelector::kPseudoHostContext: - FALLTHROUGH; - case CSSSelector::kPseudoHost: - return false; - default: - return CheckPseudoClass(context, result); - } - return false; -} - bool SelectorChecker::CheckPseudoElement(const SelectorCheckingContext& context, MatchResult& result) const { const CSSSelector& selector = *context.selector; @@ -1479,38 +1270,6 @@ } } -bool SelectorChecker::CheckPseudoElementForVTT( - const SelectorCheckingContext& context, - MatchResult& result) const { - const CSSSelector& selector = *context.selector; - Element& element = *context.element; - switch (selector.GetPseudoType()) { - case CSSSelector::kPseudoCue: { - SelectorCheckingContext sub_context(context); - sub_context.is_sub_selector = true; - sub_context.scope = nullptr; - sub_context.treat_shadow_host_as_normal_scope = false; - - for (sub_context.selector = selector.SelectorList()->First(); - sub_context.selector; sub_context.selector = CSSSelectorList::Next( - *sub_context.selector)) { - MatchResult sub_result; - if (MatchSelectorForVTT(sub_context, sub_result) == kSelectorMatches) - return true; - } - return false; - } - case CSSSelector::kPseudoWebKitCustomElement: { - if (ShadowRoot* root = element.ContainingShadowRoot()) - return root->IsUserAgent() && - element.ShadowPseudoId() == selector.Value(); - return false; - } - default: - return false; - } -} - bool SelectorChecker::CheckPseudoHost(const SelectorCheckingContext& context, MatchResult& result) const { const CSSSelector& selector = *context.selector;
diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h index 4c1d2d9d4..d5be4da 100644 --- a/third_party/blink/renderer/core/css/selector_checker.h +++ b/third_party/blink/renderer/core/css/selector_checker.h
@@ -125,7 +125,7 @@ bool has_scrollbar_pseudo = false; bool has_selection_pseudo = false; bool treat_shadow_host_as_normal_scope = false; - bool is_from_vtt = false; + Element* vtt_originating_element = nullptr; bool in_nested_complex_selector = false; }; @@ -155,7 +155,6 @@ // to by the context are a match. Delegates most of the work to the Check* // methods below. bool CheckOne(const SelectorCheckingContext&, MatchResult&) const; - bool CheckOneForVTT(const SelectorCheckingContext&, MatchResult&) const; enum MatchStatus { kSelectorMatches, @@ -182,35 +181,22 @@ // to try (e.g. same element, parent, sibling) depends on the combinators in // the selectors. MatchStatus MatchSelector(const SelectorCheckingContext&, MatchResult&) const; - MatchStatus MatchSelectorForVTT(const SelectorCheckingContext&, - MatchResult&) const; MatchStatus MatchForSubSelector(const SelectorCheckingContext&, MatchResult&) const; - MatchStatus MatchForSubSelectorForVTT(const SelectorCheckingContext&, - MatchResult&) const; MatchStatus MatchForRelation(const SelectorCheckingContext&, MatchResult&) const; - MatchStatus MatchForRelationForVTT(const SelectorCheckingContext&, - MatchResult&) const; MatchStatus MatchForPseudoContent(const SelectorCheckingContext&, const Element&, MatchResult&) const; MatchStatus MatchForPseudoShadow(const SelectorCheckingContext&, const ContainerNode*, MatchResult&) const; - bool MatchVTTBlockSelector(const SelectorCheckingContext& context, - MatchResult& result) const; bool CheckPseudoClass(const SelectorCheckingContext&, MatchResult&) const; - bool CheckPseudoClassForVTT(const SelectorCheckingContext&, - MatchResult&) const; bool CheckPseudoElement(const SelectorCheckingContext&, MatchResult&) const; - bool CheckPseudoElementForVTT(const SelectorCheckingContext&, - MatchResult&) const; bool CheckScrollbarPseudoClass(const SelectorCheckingContext&, MatchResult&) const; bool CheckPseudoHost(const SelectorCheckingContext&, MatchResult&) const; bool CheckPseudoNot(const SelectorCheckingContext&, MatchResult&) const; - bool CheckPseudoNotForVTT(const SelectorCheckingContext&, MatchResult&) const; ComputedStyle* element_style_; CustomScrollbar* scrollbar_;
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index 6daa6a2..037bf5b2 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -470,6 +470,14 @@ text_tracks_.erase(text_track); } +Element* StyleEngine::EnsureVTTOriginatingElement() { + if (!vtt_originating_element_) { + vtt_originating_element_ = MakeGarbageCollected<Element>( + QualifiedName(g_null_atom, g_empty_atom, g_empty_atom), document_); + } + return vtt_originating_element_; +} + void StyleEngine::MediaQueryAffectingValueChanged( HeapHashSet<Member<TextTrack>>& text_tracks, MediaValueChange change) { @@ -2344,6 +2352,7 @@ visitor->Trace(tracker_); visitor->Trace(meta_color_scheme_); visitor->Trace(text_tracks_); + visitor->Trace(vtt_originating_element_); FontSelectorClient::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h index 461bbd3..d2d6341 100644 --- a/third_party/blink/renderer/core/css/style_engine.h +++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -133,6 +133,14 @@ void AddTextTrack(TextTrack*); void RemoveTextTrack(TextTrack*); + // An Element with no tag name, IDs, classes (etc), as described by the + // WebVTT spec: + // https://w3c.github.io/webvtt/#obtaining-css-boxes + // + // TODO(https://github.com/w3c/webvtt/issues/477): Make originating element + // actually featureless. + Element* EnsureVTTOriginatingElement(); + const ActiveStyleSheetVector ActiveStyleSheetsForInspector(); bool NeedsActiveStyleUpdate() const; @@ -661,6 +669,7 @@ friend class WhitespaceAttacherTest; HeapHashSet<Member<TextTrack>> text_tracks_; + Member<Element> vtt_originating_element_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_document.cc b/third_party/blink/renderer/core/exported/web_document.cc index 137b8fa1..739e0f9 100644 --- a/third_party/blink/renderer/core/exported/web_document.cc +++ b/third_party/blink/renderer/core/exported/web_document.cc
@@ -280,6 +280,10 @@ .GetStableId(); } +bool WebDocument::IsLoaded() { + return !ConstUnwrap<Document>()->Parser(); +} + WebDocument::WebDocument(Document* elem) : WebNode(elem) {} DEFINE_WEB_NODE_TYPE_CASTS(WebDocument, ConstUnwrap<Node>()->IsDocumentNode())
diff --git a/third_party/blink/renderer/core/frame/navigator_automation_information.idl b/third_party/blink/renderer/core/frame/navigator_automation_information.idl index 3d7ca44..62907d00 100644 --- a/third_party/blink/renderer/core/frame/navigator_automation_information.idl +++ b/third_party/blink/renderer/core/frame/navigator_automation_information.idl
@@ -7,5 +7,5 @@ [ RuntimeEnabled=AutomationControlled ] interface mixin NavigatorAutomationInformation { - readonly attribute boolean webdriver; + [LegacyUnforgeable] readonly attribute boolean webdriver; };
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc index ee53d49c..87b52ac 100644 --- a/third_party/blink/renderer/core/html/html_image_element.cc +++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -553,15 +553,17 @@ unsigned HTMLImageElement::LayoutBoxWidth() const { LayoutBox* box = GetLayoutBox(); - return box ? AdjustForAbsoluteZoom::AdjustInt( - box->PhysicalContentBoxRect().PixelSnappedWidth(), box) + return box ? AdjustForAbsoluteZoom::AdjustLayoutUnit(box->ContentWidth(), + *box) + .Round() : 0; } unsigned HTMLImageElement::LayoutBoxHeight() const { LayoutBox* box = GetLayoutBox(); - return box ? AdjustForAbsoluteZoom::AdjustInt( - box->PhysicalContentBoxRect().PixelSnappedHeight(), box) + return box ? AdjustForAbsoluteZoom::AdjustLayoutUnit(box->ContentHeight(), + *box) + .Round() : 0; }
diff --git a/third_party/blink/renderer/core/inspector/BUILD.gn b/third_party/blink/renderer/core/inspector/BUILD.gn index e7ed542..b8fa1eb 100644 --- a/third_party/blink/renderer/core/inspector/BUILD.gn +++ b/third_party/blink/renderer/core/inspector/BUILD.gn
@@ -10,6 +10,8 @@ _inspector_protocol_dir = "//third_party/inspector_protocol" blink_core_sources("inspector") { + configs += [ "//build/config/compiler:noshadowing" ] + sources = [ "console_message.cc", "console_message.h",
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc index a3de431..aece3ad 100644 --- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -1422,8 +1422,7 @@ bool success = dom_agent_->History()->Perform(action, exception_state); if (success) { CSSStyleRule* rule = InspectorCSSAgent::AsCSSStyleRule(action->TakeRule()); - InspectorStyleSheet* inspector_style_sheet = - InspectorStyleSheetForRule(rule); + inspector_style_sheet = InspectorStyleSheetForRule(rule); if (!inspector_style_sheet) { return Response::ServerError( "Failed to get inspector style sheet for rule."); @@ -1457,8 +1456,7 @@ bool success = dom_agent_->History()->Perform(action, exception_state); if (success) { auto* rule = To<CSSKeyframeRule>(action->TakeRule()); - InspectorStyleSheet* inspector_style_sheet = - BindStyleSheet(rule->parentStyleSheet()); + inspector_style_sheet = BindStyleSheet(rule->parentStyleSheet()); if (!inspector_style_sheet) { return Response::ServerError( "Failed to get inspector style sheet for rule."); @@ -1870,8 +1868,7 @@ CSSRule* parent_rule = media->ParentRule(); if (!parent_rule) return media_object; - InspectorStyleSheet* inspector_style_sheet = - BindStyleSheet(parent_rule->parentStyleSheet()); + inspector_style_sheet = BindStyleSheet(parent_rule->parentStyleSheet()); media_object->setRange( inspector_style_sheet->RuleHeaderSourceRange(parent_rule)); }
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc index b8ee4b9..64fe591 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -870,7 +870,7 @@ attribute_name = attribute_name.DeprecatedLower(); found_original_attribute |= name.isJust() && attribute_name == case_adjusted_name; - Response response = + response = dom_editor_->SetAttribute(element, attribute_name, attribute.Value()); if (!response.IsSuccess()) return response; @@ -1144,42 +1144,41 @@ break; } } + } - // XPath evaluation - for (Document* document : docs) { - DCHECK(document); - DummyExceptionStateForTesting exception_state; - XPathResult* result = DocumentXPathEvaluator::evaluate( - *document, whitespace_trimmed_query, document, nullptr, - XPathResult::kOrderedNodeSnapshotType, ScriptValue(), - exception_state); - if (exception_state.HadException() || !result) - continue; + // XPath evaluation + for (Document* document : docs) { + DCHECK(document); + DummyExceptionStateForTesting exception_state; + XPathResult* result = DocumentXPathEvaluator::evaluate( + *document, whitespace_trimmed_query, document, nullptr, + XPathResult::kOrderedNodeSnapshotType, ScriptValue(), exception_state); + if (exception_state.HadException() || !result) + continue; - wtf_size_t size = result->snapshotLength(exception_state); - for (wtf_size_t i = 0; !exception_state.HadException() && i < size; ++i) { - Node* node = result->snapshotItem(i, exception_state); - if (exception_state.HadException()) - break; + wtf_size_t size = result->snapshotLength(exception_state); + for (wtf_size_t i = 0; !exception_state.HadException() && i < size; ++i) { + Node* node = result->snapshotItem(i, exception_state); + if (exception_state.HadException()) + break; - if (node->getNodeType() == Node::kAttributeNode) - node = To<Attr>(node)->ownerElement(); - result_collector.insert(node); - } + if (node->getNodeType() == Node::kAttributeNode) + node = To<Attr>(node)->ownerElement(); + result_collector.insert(node); } + } - // Selector evaluation - for (Document* document : docs) { - DummyExceptionStateForTesting exception_state; - StaticElementList* element_list = document->QuerySelectorAll( - AtomicString(whitespace_trimmed_query), exception_state); - if (exception_state.HadException() || !element_list) - continue; + // Selector evaluation + for (Document* document : docs) { + DummyExceptionStateForTesting exception_state; + StaticElementList* element_list = document->QuerySelectorAll( + AtomicString(whitespace_trimmed_query), exception_state); + if (exception_state.HadException() || !element_list) + continue; - unsigned size = element_list->length(); - for (unsigned i = 0; i < size; ++i) - result_collector.insert(element_list->item(i)); - } + unsigned size = element_list->length(); + for (unsigned i = 0; i < size; ++i) + result_collector.insert(element_list->item(i)); } *search_id = IdentifiersFactory::CreateIdentifier();
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc index f871e851..087618b 100644 --- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
@@ -301,13 +301,13 @@ dom_breakpoints_.erase(node); HeapVector<Member<Node>> stack(1, InspectorDOMAgent::InnerFirstChild(node)); do { - Node* node = stack.back(); + Node* child_node = stack.back(); stack.pop_back(); - if (!node) + if (!child_node) continue; - dom_breakpoints_.erase(node); - stack.push_back(InspectorDOMAgent::InnerFirstChild(node)); - stack.push_back(InspectorDOMAgent::InnerNextSibling(node)); + dom_breakpoints_.erase(child_node); + stack.push_back(InspectorDOMAgent::InnerFirstChild(child_node)); + stack.push_back(InspectorDOMAgent::InnerNextSibling(child_node)); } while (!stack.IsEmpty()); } }
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc index e9a1544b..9b09109 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc +++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -586,16 +586,18 @@ size_t explicit_grid_end_track_count = layout_grid->ExplicitGridEndForDirection(direction); - LayoutUnit first_offset = GetPositionForFirstTrack(layout_grid, direction); + { + LayoutUnit first_offset = GetPositionForFirstTrack(layout_grid, direction); - // Always start negative numbers at the first line. - std::unique_ptr<protocol::DictionaryValue> pos = - protocol::DictionaryValue::create(); - PhysicalOffset number_position(first_offset, alt_axis_pos); - if (direction == kForRows) - number_position = Transpose(number_position); - number_positions->pushValue( - BuildPosition(LocalToAbsolutePoint(node, number_position, scale))); + // Always start negative numbers at the first line. + std::unique_ptr<protocol::DictionaryValue> pos = + protocol::DictionaryValue::create(); + PhysicalOffset number_position(first_offset, alt_axis_pos); + if (direction == kForRows) + number_position = Transpose(number_position); + number_positions->pushValue( + BuildPosition(LocalToAbsolutePoint(node, number_position, scale))); + } // Then go line by line, calculating the offset to fall in the middle of gaps // if needed.
diff --git a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc index d50a5cdc..008c522 100644 --- a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc +++ b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.cc
@@ -126,11 +126,12 @@ if (url.IsEmpty() || urls_to_fetch.Contains(url)) continue; urls_to_fetch.insert(url); - ResourceRequest resource_request(url); - resource_request.SetRequestContext(mojom::RequestContextType::INTERNAL); + ResourceRequest style_sheet_resource_request(url); + style_sheet_resource_request.SetRequestContext( + mojom::RequestContextType::INTERNAL); ResourceLoaderOptions options(world); options.initiator_info.name = fetch_initiator_type_names::kInternal; - FetchParameters params(std::move(resource_request), options); + FetchParameters params(std::move(style_sheet_resource_request), options); ResourceClient* resource_client = MakeGarbageCollected<ResourceClient>(this); // Prevent garbage collection by holding a reference to this resource.
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc index 461ae6d..2999c84 100644 --- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc +++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
@@ -653,9 +653,9 @@ } } - for (wtf_size_t i = 0; i < n; ++i) { - delete[] diff[i]; - delete[] backtrack[i]; + for (wtf_size_t idx = 0; idx < n; ++idx) { + delete[] diff[idx]; + delete[] backtrack[idx]; } delete[] diff; delete[] backtrack;
diff --git a/third_party/blink/renderer/core/inspector/main_thread_debugger.cc b/third_party/blink/renderer/core/inspector/main_thread_debugger.cc index fd16915..f4ad73f 100644 --- a/third_party/blink/renderer/core/inspector/main_thread_debugger.cc +++ b/third_party/blink/renderer/core/inspector/main_thread_debugger.cc
@@ -472,12 +472,12 @@ v8::Local<v8::Context> context = isolate->GetCurrentContext(); v8::Local<v8::Array> nodes = v8::Array::New(isolate); wtf_size_t index = 0; - while (Node* node = result->iterateNext(exception_state)) { + while (Node* next_node = result->iterateNext(exception_state)) { if (exception_state.HadException()) return; if (!CreateDataPropertyInArray( context, nodes, index++, - ToV8(node, info.Holder(), info.GetIsolate())) + ToV8(next_node, info.Holder(), info.GetIsolate())) .FromMaybe(false)) return; }
diff --git a/third_party/blink/renderer/core/inspector/thread_debugger.cc b/third_party/blink/renderer/core/inspector/thread_debugger.cc index 5a3ef50..36d1292 100644 --- a/third_party/blink/renderer/core/inspector/thread_debugger.cc +++ b/third_party/blink/renderer/core/inspector/thread_debugger.cc
@@ -396,14 +396,14 @@ // static void ThreadDebugger::GetEventListenersCallback( - const v8::FunctionCallbackInfo<v8::Value>& info) { - if (info.Length() < 1) + const v8::FunctionCallbackInfo<v8::Value>& callback_info) { + if (callback_info.Length() < 1) return; ThreadDebugger* debugger = static_cast<ThreadDebugger*>( - v8::Local<v8::External>::Cast(info.Data())->Value()); + v8::Local<v8::External>::Cast(callback_info.Data())->Value()); DCHECK(debugger); - v8::Isolate* isolate = info.GetIsolate(); + v8::Isolate* isolate = callback_info.GetIsolate(); v8::Local<v8::Context> context = isolate->GetCurrentContext(); int group_id = debugger->ContextGroupId(ToExecutionContext(context)); @@ -412,8 +412,8 @@ // listener compilation. if (group_id) debugger->muteMetrics(group_id); - InspectorDOMDebuggerAgent::EventListenersInfoForTarget(isolate, info[0], - &listener_info); + InspectorDOMDebuggerAgent::EventListenersInfoForTarget( + isolate, callback_info[0], &listener_info); if (group_id) debugger->unmuteMetrics(group_id); @@ -449,7 +449,7 @@ CreateDataPropertyInArray(context, listeners, output_index++, listener_object); } - info.GetReturnValue().Set(result); + callback_info.GetReturnValue().Set(result); } void ThreadDebugger::consoleTime(const v8_inspector::StringView& title) {
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc index 3f7cce0c..9fe493a 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc
@@ -270,9 +270,7 @@ FloatRect LayoutSVGResourceClipper::ResourceBoundingBox( const FloatRect& reference_box) { NOT_DESTROYED(); - // The resource has not been layouted yet. Return the reference box. - if (SelfNeedsLayout()) - return reference_box; + DCHECK(!NeedsLayout()); if (local_clip_bounds_.IsEmpty()) CalculateLocalClipBounds();
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_masker.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_masker.cc index 7603a92d..8db115d8 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_masker.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_masker.cc
@@ -105,6 +105,7 @@ const FloatRect& reference_box, float reference_box_zoom) { NOT_DESTROYED(); + DCHECK(!NeedsLayout()); auto* mask_element = To<SVGMaskElement>(GetElement()); DCHECK(mask_element); @@ -117,10 +118,6 @@ if (mask_units == SVGUnitTypes::kSvgUnitTypeUserspaceonuse) mask_boundaries.Scale(reference_box_zoom); - // Resource was not layouted yet. Give back clipping rect of the mask. - if (SelfNeedsLayout()) - return mask_boundaries; - if (mask_content_boundaries_.IsEmpty()) CalculateMaskContentVisualRect();
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc index 413309dd5..f6f79dfe 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder_test.cc
@@ -395,6 +395,15 @@ 0% { transform: rotate(-5deg); } 100% { transform: rotate(5deg); } } + .animate-mixed { + width: 100px; + height: 100px; + animation: mixed 1s infinite; + } + @keyframes mixed { + 0% { transform: rotate(-5deg); stroke-dashoffset: 0; } + 100% { transform: rotate(5deg); stroke-dashoffset: 180; } + } </style> <svg id="svg" class="animate"> <rect id="rect" class="animate"/> @@ -402,6 +411,7 @@ <animateMotion dur="10s" repeatCount="indefinite" path="M0,0 L100,100 z"/> </rect> + <rect id="rect-mixed" class="animate-mixed"/> <svg id="embedded-svg" class="animate"/> <foreignObject id="foreign" class="animate"/> <foreignObject id="foreign-zoomed" class="animate" @@ -423,6 +433,9 @@ *GetLayoutObjectByElementId("rect-smil"))); EXPECT_EQ(CompositingReason::kNone, CompositingReasonFinder::DirectReasonsForPaintProperties( + *GetLayoutObjectByElementId("rect-mixed"))); + EXPECT_EQ(CompositingReason::kNone, + CompositingReasonFinder::DirectReasonsForPaintProperties( *GetLayoutObjectByElementId("embedded-svg"))); EXPECT_EQ(CompositingReason::kActiveTransformAnimation, CompositingReasonFinder::DirectReasonsForPaintProperties(
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 7c8d12a..3debb9e5 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -291,14 +291,6 @@ context_storage_.pop_back(); } -bool PrePaintTreeWalk::NeedsEffectiveAllowedTouchActionUpdate( - const LayoutObject& object, - PrePaintTreeWalk::PrePaintTreeWalkContext& context) const { - return context.effective_allowed_touch_action_changed || - object.EffectiveAllowedTouchActionChanged() || - object.DescendantEffectiveAllowedTouchActionChanged(); -} - namespace { bool HasBlockingTouchEventHandler(const LocalFrame& frame, EventTarget& target) {
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h index 57f0272..423cf7a 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.h
@@ -123,9 +123,6 @@ const PrePaintTreeWalkContext&); void UpdateAuxiliaryObjectProperties(const LayoutObject&, PrePaintTreeWalkContext&); - - bool NeedsEffectiveAllowedTouchActionUpdate(const LayoutObject&, - PrePaintTreeWalkContext&) const; // Updates |LayoutObject::InsideBlockingTouchEventHandler|. Also ensures // |PrePaintTreeWalkContext.effective_allowed_touch_action_changed| is set // which will ensure the subtree is updated too.
diff --git a/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc b/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc index 771442e..c0ad9202 100644 --- a/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc +++ b/third_party/blink/renderer/core/paint/scoped_svg_paint_state.cc
@@ -27,6 +27,7 @@ #include "third_party/blink/renderer/core/layout/svg/svg_resources.h" #include "third_party/blink/renderer/core/layout/svg/svg_resources_cache.h" #include "third_party/blink/renderer/core/paint/clip_path_clipper.h" +#include "third_party/blink/renderer/core/paint/svg_mask_painter.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" #include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h" @@ -37,6 +38,8 @@ ClipPathClipper::PaintClipPathAsMaskImage( paint_info_.context, object_, display_item_client_, PhysicalOffset()); } + if (should_paint_mask_) + SVGMaskPainter::Paint(paint_info_.context, object_, display_item_client_); } void ScopedSVGPaintState::ApplyEffects() { @@ -99,7 +102,7 @@ SVGResources* resources = SVGResourcesCache::CachedResourcesForLayoutObject(object_); if (resources && resources->Masker()) - mask_painter_.emplace(paint_info_.context, object_, display_item_client_); + should_paint_mask_ = true; } } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/scoped_svg_paint_state.h b/third_party/blink/renderer/core/paint/scoped_svg_paint_state.h index 7210ed4..830d7f5 100644 --- a/third_party/blink/renderer/core/paint/scoped_svg_paint_state.h +++ b/third_party/blink/renderer/core/paint/scoped_svg_paint_state.h
@@ -28,7 +28,6 @@ #include <memory> #include "third_party/blink/renderer/core/paint/object_paint_properties.h" #include "third_party/blink/renderer/core/paint/paint_info.h" -#include "third_party/blink/renderer/core/paint/svg_mask_painter.h" #include "third_party/blink/renderer/platform/graphics/paint/scoped_paint_chunk_properties.h" #include "third_party/blink/renderer/platform/transforms/affine_transform.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -91,7 +90,7 @@ const PaintInfo& paint_info_; const DisplayItemClient& display_item_client_; base::Optional<ScopedPaintChunkProperties> scoped_paint_chunk_properties_; - base::Optional<SVGMaskPainter> mask_painter_; + bool should_paint_mask_ = false; bool should_paint_clip_path_as_mask_image_ = false; #if DCHECK_IS_ON() bool apply_effects_called_ = false;
diff --git a/third_party/blink/renderer/core/paint/svg_mask_painter.cc b/third_party/blink/renderer/core/paint/svg_mask_painter.cc index e4f2445..6f082aa 100644 --- a/third_party/blink/renderer/core/paint/svg_mask_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_mask_painter.cc
@@ -14,17 +14,10 @@ namespace blink { -SVGMaskPainter::SVGMaskPainter(GraphicsContext& context, - const LayoutObject& layout_object, - const DisplayItemClient& display_item_client) - : context_(context), - layout_object_(layout_object), - display_item_client_(display_item_client) { - DCHECK(layout_object_.StyleRef().SvgStyle().MaskerResource()); -} - -SVGMaskPainter::~SVGMaskPainter() { - const auto* properties = layout_object_.FirstFragment().PaintProperties(); +void SVGMaskPainter::Paint(GraphicsContext& context, + const LayoutObject& layout_object, + const DisplayItemClient& display_item_client) { + const auto* properties = layout_object.FirstFragment().PaintProperties(); // TODO(crbug.com/814815): This condition should be a DCHECK, but for now // we may paint the object for filters during PrePaint before the // properties are ready. @@ -36,45 +29,43 @@ properties->Mask()->LocalTransformSpace(), *properties->MaskClip(), *properties->Mask()); ScopedPaintChunkProperties scoped_paint_chunk_properties( - context_.GetPaintController(), property_tree_state, display_item_client_, + context.GetPaintController(), property_tree_state, display_item_client, DisplayItem::kSVGMask); - if (DrawingRecorder::UseCachedDrawingIfPossible( - context_, display_item_client_, DisplayItem::kSVGMask)) + if (DrawingRecorder::UseCachedDrawingIfPossible(context, display_item_client, + DisplayItem::kSVGMask)) return; FloatRect visual_rect = properties->MaskClip()->UnsnappedClipRect().Rect(); - visual_rect.Intersect(layout_object_.VisualRectInLocalSVGCoordinates()); - DrawingRecorder recorder(context_, display_item_client_, - DisplayItem::kSVGMask, + visual_rect.Intersect(layout_object.VisualRectInLocalSVGCoordinates()); + DrawingRecorder recorder(context, display_item_client, DisplayItem::kSVGMask, EnclosingIntRect(visual_rect)); - const SVGComputedStyle& svg_style = layout_object_.StyleRef().SvgStyle(); + const SVGComputedStyle& svg_style = layout_object.StyleRef().SvgStyle(); auto* masker = GetSVGResourceAsType<LayoutSVGResourceMasker>(svg_style.MaskerResource()); DCHECK(masker); SECURITY_DCHECK(!masker->NeedsLayout()); masker->ClearInvalidationMask(); - FloatRect reference_box = - SVGResources::ReferenceBoxForEffects(layout_object_); + FloatRect reference_box = SVGResources::ReferenceBoxForEffects(layout_object); AffineTransform content_transformation; if (masker->MaskContentUnits() == SVGUnitTypes::kSvgUnitTypeObjectboundingbox) { content_transformation.Translate(reference_box.X(), reference_box.Y()); content_transformation.ScaleNonUniform(reference_box.Width(), reference_box.Height()); - } else if (layout_object_.IsSVGForeignObject()) { - content_transformation.Scale(layout_object_.StyleRef().EffectiveZoom()); + } else if (layout_object.IsSVGForeignObject()) { + content_transformation.Scale(layout_object.StyleRef().EffectiveZoom()); } sk_sp<const PaintRecord> record = - masker->CreatePaintRecord(content_transformation, context_); + masker->CreatePaintRecord(content_transformation, context); - context_.Save(); - context_.ConcatCTM(content_transformation); - context_.DrawRecord(std::move(record)); - context_.Restore(); + context.Save(); + context.ConcatCTM(content_transformation); + context.DrawRecord(std::move(record)); + context.Restore(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/svg_mask_painter.h b/third_party/blink/renderer/core/paint/svg_mask_painter.h index d7f37cd..fbc99c03 100644 --- a/third_party/blink/renderer/core/paint/svg_mask_painter.h +++ b/third_party/blink/renderer/core/paint/svg_mask_painter.h
@@ -14,18 +14,12 @@ class LayoutObject; class SVGMaskPainter { - STACK_ALLOCATED(); + STATIC_ONLY(SVGMaskPainter); public: - SVGMaskPainter(GraphicsContext&, - const LayoutObject&, - const DisplayItemClient&); - ~SVGMaskPainter(); - - private: - GraphicsContext& context_; - const LayoutObject& layout_object_; - const DisplayItemClient& display_item_client_; + static void Paint(GraphicsContext& context, + const LayoutObject& layout_object, + const DisplayItemClient& display_item_client); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/style/content_data.h b/third_party/blink/renderer/core/style/content_data.h index 7f35df6..486b325 100644 --- a/third_party/blink/renderer/core/style/content_data.h +++ b/third_party/blink/renderer/core/style/content_data.h
@@ -175,7 +175,7 @@ private: ContentData* CloneInternal() const override { - return MakeGarbageCollected<TextContentData>(GetText()); + return MakeGarbageCollected<AltTextContentData>(GetText()); } String text_; };
diff --git a/third_party/blink/renderer/core/svg/svg_element.cc b/third_party/blink/renderer/core/svg/svg_element.cc index ae56b0d..1d700e7 100644 --- a/third_party/blink/renderer/core/svg/svg_element.cc +++ b/third_party/blink/renderer/core/svg/svg_element.cc
@@ -267,13 +267,52 @@ }); } -bool SVGElement::HasMainThreadAnimations() const { - if (!HasSVGRareData()) +// TODO(crbug.com/1134652): For now composited animation doesn't work for SVG +// if the animation also has properties other than the supported ones. We should +// remove this when we make SVG CSS animations work in the same way as other +// elements. +static PropertyHandleSet SupportedCompositedAnimationProperties() { + DEFINE_STATIC_LOCAL(PropertyHandleSet, supported_properties, + ({PropertyHandle(GetCSSPropertyOpacity()), + PropertyHandle(GetCSSPropertyTransform()), + PropertyHandle(GetCSSPropertyRotate()), + PropertyHandle(GetCSSPropertyScale()), + PropertyHandle(GetCSSPropertyTranslate()), + PropertyHandle(GetCSSPropertyFilter()), + PropertyHandle(GetCSSPropertyBackdropFilter())})); + return supported_properties; +} + +static bool HasMainThreadAnimationProperty(const AnimationEffect* effect) { + const KeyframeEffectModelBase* model = nullptr; + if (auto* keyframe_effect = DynamicTo<KeyframeEffect>(effect)) + model = DynamicTo<KeyframeEffectModelBase>(keyframe_effect->Model()); + else if (auto* inert_effect = DynamicTo<InertEffect>(effect)) + model = DynamicTo<KeyframeEffectModelBase>(inert_effect->Model()); + if (!model) return false; - if (!SvgRareData()->WebAnimatedAttributes().IsEmpty()) + for (auto& property : model->Properties()) { + if (!SupportedCompositedAnimationProperties().Contains(property)) + return true; + } + return false; +} + +bool SVGElement::HasMainThreadAnimations() const { + if (HasSVGRareData() && !SvgRareData()->WebAnimatedAttributes().IsEmpty()) return true; if (GetSMILAnimations() && GetSMILAnimations()->HasAnimations()) return true; + if (auto* element_animations = GetElementAnimations()) { + for (auto& entry : element_animations->Animations()) { + if (HasMainThreadAnimationProperty(entry.key->effect())) + return true; + } + for (auto& entry : element_animations->GetWorkletAnimations()) { + if (HasMainThreadAnimationProperty(entry->GetEffect())) + return true; + } + } return false; }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc index 8328f276..780b1187 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_inline_text_box.cc
@@ -239,6 +239,16 @@ Vector<AXRange>* marker_ranges) const { if (IsDetached()) return; + if (!GetDocument() || + GetDocument()->IsSlotAssignmentOrLegacyDistributionDirty()) { + // In order to retrieve the document markers we need access to the flat + // tree. If the slot assignments in a shadow DOM subtree are dirty, + // accessing the flat tree will cause them to be updated, which could in + // turn cause an update to the accessibility tree, potentially causing this + // method to be called repeatedly. + return; // Wait until distribution for flat tree traversal has been + // updated. + } int text_length = TextLength(); if (!text_length)
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc index e4857d1..aada1fae 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -445,21 +445,15 @@ if (!GetDocument()) return false; - Element* focused_element = GetDocument()->FocusedElement(); - if (!focused_element) - return false; - AXObject* focused_object = AXObjectCache().GetOrCreate(focused_element); - if (!IsA<AXLayoutObject>(focused_object)) - return false; - // A web area is represented by the Document node in the DOM tree, which isn't - // focusable. Check instead if the frame's selection controller is focused - if (focused_object == this || - (RoleValue() == ax::mojom::blink::Role::kRootWebArea && - GetDocument()->GetFrame()->Selection().FrameIsFocusedAndActive())) + // focusable. Check instead if the frame's selection controller is focused. + if (IsWebArea() && + GetDocument()->GetFrame()->Selection().FrameIsFocusedAndActive()) { return true; + } - return false; + Element* focused_element = GetDocument()->FocusedElement(); + return focused_element && focused_element == GetElement(); } // aria-grabbed is deprecated in WAI-ARIA 1.1.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index ad3c433..4f0c789 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1120,7 +1120,7 @@ } } - PostNotification(obj, ax::mojom::Event::kTextChanged); + MarkAXObjectDirty(obj, /*subtree=*/false); } if (optional_node_for_relation_update) @@ -2404,8 +2404,9 @@ SCOPED_DISALLOW_LIFECYCLE_TRANSITION(*frame_view->GetFrame().GetDocument()); InvalidateBoundingBoxForFixedOrStickyPosition(); + MarkElementDirty(document_, false); DeferTreeUpdate(&AXObjectCacheImpl::EnsurePostNotification, document_, - ax::mojom::blink::Event::kScrollPositionChanged); + ax::mojom::blink::Event::kLayoutComplete); } void AXObjectCacheImpl::HandleScrollPositionChanged( @@ -2414,8 +2415,9 @@ InvalidateBoundingBoxForFixedOrStickyPosition(); Node* node = GetClosestNodeForLayoutObject(layout_object); if (node) { + MarkElementDirty(node, false); DeferTreeUpdate(&AXObjectCacheImpl::EnsurePostNotification, node, - ax::mojom::blink::Event::kScrollPositionChanged); + ax::mojom::blink::Event::kLayoutComplete); } }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position.cc b/third_party/blink/renderer/modules/accessibility/ax_position.cc index d346db9..90dbe5c 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_position.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_position.cc
@@ -763,15 +763,15 @@ (child && (!child->GetNode() || child->GetNode()->IsMarkerPseudoElement() || child->IsMockObject() || child->IsVirtualObject()))) { - switch (adjustment_behavior) { - case AXPositionAdjustmentBehavior::kMoveRight: - return CreateNextPosition().AsValidDOMPosition(adjustment_behavior); - case AXPositionAdjustmentBehavior::kMoveLeft: - const AXPosition result = CreatePreviousPosition(); - if (result && result != *this) - return result.AsValidDOMPosition(adjustment_behavior); - return {}; - } + AXPosition result; + if (adjustment_behavior == AXPositionAdjustmentBehavior::kMoveRight) + result = CreateNextPosition(); + else + result = CreatePreviousPosition(); + + if (result && result != *this) + return result.AsValidDOMPosition(adjustment_behavior); + return {}; } // At this point, if a DOM node is associated with our container, then the
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc index 36480b9..aecb4f8 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.cc
@@ -294,7 +294,7 @@ GetReverseRelated(node, related_sources); for (AXObject* related : related_sources) { if (related) - TextChanged(related); + object_cache_->MarkAXObjectDirty(related, /*subtree=*/false); } // Forward relation via <label for="[id]">. @@ -331,10 +331,6 @@ object->ChildrenChanged(); } -void AXRelationCache::TextChanged(AXObject* object) { - object_cache_->PostNotification(object, ax::mojom::Event::kTextChanged); -} - void AXRelationCache::LabelChanged(Node* node) { const auto& id = To<HTMLElement>(node)->FastGetAttribute(html_names::kForAttr); @@ -342,7 +338,7 @@ all_previously_seen_label_target_ids_.insert(id); if (auto* control = To<HTMLLabelElement>(node)->control()) { if (AXObject* obj = Get(control)) - TextChanged(obj); + object_cache_->MarkAXObjectDirty(obj, /*subtree=*/false); } } }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h index 591ffc9d..6833bca 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h +++ b/third_party/blink/renderer/modules/accessibility/ax_relation_cache.h
@@ -126,7 +126,6 @@ AXObject* GetOrCreate(Node*); AXObject* Get(Node*); void ChildrenChanged(AXObject*); - void TextChanged(AXObject*); DISALLOW_COPY_AND_ASSIGN(AXRelationCache); };
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc index 3dedcae..c3550ee 100644 --- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc +++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -134,6 +134,10 @@ EXPECT_EQ(delegate_id_, delegate_id); } + void DidSeek(int delegate_id) override { + EXPECT_EQ(delegate_id_, delegate_id); + } + void PlayerGone(int delegate_id) override { EXPECT_EQ(delegate_id_, delegate_id); is_gone_ = true;
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc index 700b3a7..7ae0745 100644 --- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc +++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
@@ -25,59 +25,52 @@ return MakeGarbageCollected<Sanitizer>(config); } -Sanitizer::Sanitizer(const SanitizerConfig* config) - : config_(const_cast<SanitizerConfig*>(config)) { +Sanitizer::Sanitizer(const SanitizerConfig* config) { // Format dropElements to uppercase. - Vector<String> drop_elements = default_drop_elements_; + drop_elements_ = default_drop_elements_; if (config->hasDropElements()) { for (const String& s : config->dropElements()) { - const String& upper_s = s.UpperASCII(); - if (!drop_elements.Contains(upper_s)) { - drop_elements.push_back(upper_s); - } + drop_elements_.insert(s.UpperASCII()); } } - config_->setDropElements(drop_elements); // Format blockElements to uppercase. - Vector<String> block_elements = default_block_elements_; + block_elements_ = default_block_elements_; if (config->hasBlockElements()) { for (const String& s : config->blockElements()) { const String& upper_s = s.UpperASCII(); - if (!drop_elements.Contains(upper_s) && - !block_elements.Contains(upper_s)) { - block_elements.push_back(upper_s); + if (!drop_elements_.Contains(upper_s)) { + block_elements_.insert(upper_s); } } } - config_->setBlockElements(block_elements); if (config->hasAllowElements()) { // Format allowElements to uppercase. - Vector<String> l; + has_allow_elements_ = true; for (const String& s : config->allowElements()) { - if (!config_->dropElements().Contains(s)) - l.push_back(s.UpperASCII()); + const String& upper = s.UpperASCII(); + if (!drop_elements_.Contains(upper) && + !default_block_elements_.Contains(upper)) + allow_elements_.insert(upper); } - config_->setAllowElements(l); } // Format dropAttributes to lowercase. drop_attributes_ = default_drop_attributes_; if (config->hasDropAttributes()) { for (const String& s : config->dropAttributes()) { - drop_attributes_.push_back(WTF::AtomicString(s.LowerASCII())); + drop_attributes_.insert(s.LowerASCII()); } } if (config->hasAllowAttributes()) { - Vector<String> l; + has_allow_attributes_ = true; for (const String& s : config->allowAttributes()) { const String& lower_s = s.LowerASCII(); if (!default_drop_attributes_.Contains(lower_s) && !default_block_elements_.Contains(lower_s)) - l.push_back(lower_s); + allow_attributes_.insert(lower_s); } - config_->setAllowAttributes(l); } } @@ -117,14 +110,12 @@ String node_name = node->nodeName().UpperASCII(); // If the current element is dropped, remove current element entirely and // proceed to its next sibling. - if (config_->dropElements().Contains(node_name)) { + if (drop_elements_.Contains(node_name)) { Node* tmp = node; node = NodeTraversal::NextSkippingChildren(*node, fragment); tmp->remove(); - } else if ((config_->hasBlockElements() && - config_->blockElements().Contains(node_name)) || - (config_->hasAllowElements() && - !config_->allowElements().Contains(node_name))) { + } else if (block_elements_.Contains(node_name) || + (has_allow_elements_ && !allow_elements_.Contains(node_name))) { // If the current element is blocked, append its children after current // node to parent node, remove current element and proceed to the next // node. @@ -150,9 +141,9 @@ // traversal). Element* element = To<Element>(node); for (const auto& name : element->getAttributeNames()) { - bool drop = drop_attributes_.Contains(name) || - (config_->hasAllowAttributes() && - !config_->allowAttributes().Contains(name)); + bool drop = + drop_attributes_.Contains(name) || + (has_allow_attributes_ && !allow_attributes_.Contains(name)); if (drop) element->removeAttribute(name); } @@ -165,7 +156,6 @@ void Sanitizer::Trace(Visitor* visitor) const { ScriptWrappable::Trace(visitor); - visitor->Trace(config_); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h index cc91416..eca670d7 100644 --- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h +++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
@@ -30,26 +30,29 @@ void Trace(Visitor*) const override; private: - // TODO(lyf): Make config_ read-only. The creationOptions getter which - // asks for the pointer is forbidened by a read-only variable. - // TODO(lyf): This could be optimized by dropping config_ and adding - // Vector<QualifiedName> for drop_elements. - Member<SanitizerConfig> config_ = {}; - Vector<AtomicString> drop_attributes_ = {}; - const Vector<String> default_drop_elements_ = {"SCRIPT", "ANNOTATION-XML", - "AUDIO", "COLGROUP", - "DESC", "FOREIGNOBJECT", - "HEAD", "IFRAME", - "MATH", "MI", - "MN", "MO", - "MS", "MTEXT", - "NOEMBED", "NOFRAMES", - "PLAINTEXT", "STYLE", - "SVG", "TEMPLATE", - "THEAD", "TITLE", - "VIDEO", "XMP"}; - const Vector<String> default_block_elements_ = {}; - const Vector<AtomicString> default_drop_attributes_ = {"onclick", "onsubmit"}; + HashSet<String> allow_elements_ = {}; + HashSet<String> block_elements_ = {}; + HashSet<String> drop_elements_ = {}; + HashSet<String> allow_attributes_; + HashSet<String> drop_attributes_ = {}; + + bool has_allow_elements_ = false; + bool has_allow_attributes_ = false; + + const HashSet<String> default_block_elements_ = {}; + const HashSet<String> default_drop_elements_ = {"SCRIPT", "ANNOTATION-XML", + "AUDIO", "COLGROUP", + "DESC", "FOREIGNOBJECT", + "HEAD", "IFRAME", + "MATH", "MI", + "MN", "MO", + "MS", "MTEXT", + "NOEMBED", "NOFRAMES", + "PLAINTEXT", "STYLE", + "SVG", "TEMPLATE", + "THEAD", "TITLE", + "VIDEO", "XMP"}; + const HashSet<String> default_drop_attributes_ = {"onclick", "onsubmit"}; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame.cc b/third_party/blink/renderer/modules/webcodecs/video_frame.cc index 755aac6..20d8812 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame.cc
@@ -12,6 +12,7 @@ #include "media/base/timestamp_constants.h" #include "media/base/video_frame.h" #include "media/base/video_frame_metadata.h" +#include "media/base/wait_and_replace_sync_token_client.h" #include "media/renderers/paint_canvas_video_renderer.h" #include "media/renderers/video_frame_yuv_converter.h" #include "third_party/blink/public/platform/platform.h" @@ -377,6 +378,8 @@ } else { scoped_refptr<viz::RasterContextProvider> raster_context_provider = Platform::Current()->SharedMainThreadContextProvider(); + auto* ri = raster_context_provider->RasterInterface(); + gpu::SharedImageInterface* shared_image_interface = raster_context_provider->SharedImageInterface(); uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2; @@ -397,8 +400,7 @@ media::VideoFrameYUVConverter::ConvertYUVVideoFrameNoCaching( local_frame.get(), raster_context_provider.get(), dest_holder); gpu::SyncToken sync_token; - raster_context_provider->RasterInterface() - ->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); + ri->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); auto release_callback = viz::SingleReleaseCallback::Create(base::BindOnce( [](gpu::SharedImageInterface* sii, gpu::Mailbox mailbox, @@ -416,6 +418,13 @@ SharedGpuContext::ContextProviderWrapper(), base::PlatformThread::CurrentRef(), Thread::Current()->GetTaskRunner(), std::move(release_callback)); + + if (local_frame->HasTextures()) { + // Attach a new sync token to |local_frame|, so it's not destroyed + // before |image| is fully created. + media::WaitAndReplaceSyncTokenClient client(ri); + local_frame->UpdateReleaseSyncToken(&client); + } } ImageBitmap* image_bitmap =
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc index 5a8dab0..82eb49b 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.cc +++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -307,11 +307,9 @@ mojo::PendingReceiver<device::mojom::blink::XRSessionClient> client_receiver, device::mojom::blink::XRSessionMode mode, - EnvironmentBlendMode environment_blend_mode, - InteractionMode interaction_mode, - bool uses_input_eventing, - float default_framebuffer_scale, - bool supports_viewport_scaling, + device::mojom::blink::XREnvironmentBlendMode environment_blend_mode, + device::mojom::blink::XRInteractionMode interaction_mode, + device::mojom::blink::XRSessionDeviceConfigPtr device_config, bool sensorless_session, XRSessionFeatureSet enabled_features) : xr_(xr), @@ -326,8 +324,8 @@ callback_collection_( MakeGarbageCollected<XRFrameRequestCallbackCollection>( xr->GetExecutionContext())), - uses_input_eventing_(uses_input_eventing), - supports_viewport_scaling_(supports_viewport_scaling), + uses_input_eventing_(device_config->uses_input_eventing), + supports_viewport_scaling_(device_config->supports_viewport_scaling), sensorless_session_(sensorless_session) { client_receiver_.Bind( std::move(client_receiver), @@ -337,9 +335,9 @@ UpdateVisibilityState(); // Clamp to a reasonable min/max size for the default framebuffer scale. - default_framebuffer_scale_ = - base::ClampToRange(default_framebuffer_scale, kMinDefaultFramebufferScale, - kMaxDefaultFramebufferScale); + default_framebuffer_scale_ = base::ClampToRange( + device_config->default_framebuffer_scale, kMinDefaultFramebufferScale, + kMaxDefaultFramebufferScale); world_tracking_state_ = MakeGarbageCollected<XRWorldTrackingState>( IsFeatureEnabled(device::mojom::XRSessionFeature::PLANE_DETECTION)); @@ -348,13 +346,13 @@ << ": supports_viewport_scaling_=" << supports_viewport_scaling_; switch (environment_blend_mode) { - case kBlendModeOpaque: + case device::mojom::blink::XREnvironmentBlendMode::kOpaque: blend_mode_string_ = "opaque"; break; - case kBlendModeAdditive: + case device::mojom::blink::XREnvironmentBlendMode::kAdditive: blend_mode_string_ = "additive"; break; - case kBlendModeAlphaBlend: + case device::mojom::blink::XREnvironmentBlendMode::kAlphaBlend: blend_mode_string_ = "alpha-blend"; break; default: @@ -363,10 +361,10 @@ } switch (interaction_mode) { - case kInteractionModeScreen: + case device::mojom::blink::XRInteractionMode::kScreenSpace: interaction_mode_string_ = "screen-space"; break; - case kInteractionModeWorld: + case device::mojom::blink::XRInteractionMode::kWorldSpace: interaction_mode_string_ = "world-space"; break; }
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h index 34976779..59a0d670 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.h +++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -86,14 +86,6 @@ // they are run in the same turn of the render loop. using ExecuteVfcCallback = base::OnceCallback<void(double)>; - enum EnvironmentBlendMode { - kBlendModeOpaque = 0, - kBlendModeAdditive, - kBlendModeAlphaBlend - }; - - enum InteractionMode { kInteractionModeScreen = 0, kInteractionModeWorld }; - struct MetricsReporter { explicit MetricsReporter( mojo::Remote<device::mojom::blink::XRSessionMetricsRecorder> recorder); @@ -114,11 +106,9 @@ mojo::PendingReceiver<device::mojom::blink::XRSessionClient> client_receiver, device::mojom::blink::XRSessionMode mode, - EnvironmentBlendMode environment_blend_mode, - InteractionMode interaction_mode, - bool uses_input_eventing, - float default_framebuffer_scale, - bool supports_viewport_scaling, + device::mojom::blink::XREnvironmentBlendMode environment_blend_mode, + device::mojom::blink::XRInteractionMode interaction_mode, + device::mojom::blink::XRSessionDeviceConfigPtr device_config, bool sensorless_session, XRSessionFeatureSet enabled_features); ~XRSession() override = default;
diff --git a/third_party/blink/renderer/modules/xr/xr_system.cc b/third_party/blink/renderer/modules/xr/xr_system.cc index c70a19b..f662d7b 100644 --- a/third_party/blink/renderer/modules/xr/xr_system.cc +++ b/third_party/blink/renderer/modules/xr/xr_system.cc
@@ -1403,20 +1403,6 @@ DVLOG(2) << __func__ << ": environment_integration=" << environment_integration; - // TODO(https://crbug.com/944936): The blend mode could be "additive". - XRSession::EnvironmentBlendMode blend_mode = XRSession::kBlendModeOpaque; - if (environment_integration) - blend_mode = XRSession::kBlendModeAlphaBlend; - - // TODO(https://crbug.com/1069350): The runtime should be the one to - // communicate the interaction mode, but for the moment we're going to use - // session mode and assume all AR is phone AR. - XRSession::InteractionMode interaction_mode = - XRSession::kInteractionModeWorld; - if (query->mode() == device::mojom::blink::XRSessionMode::kInline || - query->mode() == device::mojom::blink::XRSessionMode::kImmersiveAr) - interaction_mode = XRSession::kInteractionModeScreen; - XRSessionFeatureSet enabled_features; for (const auto& feature : session_ptr->enabled_features) { DVLOG(2) << __func__ << ": feature " << feature << " will be enabled"; @@ -1424,11 +1410,10 @@ } XRSession* session = CreateSession( - query->mode(), blend_mode, interaction_mode, - std::move(session_ptr->client_receiver), - std::move(session_ptr->display_info), session_ptr->uses_input_eventing, - session_ptr->default_framebuffer_scale, - session_ptr->supports_viewport_scaling, enabled_features); + query->mode(), session_ptr->enviroment_blend_mode, + session_ptr->interaction_mode, std::move(session_ptr->client_receiver), + std::move(session_ptr->display_info), + std::move(session_ptr->device_config), enabled_features); frameProvider()->OnSessionStarted(session, std::move(session_ptr)); @@ -1527,20 +1512,18 @@ // A session is always created and returned. XRSession* XRSystem::CreateSession( device::mojom::blink::XRSessionMode mode, - XRSession::EnvironmentBlendMode blend_mode, - XRSession::InteractionMode interaction_mode, + device::mojom::blink::XREnvironmentBlendMode blend_mode, + device::mojom::blink::XRInteractionMode interaction_mode, mojo::PendingReceiver<device::mojom::blink::XRSessionClient> client_receiver, device::mojom::blink::VRDisplayInfoPtr display_info, - bool uses_input_eventing, - float default_framebuffer_scale, - bool supports_viewport_scaling, + device::mojom::blink::XRSessionDeviceConfigPtr device_config, XRSessionFeatureSet enabled_features, bool sensorless_session) { XRSession* session = MakeGarbageCollected<XRSession>( this, std::move(client_receiver), mode, blend_mode, interaction_mode, - uses_input_eventing, default_framebuffer_scale, supports_viewport_scaling, - sensorless_session, std::move(enabled_features)); + std::move(device_config), sensorless_session, + std::move(enabled_features)); if (display_info) session->SetXRDisplayInfo(std::move(display_info)); sessions_.insert(session); @@ -1549,17 +1532,18 @@ XRSession* XRSystem::CreateSensorlessInlineSession() { // TODO(https://crbug.com/944936): The blend mode could be "additive". - XRSession::EnvironmentBlendMode blend_mode = XRSession::kBlendModeOpaque; - XRSession::InteractionMode interaction_mode = - XRSession::kInteractionModeScreen; - return CreateSession( - device::mojom::blink::XRSessionMode::kInline, blend_mode, - interaction_mode, mojo::NullReceiver() /* client receiver */, - nullptr /* display_info */, false /* uses_input_eventing */, - 1.0 /* default_framebuffer_scale */, - false /* supports_viewport_scaling */, - {device::mojom::XRSessionFeature::REF_SPACE_VIEWER}, - true /* sensorless_session */); + device::mojom::blink::XREnvironmentBlendMode blend_mode = + device::mojom::blink::XREnvironmentBlendMode::kOpaque; + device::mojom::blink::XRInteractionMode interaction_mode = + device::mojom::blink::XRInteractionMode::kScreenSpace; + device::mojom::blink::XRSessionDeviceConfigPtr device_config = + device::mojom::blink::XRSessionDeviceConfig::New(); + return CreateSession(device::mojom::blink::XRSessionMode::kInline, blend_mode, + interaction_mode, + mojo::NullReceiver() /* client receiver */, + nullptr /* display_info */, std::move(device_config), + {device::mojom::XRSessionFeature::REF_SPACE_VIEWER}, + true /* sensorless_session */); } void XRSystem::Dispose(DisposeType dispose_type) {
diff --git a/third_party/blink/renderer/modules/xr/xr_system.h b/third_party/blink/renderer/modules/xr/xr_system.h index 88cbe1a..a9a71a1 100644 --- a/third_party/blink/renderer/modules/xr/xr_system.h +++ b/third_party/blink/renderer/modules/xr/xr_system.h
@@ -388,14 +388,12 @@ XRSession* CreateSession( device::mojom::blink::XRSessionMode mode, - XRSession::EnvironmentBlendMode blend_mode, - XRSession::InteractionMode interaction_mode, + device::mojom::blink::XREnvironmentBlendMode blend_mode, + device::mojom::blink::XRInteractionMode interaction_mode, mojo::PendingReceiver<device::mojom::blink::XRSessionClient> client_receiver, device::mojom::blink::VRDisplayInfoPtr display_info, - bool uses_input_eventing, - float default_framebuffer_scale, - bool supports_viewport_scaling, + device::mojom::blink::XRSessionDeviceConfigPtr device_config, XRSessionFeatureSet enabled_features, bool sensorless_session = false);
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc index 7807757..9bda0c8 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -1221,8 +1221,11 @@ void CanvasResourceProvider::OnContextDestroyed() { if (canvas_image_provider_) { - DCHECK(skia_canvas_); - skia_canvas_->reset_image_provider(); + if (!UseOopRasterization()) { + DCHECK(skia_canvas_); + skia_canvas_->reset_image_provider(); + } + canvas_image_provider_.reset(); } }
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 3361c99..be3a9e2 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -145,6 +145,47 @@ virtual/composite-after-paint/scrollingcoordinator/* [ Pass ] # --- End CompositeAfterPaint Tests -- +# --- BEGIN OOP-R Canvas tests --- +crbug.com/1081534 [ Win7 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-clearRect-first.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-clearRect-with-clip.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-clip-stack-persistence.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-fill-repaint.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-createImageBitmap-immutable.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-createImageBitmap-webgl.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-imageSmoothingEnabled-patterns.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-incremental-repaint.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-partial-clearRect.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-partial-invalidation-zoomed.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-path-context-fill.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-state-persistence-no-dirty.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-transform-skewed.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-unbalanced-save.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/color-space/canvas-createImageBitmap-e_srgb.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/color-space/transferFromImageBitmap.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/drawImage-with-globalAlpha.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-2d-drawImage.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-Bitmaprenderer-TransferToImageBitmapResetsToBlack.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-text-FontFace.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/webgl/draw-webgl-to-canvas-2d-after-to-data-url-without-context.html [ Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/webgl/draw-webgl-to-canvas-2d.html [ Failure ] + +# Flakey tests +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-Bitmaprenderer-toBlob-worker.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-clearRect.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-getImageData.html [ Pass Failure ] +crbug.com/1081534 [ Win ] virtual/oopr-canvas2d/fast/canvas/canvas-createImageBitmap-recursive.html [ Pass Failure ] + +# We're rolling these tests out on Windows first, other platforms to follow. When removing [ Skip ] +# for a platform please add the platform tag to the failing tests above. +crbug.com/1081534 [ Android ] virtual/oopr-canvas2d/* [ Skip ] +crbug.com/1081534 [ Fuchsia ] virtual/oopr-canvas2d/* [ Skip ] +crbug.com/1081534 [ Linux ] virtual/oopr-canvas2d/* [ Skip ] +crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/* [ Skip ] +# --- END OOP-R Canvas Tests + # Sheriff on 2020-09-03 crbug.com/1124352 media/picture-in-picture/clear-after-request.html [ Crash Pass ] crbug.com/1124352 media/picture-in-picture/controls/picture-in-picture-button.html [ Crash Pass ] @@ -344,11 +385,20 @@ crbug.com/997202 external/wpt/css/css-images/image-orientation/image-orientation-background-position.html [ Failure ] crbug.com/997202 external/wpt/css/css-images/image-orientation/image-orientation-background-properties.html [ Failure ] +# These have filtering antialiasing artifacts on one side only, but otherwise are passing. The tests +# should be updated with the fuzzy meta data once enabled in the test driver. +crbug.com/997202 external/wpt/css/css-backgrounds/border-image-slice-007.htm [ Failure ] +crbug.com/997202 external/wpt/css/css-backgrounds/border-image-slice-005.htm [ Failure ] + # Ref results are wrong on the background and list case, not sure on border result crbug.com/1076121 external/wpt/css/css-images/image-orientation/image-orientation-list-style-image.html [ Failure ] crbug.com/1076121 external/wpt/css/css-images/image-orientation/image-orientation-border-image.html [ Failure ] crbug.com/1076121 external/wpt/css/css-images/image-orientation/image-orientation-background-image.html [ Failure ] +# Cross origin failures +crbug.com/1110330 external/wpt/css/css-images/image-orientation/image-orientation-none-cross-origin.html [ Failure ] +crbug.com/1110330 external/wpt/css/css-images/image-orientation/image-orientation-none-cross-origin-canvas.html [ Failure ] + crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-png.html [ Failure ] crbug.com/1042783 external/wpt/css/css-backgrounds/background-size/background-size-near-zero-svg.html [ Failure ] @@ -1188,7 +1238,6 @@ crbug.com/6606 external/wpt/mathml/presentation-markup/tables/table-002.html [ Failure ] crbug.com/6606 external/wpt/mathml/presentation-markup/tables/table-axis-height.html [ Failure ] crbug.com/6606 external/wpt/mathml/relations/css-styling/attribute-mapping-002.html [ Failure ] -crbug.com/6606 external/wpt/mathml/relations/css-styling/displaystyle-011.html [ Failure ] crbug.com/6606 external/wpt/mathml/relations/css-styling/displaystyle-1.html [ Failure ] crbug.com/6606 external/wpt/mathml/relations/css-styling/displaystyle-2.html [ Failure ] crbug.com/6606 external/wpt/mathml/relations/css-styling/ignored-properties-001.html [ Failure Timeout ] @@ -2602,14 +2651,10 @@ crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 external/wpt/css/css-images/image-orientation/image-orientation-none-cross-origin.html [ Failure ] -crbug.com/626703 external/wpt/css/css-images/image-orientation/image-orientation-none-cross-origin-canvas.html [ Failure ] crbug.com/626703 external/wpt/infrastructure/testdriver/actions/iframe.html [ Timeout ] crbug.com/626703 external/wpt/infrastructure/testdriver/actions/crossOrigin.sub.html [ Timeout ] crbug.com/626703 [ Mac11.0 ] external/wpt/html/semantics/embedded-content/media-elements/preserves-pitch.html [ Timeout ] crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-during-and-after-dispatch.tentative.html [ Timeout ] -crbug.com/626703 external/wpt/css/css-backgrounds/border-image-slice-007.htm [ Failure ] -crbug.com/626703 external/wpt/css/css-backgrounds/border-image-slice-005.htm [ Failure ] crbug.com/626703 [ Mac11.0 ] external/wpt/scroll-to-text-fragment/redirects.html [ Timeout ] crbug.com/626703 [ Linux ] external/wpt/mathml/presentation-markup/operators/operator-dictionary-symmetric-005.html [ Failure Crash ] crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-non-collapsed-selection.tentative.html?Backspace [ Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 01630b2..f23590a 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -739,6 +739,14 @@ "--disable-auto-wpt-origin-isolation"] }, { + "prefix": "oopr-canvas2d", + "bases": [ "fast/canvas" ], + "args": [ "--enable-features=CanvasOopRasterization", + "--enable-accelerated-2d-canvas", + "--enable-oop-rasterization", + "--enable-gpu-rasterization" ] + }, + { "prefix": "scroll-unification", "bases": ["fast/scrolling/scrollbars"], "args": ["--enable-features=ScrollUnification",
diff --git a/third_party/blink/web_tests/accessibility/aria-owns-sends-notification.html b/third_party/blink/web_tests/accessibility/aria-owns-sends-notification.html index add3a2a..eaf63d69 100644 --- a/third_party/blink/web_tests/accessibility/aria-owns-sends-notification.html +++ b/third_party/blink/web_tests/accessibility/aria-owns-sends-notification.html
@@ -12,12 +12,16 @@ var testRunner = function*() { assert_equals(axFutureParent.childrenCount, 0); - var notification = yield; - assert_equals(notification, "ChildrenChanged"); - assert_equals(axFutureParent.childrenCount, 1); + var expected_notifications = new Set(); + expected_notifications.add("ChildrenChanged"); + expected_notifications.add("MarkDirty"); - var notification = yield; - assert_equals(notification, "TextChanged"); + while (expected_notifications.size) { + var notification = yield; + expected_notifications.delete(notification); + } + + assert_equals(axFutureParent.childrenCount, 1); }(); testRunner.next(); var listener = function(notification) {
diff --git a/third_party/blink/web_tests/accessibility/scroll-window-horiz-sends-notification.html b/third_party/blink/web_tests/accessibility/scroll-window-horiz-sends-notification.html index 61ef021..7bb45f8 100644 --- a/third_party/blink/web_tests/accessibility/scroll-window-horiz-sends-notification.html +++ b/third_party/blink/web_tests/accessibility/scroll-window-horiz-sends-notification.html
@@ -24,7 +24,7 @@ assert_equals(window.pageXOffset, 0); accessibilityController.addNotificationListener(t.step_func((target, notification) => { - if (target.role == 'AXRole: AXWebArea' && notification == 'ScrollPositionChanged') { + if (target.role == 'AXRole: AXWebArea' && notification == 'LayoutComplete') { console.log('Got notification on web area'); accessibilityController.removeNotificationListener(); assert_equals(window.pageXOffset, 500);
diff --git a/third_party/blink/web_tests/accessibility/scroll-window-sends-notification.html b/third_party/blink/web_tests/accessibility/scroll-window-sends-notification.html index b5387a9..e3dc861 100644 --- a/third_party/blink/web_tests/accessibility/scroll-window-sends-notification.html +++ b/third_party/blink/web_tests/accessibility/scroll-window-sends-notification.html
@@ -25,7 +25,7 @@ assert_equals(window.pageXOffset, 0); accessibilityController.addNotificationListener(t.step_func((target, notification) => { - if (target.role == 'AXRole: AXWebArea' && notification == 'ScrollPositionChanged') { + if (target.role == 'AXRole: AXWebArea' && notification == 'LayoutComplete') { console.log('Got notification on web area'); accessibilityController.removeNotificationListener(); assert_equals(window.pageYOffset, 500);
diff --git a/third_party/blink/web_tests/accessibility/text-change-notification.html b/third_party/blink/web_tests/accessibility/text-change-notification.html index 947ffe5..73b4e9c8 100644 --- a/third_party/blink/web_tests/accessibility/text-change-notification.html +++ b/third_party/blink/web_tests/accessibility/text-change-notification.html
@@ -37,27 +37,31 @@ t.done(); }); - accessibleElementById('aria-label').addNotificationListener(function(notification) { - assert_equals(notification, 'TextChanged'); + accessibleElementById('aria-label').setNotificationListener(function(notification) { + assert_equals(notification, 'MarkDirty'); gotSuccessfulNotification(); + accessibleElementById('aria-label').unsetNotificationListener(); }); document.getElementById('aria-label').setAttribute('aria-label', 'New aria-label'); - accessibleElementById('title').addNotificationListener(function(notification) { - assert_equals(notification, 'TextChanged'); + accessibleElementById('title').setNotificationListener(function(notification) { + assert_equals(notification, 'MarkDirty'); gotSuccessfulNotification(); + accessibleElementById('title').unsetNotificationListener(); }); document.getElementById('title').title = 'New title'; - accessibleElementById('labelledby').addNotificationListener(function(notification) { - assert_equals(notification, 'TextChanged'); + accessibleElementById('labelledby').setNotificationListener(function(notification) { + assert_equals(notification, 'MarkDirty'); gotSuccessfulNotification(); + accessibleElementById('labelledby').unsetNotificationListener(); }); document.getElementById('labelledby').setAttribute('aria-labelledby', 'label2'); - accessibleElementById('labeled').addNotificationListener(function(notification) { - assert_equals(notification, 'TextChanged'); + accessibleElementById('labeled').setNotificationListener(function(notification) { + assert_equals(notification, 'MarkDirty'); gotSuccessfulNotification(); + accessibleElementById('labeled').unsetNotificationListener(); }); document.getElementById('label1').setAttribute('for', 'labeled'); }, "This test ensures that a change to an element's accessible text, even if indirect, sends a notification.");
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/is-where-not.html b/third_party/blink/web_tests/external/wpt/css/selectors/is-where-not.html new file mode 100644 index 0000000..f3d27db --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/selectors/is-where-not.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<title>:is() inside :not()</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<link rel="help" href="https://drafts.csswg.org/selectors-4/#matches"> +<link rel="help" href="https://drafts.csswg.org/selectors/#negation"> + +<main id=main> + <div id=a><div id=d></div></div> + <div id=b><div id=e></div></div> + <div id=c><div id=f></div></div> +</main> + +<script> + function formatElements(elements) { + return elements.map(e => e.id).sort().join(); + } + + // Test that |selector| returns the given elements in #main. + function test_selector(selector, expected) { + test(function() { + let actual = Array.from(main.querySelectorAll(selector)); + assert_equals(formatElements(actual), formatElements(expected)); + }, `${selector} matches expected elements`); + } + + test_selector(':not(:is(#a))', [b, c, d, e, f]); + test_selector(':not(:where(#b))', [a, c, d, e, f]); + test_selector(':not(:where(:root #c))', [a, b, d, e, f]); + test_selector(':not(:is(#a, #b))', [c, d, e, f]); + test_selector(':not(:is(#b div))', [a, b, c, d, f]); + test_selector(':not(:is(#a div, div + div))', [a, e, f]); + test_selector(':not(:is(span))', [a, b, c, d, e, f]); + test_selector(':not(:is(div))', []); + test_selector(':not(:is(*|div))', []); + test_selector(':not(:is(*|*))', []); + test_selector(':not(:is(*))', []); + test_selector(':not(:is(svg|div))', [a, b, c, d, e, f]); + test_selector(':not(:is(:not(div)))', [a, b, c, d, e, f]); + test_selector(':not(:is(span, b, i))', [a, b, c, d, e, f]); + test_selector(':not(:is(span, b, i, div))', []); + test_selector(':not(:is(#b ~ div div, * + #c))', [a, b, d, e]); + test_selector(':not(:is(div > :not(#e)))', [a, b, c, e]); + test_selector(':not(:is(div > :not(:where(#e, #f))))', [a, b, c, e, f]); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/is-where-parsing.html b/third_party/blink/web_tests/external/wpt/css/selectors/is-where-parsing.html index 33cb6ad..b93cbda 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/is-where-parsing.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/is-where-parsing.html
@@ -42,4 +42,7 @@ assert_valid(true, "{}(div) + bar", "Combinators after"); assert_valid(true, "::part(foo):is(:hover)", "After part with simple pseudo-class"); assert_valid(false, "::part(foo):is([attr='value'])", "After part with invalid selector after"); + + assert_valid(true, ":not({}(div))", "Nested inside :not, without combinators"); + assert_valid(true, ":not({}(div .foo))", "Nested inside :not, with combinators"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js index 6b6c41d..a31bdc9 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -341,6 +341,17 @@ "immersive-ar": device.mojom.XRSessionMode.kImmersiveAr, }; + static environmentBlendModeToMojoMap = { + "opaque": device.mojom.XREnvironmentBlendMode.kOpaque, + "alpha-blend": device.mojom.XREnvironmentBlendMode.kAlphaBlend, + "additive": device.mojom.XREnvironmentBlendMode.kAdditive, + }; + + static interactionModeToMojoMap = { + "screen-space": device.mojom.XRInteractionMode.kScreenSpace, + "world-space": device.mojom.XRInteractionMode.kWorldSpace, + }; + constructor(fakeDeviceInit, service) { this.sessionClient_ = new device.mojom.XRSessionClientPtr(); this.presentation_provider_ = new MockXRPresentationProvider(); @@ -419,6 +430,8 @@ } this.defaultFramebufferScale_ = default_framebuffer_scale; + this.enviromentBlendMode_ = this._convertBlendModeToEnum(fakeDeviceInit.environmentBlendMode); + this.interactionMode_ = this._convertInteractionModeToEnum(fakeDeviceInit.interactionMode); // This appropriately handles if the coordinates are null this.setBoundsGeometry(fakeDeviceInit.boundsCoordinates); @@ -441,6 +454,26 @@ return sessionModes.map(mode => this._convertModeToEnum(mode)); } + _convertBlendModeToEnum(blendMode) { + if (blendMode in MockRuntime.environmentBlendModeToMojoMap) { + return MockRuntime.environmentBlendModeToMojoMap[blendMode]; + } else { + if (this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) { + return device.mojom.XREnvironmentBlendMode.kAdditive; + } else if (this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveVr)) { + return device.mojom.XREnvironmentBlendMode.kOpaque; + } + } + } + + _convertInteractionModeToEnum(interactionMode) { + if (interactionMode in MockRuntime.interactionModeToMojoMap) { + return MockRuntime.interactionModeToMojoMap[interactionMode]; + } else { + return device.mojom.XRInteractionMode.kWorldSpace; + } + } + // Test API methods. disconnect() { this.service_.removeRuntime(this); @@ -1016,8 +1049,12 @@ clientReceiver: clientReceiver, displayInfo: this.displayInfo_, enabledFeatures: enabled_features, - defaultFramebufferScale: this.defaultFramebufferScale_, - supportsViewportScaling: true + deviceConfig: { + defaultFramebufferScale: this.defaultFramebufferScale_, + supportsViewportScaling: true + }, + enviromentBlendMode: this.enviromentBlendMode_, + interactionMode: this.interactionMode_ } }); } else {
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-offlineaudiocontext-interface/offlineaudiocontext-detached-execution-context.tentative.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-offlineaudiocontext-interface/offlineaudiocontext-detached-execution-context.tentative.html index ba44829..66d62cf6 100644 --- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-offlineaudiocontext-interface/offlineaudiocontext-detached-execution-context.tentative.html +++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-offlineaudiocontext-interface/offlineaudiocontext-detached-execution-context.tentative.html
@@ -19,7 +19,7 @@ // Use the lowest value possible for the faster test. let context = - new iframe.contentWindow.OfflineAudioContext(1, 1, 3000); + new iframe.contentWindow.OfflineAudioContext(1, 1, 8000); document.body.removeChild(iframe);
diff --git a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html index da2ddc28..28f31da 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html
@@ -21,4 +21,4 @@ assert_in_array(session.environmentBlendMode, ["opaque", "additive"]); }, TRACKED_IMMERSIVE_DEVICE, 'immersive-vr', {}); </script> -</body> +</body> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html new file mode 100644 index 0000000..89cdc80 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html
@@ -0,0 +1,84 @@ +<!DOCTYPE html> +<body> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> + <script src="../resources/webxr_util.js"></script> + <script src="../resources/webxr_test_constants.js"></script> + <canvas></canvas> + <script> + const VR_HMD_DEVICE = { + supportsImmersive: true, + supportedModes: [ "immersive-vr"], + views: VALID_VIEWS, + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "opaque", + interactionMode: "world-space" + }; + xr_session_promise_test( + "Tests interactionMode for an VR_HMD_DEVICE", + (session) => { + assert_equals(session.interactionMode, "world-space"); + }, VR_HMD_DEVICE, 'immersive-vr', {}); + + const VR_SCREEN_DEVICE = { + supportsImmersive: true, + supportedModes: [ "immersive-vr"], + views: VALID_VIEWS, + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "opaque", + interactionMode: "screen-space" + }; + xr_session_promise_test( + "Tests interactionMode for an VR_SCREEN_DEVICE", + (session) => { + assert_equals(session.interactionMode, "screen-space"); + }, VR_SCREEN_DEVICE, 'immersive-vr', {}); + + const AR_HMD_DEVICE = { + supportsImmersive: true, + supportedModes: [ "immersive-ar"], + views: VALID_VIEWS, + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "additive", + interactionMode: "world-space" + }; + xr_session_promise_test( + "Tests interactionMode for an AR_HMD_DEVICE", + (session) => { + assert_equals(session.interactionMode, "world-space"); + }, AR_HMD_DEVICE, 'immersive-ar', {}); + + const AR_SCREEN_DEVICE = { + supportsImmersive: true, + supportedModes: [ "immersive-ar"], + views: VALID_VIEWS, + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "opaque", + interactionMode: "screen-space" + }; + xr_session_promise_test( + "Tests interactionMode for an AR_SCREEN_DEVICE", + (session) => { + assert_equals(session.interactionMode, "screen-space"); + }, AR_SCREEN_DEVICE, 'immersive-ar', {}); + + const INLINE_SCREEN_DEVICE = { + supportsImmersive: true, + supportedModes: [ "inline"], + views: VALID_VIEWS, + viewerOrigin: IDENTITY_TRANSFORM, + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "opaque", + interactionMode: "screen-space" + }; + xr_session_promise_test( + "Tests interactionMode for a INLINE_SCREEN_DEVICE", + (session) => { + assert_equals(session.interactionMode, "screen-space"); + }, INLINE_SCREEN_DEVICE, 'inline', {}); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html index 78a8ba20..250adf9 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html
@@ -39,6 +39,8 @@ views: VALID_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, supportedFeatures: ALL_FEATURES, + environmentBlendMode: "alpha-blend", + interactionMode: "screen-space" }; let testBasicProperties = function(overlayElement, session, fakeDeviceController, t) {
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js index 139ab77..40643d0 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js +++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_test_constants.js
@@ -132,7 +132,9 @@ supportedModes: [ "inline", "immersive-vr"], views: VALID_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, - supportedFeatures: ALL_FEATURES + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "opaque", + interactionMode: "world-space" }; const IMMERSIVE_AR_DEVICE = { @@ -140,7 +142,9 @@ supportedModes: [ "inline", "immersive-ar"], views: VALID_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, - supportedFeatures: ALL_FEATURES + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "additive", + interactionMode: "screen-space" }; const VALID_NON_IMMERSIVE_DEVICE = { @@ -148,7 +152,9 @@ supportedModes: ["inline"], views: NON_IMMERSIVE_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, - supportedFeatures: ALL_FEATURES + supportedFeatures: ALL_FEATURES, + environmentBlendMode: "opaque", + interactionMode: "screen-space" }; const VALID_CONTROLLER = {
diff --git a/third_party/blink/web_tests/fast/layers/scrollable-area-removed-on-scroll-crash.html b/third_party/blink/web_tests/fast/layers/scrollable-area-removed-on-scroll-crash.html index 4ef9a635..3c6e49b 100644 --- a/third_party/blink/web_tests/fast/layers/scrollable-area-removed-on-scroll-crash.html +++ b/third_party/blink/web_tests/fast/layers/scrollable-area-removed-on-scroll-crash.html
@@ -20,7 +20,7 @@ window.jsTestIsAsync = true; accessibilityController.addNotificationListener(function (evt, type) { - if (type != "ScrollPositionChanged") + if (!window.container || type != "LayoutComplete") return; container.parentNode.removeChild(container); setTimeout(function(){
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/images/zoomed-img-size-expected.txt b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/images/zoomed-img-size-expected.txt index f32e948..d935e3e 100644 --- a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/images/zoomed-img-size-expected.txt +++ b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/images/zoomed-img-size-expected.txt
@@ -1,31 +1,18 @@ -Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this. +This is a testharness.js-based test. +FAIL Zoom 1% should not affect width/height of images. assert_equals: zoom: 1% expected 37 but got 67 +PASS Zoom 2% should not affect width/height of images. +PASS Zoom 3% should not affect width/height of images. +PASS Zoom 4% should not affect width/height of images. +PASS Zoom 5% should not affect width/height of images. +PASS Zoom 30% should not affect width/height of images. +PASS Zoom 33% should not affect width/height of images. +PASS Zoom 50% should not affect width/height of images. +PASS Zoom 70% should not affect width/height of images. +PASS Zoom 100% should not affect width/height of images. +PASS Zoom 111% should not affect width/height of images. +PASS Zoom 150% should not affect width/height of images. +PASS Zoom 333% should not affect width/height of images. +PASS Zoom 400% should not affect width/height of images. +PASS Zoom 1234% should not affect width/height of images. +Harness: the test ran to completion. -Zoom 1% FAIL: 66x66 not close enough to 37x33 - -Zoom 2% FAIL: 33x33 not close enough to 37x33 - -Zoom 3% FAIL: 44x22 not close enough to 37x33 - -Zoom 4% FAIL: 33x33 not close enough to 37x33 - -Zoom 5% FAIL: 40x26 not close enough to 37x33 - -Zoom 30% FAIL: 37x33 not close enough to 37x33 - -Zoom 33% FAIL: 36x32 not close enough to 37x33 - -Zoom 50% FAIL: 37x33 not close enough to 37x33 - -Zoom 70% FAIL: 37x33 not close enough to 37x33 - -Zoom 100% PASS: 37x33 - -Zoom 111% PASS: 37x33 - -Zoom 150% PASS: 37x33 - -Zoom 333% PASS: 37x33 - -Zoom 400% PASS: 37x33 - -Zoom 1234% PASS: 37x33
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/virtual/exotic-color-space/images/zoomed-img-size-expected.txt b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/virtual/exotic-color-space/images/zoomed-img-size-expected.txt deleted file mode 100644 index f32e948..0000000 --- a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/virtual/exotic-color-space/images/zoomed-img-size-expected.txt +++ /dev/null
@@ -1,31 +0,0 @@ -Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this. - -Zoom 1% FAIL: 66x66 not close enough to 37x33 - -Zoom 2% FAIL: 33x33 not close enough to 37x33 - -Zoom 3% FAIL: 44x22 not close enough to 37x33 - -Zoom 4% FAIL: 33x33 not close enough to 37x33 - -Zoom 5% FAIL: 40x26 not close enough to 37x33 - -Zoom 30% FAIL: 37x33 not close enough to 37x33 - -Zoom 33% FAIL: 36x32 not close enough to 37x33 - -Zoom 50% FAIL: 37x33 not close enough to 37x33 - -Zoom 70% FAIL: 37x33 not close enough to 37x33 - -Zoom 100% PASS: 37x33 - -Zoom 111% PASS: 37x33 - -Zoom 150% PASS: 37x33 - -Zoom 333% PASS: 37x33 - -Zoom 400% PASS: 37x33 - -Zoom 1234% PASS: 37x33
diff --git a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/virtual/gpu-rasterization/images/zoomed-img-size-expected.txt b/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/virtual/gpu-rasterization/images/zoomed-img-size-expected.txt deleted file mode 100644 index f32e948..0000000 --- a/third_party/blink/web_tests/flag-specific/force-device-scale-factor=1.5/virtual/gpu-rasterization/images/zoomed-img-size-expected.txt +++ /dev/null
@@ -1,31 +0,0 @@ -Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this. - -Zoom 1% FAIL: 66x66 not close enough to 37x33 - -Zoom 2% FAIL: 33x33 not close enough to 37x33 - -Zoom 3% FAIL: 44x22 not close enough to 37x33 - -Zoom 4% FAIL: 33x33 not close enough to 37x33 - -Zoom 5% FAIL: 40x26 not close enough to 37x33 - -Zoom 30% FAIL: 37x33 not close enough to 37x33 - -Zoom 33% FAIL: 36x32 not close enough to 37x33 - -Zoom 50% FAIL: 37x33 not close enough to 37x33 - -Zoom 70% FAIL: 37x33 not close enough to 37x33 - -Zoom 100% PASS: 37x33 - -Zoom 111% PASS: 37x33 - -Zoom 150% PASS: 37x33 - -Zoom 333% PASS: 37x33 - -Zoom 400% PASS: 37x33 - -Zoom 1234% PASS: 37x33
diff --git a/third_party/blink/web_tests/images/zoomed-img-size-expected.txt b/third_party/blink/web_tests/images/zoomed-img-size-expected.txt index 872e920..e1afca2 100644 --- a/third_party/blink/web_tests/images/zoomed-img-size-expected.txt +++ b/third_party/blink/web_tests/images/zoomed-img-size-expected.txt
@@ -1,31 +1,18 @@ -Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this. +This is a testharness.js-based test. +FAIL Zoom 1% should not affect width/height of images. assert_equals: zoom: 1% expected 37 but got 100 +FAIL Zoom 2% should not affect width/height of images. assert_equals: zoom: 2% expected 37 but got 50 +PASS Zoom 3% should not affect width/height of images. +PASS Zoom 4% should not affect width/height of images. +PASS Zoom 5% should not affect width/height of images. +PASS Zoom 30% should not affect width/height of images. +PASS Zoom 33% should not affect width/height of images. +PASS Zoom 50% should not affect width/height of images. +PASS Zoom 70% should not affect width/height of images. +PASS Zoom 100% should not affect width/height of images. +PASS Zoom 111% should not affect width/height of images. +PASS Zoom 150% should not affect width/height of images. +PASS Zoom 333% should not affect width/height of images. +PASS Zoom 400% should not affect width/height of images. +PASS Zoom 1234% should not affect width/height of images. +Harness: the test ran to completion. -Zoom 1% PASS: 100x100 close enough to 37x33 - -Zoom 2% PASS: 50x50 close enough to 37x33 - -Zoom 3% PASS: 33x33 close enough to 37x33 - -Zoom 4% PASS: 25x25 close enough to 37x33 - -Zoom 5% PASS: 40x40 close enough to 37x33 - -Zoom 30% PASS: 36x33 close enough to 37x33 - -Zoom 33% PASS: 36x33 close enough to 37x33 - -Zoom 50% PASS: 38x34 close enough to 37x33 - -Zoom 70% PASS: 37x32 close enough to 37x33 - -Zoom 100% PASS: 37x33 - -Zoom 111% PASS: 37x33 - -Zoom 150% PASS: 37x33 - -Zoom 333% PASS: 37x33 - -Zoom 400% PASS: 37x33 - -Zoom 1234% PASS: 37x33
diff --git a/third_party/blink/web_tests/images/zoomed-img-size.html b/third_party/blink/web_tests/images/zoomed-img-size.html index a118a7e..4ccb480f 100644 --- a/third_party/blink/web_tests/images/zoomed-img-size.html +++ b/third_party/blink/web_tests/images/zoomed-img-size.html
@@ -1,65 +1,43 @@ <!DOCTYPE html> <html> <head> - <script type="text/javascript"> - if (window.testRunner) - testRunner.dumpAsText(); - - function update() { - - // These arrays will become unnecessary if we fix the rounding issues that make us not always report "37x33". - var expectedWidths, expectedHeights; - expectedWidths = [100, 50, 33, 25, 40, 36, 36, 38, 37, 37, 37, 37, 37, 37, 37]; - expectedHeights = [100, 50, 33, 25, 40, 33, 33, 34, 32, 33, 33, 33, 33, 33, 33]; - for (i = 0; i < 15; ++i) { - var oval = document.getElementById('oval' + i); - var status = document.getElementById('status' + i); - var sizes = document.getElementById('sizes' + i); - if ((oval.width == expectedWidths[i]) && (oval.height == expectedHeights[i])) { - status.style.color = "green"; - status.innerHTML = "PASS"; - sizes.innerHTML = oval.width + "x" + oval.height + (((oval.width != 37) || (oval.height != 33)) ? " close enough to 37x33" : ""); - } else { - status.style.color = "red"; - status.innerHTML = "FAIL"; - sizes.innerHTML = oval.width + "x" + oval.height + " not close enough to 37x33"; - } - } - } - window.onload = update; - </script> + <script src="../resources/testharness.js"></script> + <script src="../resources/testharnessreport.js"></script> </head> <body> - <p>Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this.</p> <img id="oval0" src="resources/oval.png" style="zoom: 1%"> - <p>Zoom 1% <span id="status0"></span>: <span id="sizes0"></span></p> <img id="oval1" src="resources/oval.png" style="zoom: 2%"> - <p>Zoom 2% <span id="status1"></span>: <span id="sizes1"></span></p> <img id="oval2" src="resources/oval.png" style="zoom: 3%"> - <p>Zoom 3% <span id="status2"></span>: <span id="sizes2"></span></p> <img id="oval3" src="resources/oval.png" style="zoom: 4%"> - <p>Zoom 4% <span id="status3"></span>: <span id="sizes3"></span></p> <img id="oval4" src="resources/oval.png" style="zoom: 5%"> - <p>Zoom 5% <span id="status4"></span>: <span id="sizes4"></span></p> <img id="oval5" src="resources/oval.png" style="zoom: 30%"> - <p>Zoom 30% <span id="status5"></span>: <span id="sizes5"></span></p> <img id="oval6" src="resources/oval.png" style="zoom: 33%"> - <p>Zoom 33% <span id="status6"></span>: <span id="sizes6"></span></p> <img id="oval7" src="resources/oval.png" style="zoom: 50%"> - <p>Zoom 50% <span id="status7"></span>: <span id="sizes7"></span></p> <img id="oval8" src="resources/oval.png" style="zoom: 70%"> - <p>Zoom 70% <span id="status8"></span>: <span id="sizes8"></span></p> <img id="oval9" src="resources/oval.png" style="zoom: 100%"> - <p>Zoom 100% <span id="status9"></span>: <span id="sizes9"></span></p> <img id="oval10" src="resources/oval.png" style="zoom: 111%"> - <p>Zoom 111% <span id="status10"></span>: <span id="sizes10"></span></p> <img id="oval11" src="resources/oval.png" style="zoom: 150%"> - <p>Zoom 150% <span id="status11"></span>: <span id="sizes11"></span></p> <img id="oval12" src="resources/oval.png" style="zoom: 333%"> - <p>Zoom 333% <span id="status12"></span>: <span id="sizes12"></span></p> <img id="oval13" src="resources/oval.png" style="zoom: 400%"> - <p>Zoom 400% <span id="status13"></span>: <span id="sizes13"></span></p> <img id="oval14" src="resources/oval.png" style="zoom: 1234%"> - <p>Zoom 1234% <span id="status14"></span>: <span id="sizes14"></span></p> +<script> +const EXPECTED_WIDTH = 37; +const EXPECTED_HEIGHT = 33; +for (i = 0; i < 15; ++i) { + const oval = document.getElementById('oval' + i); + const testDesc = `Zoom ${oval.style.zoom} should not affect width/height of images.`; + const testBody = () => { + assert_equals(oval.width, EXPECTED_WIDTH, oval.getAttribute('style')); + assert_equals(oval.height, EXPECTED_HEIGHT, oval.getAttribute('style')); + }; + if (oval.complete) { + test(testBody, testDesc); + } else { + async_test(t => { + oval.onload = t.step_func_done(testBody); + }, testDesc); + } +} +</script> </body> </html>
diff --git a/third_party/blink/web_tests/navigator_webdriver/navigator_webdriver_enabled.html b/third_party/blink/web_tests/navigator_webdriver/navigator_webdriver_enabled.html index 8240541..6099382 100644 --- a/third_party/blink/web_tests/navigator_webdriver/navigator_webdriver_enabled.html +++ b/third_party/blink/web_tests/navigator_webdriver/navigator_webdriver_enabled.html
@@ -20,9 +20,9 @@ test(function() { - var descriptor = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(navigator), "webdriver"); + var descriptor = Object.getOwnPropertyDescriptor(navigator, "webdriver"); assert_true(descriptor !== undefined); - assert_true(descriptor.configurable); + assert_false(descriptor.configurable); assert_true(descriptor.enumerable); assert_true(descriptor.set === undefined); }, "Test that the navigator.webdriver descriptor has expected properties");
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png new file mode 100644 index 0000000..8bc6a29 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png new file mode 100644 index 0000000..5b5c255 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png new file mode 100644 index 0000000..2a511e4 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-expected.png new file mode 100644 index 0000000..6b9b402a --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png new file mode 100644 index 0000000..1214384 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..14e07c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..a5a61cb1 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-antiAlias-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-antiAlias-expected.png new file mode 100644 index 0000000..ef8933d --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-antiAlias-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png new file mode 100644 index 0000000..d67d3cb --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png new file mode 100644 index 0000000..2b5c0b0 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png new file mode 100644 index 0000000..aa2913ba --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png new file mode 100644 index 0000000..814152a --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-hidpi-blurry-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-hidpi-blurry-expected.png new file mode 100644 index 0000000..e11c4435 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-hidpi-blurry-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png new file mode 100644 index 0000000..bc1f13bb --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-shadow-source-in-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-shadow-source-in-expected.png new file mode 100644 index 0000000..4ed3d43e --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-shadow-source-in-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-text-alignment-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-text-alignment-expected.png new file mode 100644 index 0000000..f192380 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-text-alignment-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png new file mode 100644 index 0000000..2c21971 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png new file mode 100644 index 0000000..f045e31 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png new file mode 100644 index 0000000..5e936ee --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-webp-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-webp-expected.png new file mode 100644 index 0000000..821c4716 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-webp-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-transforms-during-path-expected.png new file mode 100644 index 0000000..a9bb261 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png new file mode 100644 index 0000000..b84e40c640 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/fillrect_gradient-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/fillrect_gradient-expected.png new file mode 100644 index 0000000..e444bd3 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/fillrect_gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/gradient-add-second-start-end-stop-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/gradient-add-second-start-end-stop-expected.png new file mode 100644 index 0000000..c84302f --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/gradient-add-second-start-end-stop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png new file mode 100644 index 0000000..fa80101 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/pixelated-expected.png new file mode 100644 index 0000000..b75d52bc --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/pixelated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png new file mode 100644 index 0000000..e7518d0 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/setWidthResetAfterForcedRender-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/setWidthResetAfterForcedRender-expected.png new file mode 100644 index 0000000..e95fbf51 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/setWidthResetAfterForcedRender-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png new file mode 100644 index 0000000..8bc6a29 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png new file mode 100644 index 0000000..5b5c255 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png new file mode 100644 index 0000000..2a511e4 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-expected.png new file mode 100644 index 0000000..6b9b402a --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png new file mode 100644 index 0000000..1214384 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..14e07c0 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..6368145 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-antiAlias-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-antiAlias-expected.png new file mode 100644 index 0000000..ef8933d --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-antiAlias-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png new file mode 100644 index 0000000..d67d3cb --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-drawImage-video-reset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png new file mode 100644 index 0000000..2b5c0b0 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png new file mode 100644 index 0000000..aa2913ba --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png new file mode 100644 index 0000000..814152a --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-connecting-line-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-hidpi-blurry-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-hidpi-blurry-expected.png new file mode 100644 index 0000000..e11c4435 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-hidpi-blurry-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png new file mode 100644 index 0000000..bc1f13bb --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-shadow-source-in-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-shadow-source-in-expected.png new file mode 100644 index 0000000..4ed3d43e --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-shadow-source-in-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-text-alignment-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-text-alignment-expected.png new file mode 100644 index 0000000..f192380 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-text-alignment-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png new file mode 100644 index 0000000..2c21971 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-text-baseline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png new file mode 100644 index 0000000..f045e31 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toBlob-jpeg-medium-quality-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png new file mode 100644 index 0000000..5e936ee --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-jpeg-maximum-quality-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-webp-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-webp-expected.png new file mode 100644 index 0000000..821c4716 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-toDataURL-webp-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-transforms-during-path-expected.png new file mode 100644 index 0000000..a9bb261 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png new file mode 100644 index 0000000..b84e40c640 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-zero-length-lineCap-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/fillrect_gradient-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/fillrect_gradient-expected.png new file mode 100644 index 0000000..e444bd3 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/fillrect_gradient-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/gradient-add-second-start-end-stop-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/gradient-add-second-start-end-stop-expected.png new file mode 100644 index 0000000..c84302f --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/gradient-add-second-start-end-stop-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png new file mode 100644 index 0000000..fa80101 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/image-object-in-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/pixelated-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/pixelated-expected.png new file mode 100644 index 0000000..b75d52bc --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/pixelated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png new file mode 100644 index 0000000..e7518d0 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/quadraticCurveTo-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/setWidthResetAfterForcedRender-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/setWidthResetAfterForcedRender-expected.png new file mode 100644 index 0000000..e95fbf51 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/setWidthResetAfterForcedRender-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/zoomed-img-size-expected.txt b/third_party/blink/web_tests/virtual/exotic-color-space/images/zoomed-img-size-expected.txt deleted file mode 100644 index 872e920..0000000 --- a/third_party/blink/web_tests/virtual/exotic-color-space/images/zoomed-img-size-expected.txt +++ /dev/null
@@ -1,31 +0,0 @@ -Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this. - -Zoom 1% PASS: 100x100 close enough to 37x33 - -Zoom 2% PASS: 50x50 close enough to 37x33 - -Zoom 3% PASS: 33x33 close enough to 37x33 - -Zoom 4% PASS: 25x25 close enough to 37x33 - -Zoom 5% PASS: 40x40 close enough to 37x33 - -Zoom 30% PASS: 36x33 close enough to 37x33 - -Zoom 33% PASS: 36x33 close enough to 37x33 - -Zoom 50% PASS: 38x34 close enough to 37x33 - -Zoom 70% PASS: 37x32 close enough to 37x33 - -Zoom 100% PASS: 37x33 - -Zoom 111% PASS: 37x33 - -Zoom 150% PASS: 37x33 - -Zoom 333% PASS: 37x33 - -Zoom 400% PASS: 37x33 - -Zoom 1234% PASS: 37x33
diff --git a/third_party/blink/web_tests/virtual/gpu-rasterization/images/zoomed-img-size-expected.txt b/third_party/blink/web_tests/virtual/gpu-rasterization/images/zoomed-img-size-expected.txt deleted file mode 100644 index 872e920..0000000 --- a/third_party/blink/web_tests/virtual/gpu-rasterization/images/zoomed-img-size-expected.txt +++ /dev/null
@@ -1,31 +0,0 @@ -Ideally, all ovals below should be reported as having width=37, height=33. Currently rounding prevents us from doing this. - -Zoom 1% PASS: 100x100 close enough to 37x33 - -Zoom 2% PASS: 50x50 close enough to 37x33 - -Zoom 3% PASS: 33x33 close enough to 37x33 - -Zoom 4% PASS: 25x25 close enough to 37x33 - -Zoom 5% PASS: 40x40 close enough to 37x33 - -Zoom 30% PASS: 36x33 close enough to 37x33 - -Zoom 33% PASS: 36x33 close enough to 37x33 - -Zoom 50% PASS: 38x34 close enough to 37x33 - -Zoom 70% PASS: 37x32 close enough to 37x33 - -Zoom 100% PASS: 37x33 - -Zoom 111% PASS: 37x33 - -Zoom 150% PASS: 37x33 - -Zoom 333% PASS: 37x33 - -Zoom 400% PASS: 37x33 - -Zoom 1234% PASS: 37x33
diff --git a/third_party/blink/web_tests/virtual/oopr-canvas2d/fast/canvas/README.txt b/third_party/blink/web_tests/virtual/oopr-canvas2d/fast/canvas/README.txt new file mode 100644 index 0000000..65f41f5 --- /dev/null +++ b/third_party/blink/web_tests/virtual/oopr-canvas2d/fast/canvas/README.txt
@@ -0,0 +1,3 @@ +# This suite runs the tests in LayoutTests/fast/canvas/ with --enable-features=CanvasOopRasterization, +# --enable-accelerated-2d-canvas, --enable-oop-rasterization, and --enable-gpu-rasterization. +# See the virtual_test_suites() method in tools/blinkpy/web_tests/port/base.py. \ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/ar/iframe-oopif.sub.https.html b/third_party/blink/web_tests/wpt_internal/webxr/ar/iframe-oopif.sub.https.html index 28ef51f..1f077212 100644 --- a/third_party/blink/web_tests/wpt_internal/webxr/ar/iframe-oopif.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/webxr/ar/iframe-oopif.sub.https.html
@@ -14,6 +14,8 @@ views: VALID_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, supportedFeatures: ALL_FEATURES, + environmentBlendMode: "alpha-blend", + interactionMode: "screen-space" }; // Arbitrary message for notifying the parent frame
diff --git a/third_party/closure_compiler/externs/automation.js b/third_party/closure_compiler/externs/automation.js index 59099af..95222995 100644 --- a/third_party/closure_compiler/externs/automation.js +++ b/third_party/closure_compiler/externs/automation.js
@@ -39,6 +39,7 @@ DOCUMENT_SELECTION_CHANGED: 'documentSelectionChanged', DOCUMENT_TITLE_CHANGED: 'documentTitleChanged', DROPEFFECT_CHANGED: 'dropeffectChanged', + EDITABLE_TEXT_CHANGED: 'editableTextChanged', ENABLED_CHANGED: 'enabledChanged', END_OF_TEST: 'endOfTest', EXPANDED: 'expanded', @@ -1168,6 +1169,14 @@ chrome.automation.AutomationNode.prototype.description; /** + * Description of the state of the checkbox. Used only when the node is + * checkable. + * @type {(string|undefined)} + * @see https://developer.chrome.com/extensions/automation#type-checkedStateDescription + */ +chrome.automation.AutomationNode.prototype.checkedStateDescription; + +/** * The placeholder for this text field, if any. * @type {(string|undefined)} * @see https://developer.chrome.com/extensions/automation#type-placeholder @@ -1596,6 +1605,13 @@ chrome.automation.AutomationNode.prototype.selectionEndAffinity; /** + * Indicates that the node is marked user-select:none + * @type {(boolean|undefined)} + * @see https://developer.chrome.com/extensions/automation#type-notUserSelectableStyle + */ +chrome.automation.AutomationNode.prototype.notUserSelectableStyle; + +/** * The current value for this range. * @type {(number|undefined)} * @see https://developer.chrome.com/extensions/automation#type-valueForRange
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium index 442fbfc..92e9def3 100644 --- a/third_party/metrics_proto/README.chromium +++ b/third_party/metrics_proto/README.chromium
@@ -1,8 +1,8 @@ Name: Metrics Protos Short Name: metrics_proto URL: This is the canonical public repository -Version: 333731142 -Date: 2020/09/25 UTC +Version: 336717828 +Date: 2020/10/12 UTC License: BSD Security Critical: Yes
diff --git a/third_party/metrics_proto/cast_logs.proto b/third_party/metrics_proto/cast_logs.proto index eef4fab..a914367 100644 --- a/third_party/metrics_proto/cast_logs.proto +++ b/third_party/metrics_proto/cast_logs.proto
@@ -11,7 +11,7 @@ package metrics; // Cast-enabled device specific log data included in ChromeUserMetricsExtension. -// Next tag: 7 +// Next tag: 8 message CastLogsProto { // Cast specific device information. // Next tag: 7 @@ -331,4 +331,8 @@ optional CastDeviceMutableInfo cast_device_mutable_info = 5; optional fixed64 receiver_metrics_id = 6; + + // This ID is only ever recorded for Google-internal users (dogfooders). It + // is never recorded for external users." + optional uint64 ephemeral_id = 7; }
diff --git a/third_party/protobuf/BUILD.gn b/third_party/protobuf/BUILD.gn index 4ebf457..d84df28f 100644 --- a/third_party/protobuf/BUILD.gn +++ b/third_party/protobuf/BUILD.gn
@@ -3,7 +3,12 @@ # found in the LICENSE file. import("//build/config/linux/gtk/gtk.gni") import("//build/config/sanitizers/sanitizers.gni") -import("//third_party/closure_compiler/compile_js.gni") + +# Includes default args like 'enable_js_protobuf'. +import("proto_library.gni") +if (enable_js_protobuf) { + import("//third_party/closure_compiler/compile_js.gni") +} config("protobuf_config") { include_dirs = [ "src" ] @@ -225,10 +230,10 @@ # The protobuf-based SQLite and GPU fuzzers need protobuf_full and are not # included in Chrome. - "//third_party/sqlite:sqlite3_lpm_corpus_gen", "//gpu:gl_lpm_fuzzer_proto", "//gpu:gl_lpm_fuzzer_proto_gen", "//gpu:gl_lpm_shader_to_string_unittest", + "//third_party/sqlite:sqlite3_lpm_corpus_gen", # The protobuf-based Mojo LPM fuzzer needs protobuf_full and is not included # in Chrome. @@ -680,58 +685,60 @@ } # JS protobuf library. -js_library("js_proto") { - sources = [ - "//third_party/google-closure-library/closure/goog/array/array.js", - "//third_party/google-closure-library/closure/goog/asserts/asserts.js", - "//third_party/google-closure-library/closure/goog/base.js", - "//third_party/google-closure-library/closure/goog/crypt/base64.js", - "//third_party/google-closure-library/closure/goog/crypt/crypt.js", - "//third_party/google-closure-library/closure/goog/debug/error.js", - "//third_party/google-closure-library/closure/goog/dom/asserts.js", - "//third_party/google-closure-library/closure/goog/dom/browserfeature.js", - "//third_party/google-closure-library/closure/goog/dom/dom.js", - "//third_party/google-closure-library/closure/goog/dom/htmlelement.js", - "//third_party/google-closure-library/closure/goog/dom/nodetype.js", - "//third_party/google-closure-library/closure/goog/dom/safe.js", - "//third_party/google-closure-library/closure/goog/dom/tagname.js", - "//third_party/google-closure-library/closure/goog/dom/tags.js", - "//third_party/google-closure-library/closure/goog/fs/url.js", - "//third_party/google-closure-library/closure/goog/functions/functions.js", - "//third_party/google-closure-library/closure/goog/goog.js", - "//third_party/google-closure-library/closure/goog/html/safehtml.js", - "//third_party/google-closure-library/closure/goog/html/safescript.js", - "//third_party/google-closure-library/closure/goog/html/safestyle.js", - "//third_party/google-closure-library/closure/goog/html/safestylesheet.js", - "//third_party/google-closure-library/closure/goog/html/safeurl.js", - "//third_party/google-closure-library/closure/goog/html/trustedresourceurl.js", - "//third_party/google-closure-library/closure/goog/html/trustedtypes.js", - "//third_party/google-closure-library/closure/goog/html/uncheckedconversions.js", - "//third_party/google-closure-library/closure/goog/i18n/bidi.js", - "//third_party/google-closure-library/closure/goog/labs/useragent/browser.js", - "//third_party/google-closure-library/closure/goog/labs/useragent/engine.js", - "//third_party/google-closure-library/closure/goog/labs/useragent/platform.js", - "//third_party/google-closure-library/closure/goog/labs/useragent/util.js", - "//third_party/google-closure-library/closure/goog/math/coordinate.js", - "//third_party/google-closure-library/closure/goog/math/math.js", - "//third_party/google-closure-library/closure/goog/math/size.js", - "//third_party/google-closure-library/closure/goog/memoize/memoize.js", - "//third_party/google-closure-library/closure/goog/object/object.js", - "//third_party/google-closure-library/closure/goog/reflect/reflect.js", - "//third_party/google-closure-library/closure/goog/string/const.js", - "//third_party/google-closure-library/closure/goog/string/internal.js", - "//third_party/google-closure-library/closure/goog/string/string.js", - "//third_party/google-closure-library/closure/goog/string/typedstring.js", - "//third_party/google-closure-library/closure/goog/useragent/product.js", - "//third_party/google-closure-library/closure/goog/useragent/useragent.js", - "js/binary/arith.js", - "js/binary/constants.js", - "js/binary/decoder.js", - "js/binary/encoder.js", - "js/binary/reader.js", - "js/binary/utils.js", - "js/binary/writer.js", - "js/map.js", - "js/message.js", - ] +if (enable_js_protobuf) { + js_library("js_proto") { + sources = [ + "//third_party/google-closure-library/closure/goog/array/array.js", + "//third_party/google-closure-library/closure/goog/asserts/asserts.js", + "//third_party/google-closure-library/closure/goog/base.js", + "//third_party/google-closure-library/closure/goog/crypt/base64.js", + "//third_party/google-closure-library/closure/goog/crypt/crypt.js", + "//third_party/google-closure-library/closure/goog/debug/error.js", + "//third_party/google-closure-library/closure/goog/dom/asserts.js", + "//third_party/google-closure-library/closure/goog/dom/browserfeature.js", + "//third_party/google-closure-library/closure/goog/dom/dom.js", + "//third_party/google-closure-library/closure/goog/dom/htmlelement.js", + "//third_party/google-closure-library/closure/goog/dom/nodetype.js", + "//third_party/google-closure-library/closure/goog/dom/safe.js", + "//third_party/google-closure-library/closure/goog/dom/tagname.js", + "//third_party/google-closure-library/closure/goog/dom/tags.js", + "//third_party/google-closure-library/closure/goog/fs/url.js", + "//third_party/google-closure-library/closure/goog/functions/functions.js", + "//third_party/google-closure-library/closure/goog/goog.js", + "//third_party/google-closure-library/closure/goog/html/safehtml.js", + "//third_party/google-closure-library/closure/goog/html/safescript.js", + "//third_party/google-closure-library/closure/goog/html/safestyle.js", + "//third_party/google-closure-library/closure/goog/html/safestylesheet.js", + "//third_party/google-closure-library/closure/goog/html/safeurl.js", + "//third_party/google-closure-library/closure/goog/html/trustedresourceurl.js", + "//third_party/google-closure-library/closure/goog/html/trustedtypes.js", + "//third_party/google-closure-library/closure/goog/html/uncheckedconversions.js", + "//third_party/google-closure-library/closure/goog/i18n/bidi.js", + "//third_party/google-closure-library/closure/goog/labs/useragent/browser.js", + "//third_party/google-closure-library/closure/goog/labs/useragent/engine.js", + "//third_party/google-closure-library/closure/goog/labs/useragent/platform.js", + "//third_party/google-closure-library/closure/goog/labs/useragent/util.js", + "//third_party/google-closure-library/closure/goog/math/coordinate.js", + "//third_party/google-closure-library/closure/goog/math/math.js", + "//third_party/google-closure-library/closure/goog/math/size.js", + "//third_party/google-closure-library/closure/goog/memoize/memoize.js", + "//third_party/google-closure-library/closure/goog/object/object.js", + "//third_party/google-closure-library/closure/goog/reflect/reflect.js", + "//third_party/google-closure-library/closure/goog/string/const.js", + "//third_party/google-closure-library/closure/goog/string/internal.js", + "//third_party/google-closure-library/closure/goog/string/string.js", + "//third_party/google-closure-library/closure/goog/string/typedstring.js", + "//third_party/google-closure-library/closure/goog/useragent/product.js", + "//third_party/google-closure-library/closure/goog/useragent/useragent.js", + "js/binary/arith.js", + "js/binary/constants.js", + "js/binary/decoder.js", + "js/binary/encoder.js", + "js/binary/reader.js", + "js/binary/utils.js", + "js/binary/writer.js", + "js/map.js", + "js/message.js", + ] + } }
diff --git a/third_party/protobuf/proto_library.gni b/third_party/protobuf/proto_library.gni index e166527..98ae69e 100644 --- a/third_party/protobuf/proto_library.gni +++ b/third_party/protobuf/proto_library.gni
@@ -120,7 +120,16 @@ import("//build/config/sanitizers/sanitizers.gni") import("//build/toolchain/kythe.gni") -import("//third_party/closure_compiler/compile_js.gni") + +declare_args() { + # Allows subprojects to omit javascript dependencies (e.g.) closure_compiler + # and google-closure-library. + enable_js_protobuf = true +} + +if (enable_js_protobuf) { + import("//third_party/closure_compiler/compile_js.gni") +} if (host_os == "win") { _host_executable_suffix = ".exe"
diff --git a/third_party/wayland/features.gni b/third_party/wayland/features.gni index 4f72e53..70bb077 100644 --- a/third_party/wayland/features.gni +++ b/third_party/wayland/features.gni
@@ -9,7 +9,7 @@ # Controls whether the build should use the version of Wayland # library shipped with the system or Chromium third_party. use_system_libwayland = - is_desktop_linux && !is_chromecast && !chromeos_is_browser_only && + is_linux && !is_chromecast && !chromeos_is_browser_only && default_toolchain != "//build/toolchain/cros:target" # Path to wayland-scanner. Has effect only when the system libwayland is used.
diff --git a/tools/accessibility/inspect/ax_tree_server.cc b/tools/accessibility/inspect/ax_tree_server.cc index 787d0d75..c355ae2 100644 --- a/tools/accessibility/inspect/ax_tree_server.cc +++ b/tools/accessibility/inspect/ax_tree_server.cc
@@ -59,8 +59,7 @@ AccessibilityTreeFormatter::Create()); // Set filters. - std::vector<AccessibilityTreeFormatter::PropertyFilter> filters = - GetPropertyFilters(filters_path); + std::vector<ui::AXPropertyFilter> filters = GetPropertyFilters(filters_path); if (filters.empty()) { LOG(ERROR) << "Failed to parse filters"; return; @@ -79,15 +78,13 @@ Format(*formatter, *dict, use_json); } -std::vector<AccessibilityTreeFormatter::PropertyFilter> -AXTreeServer::GetPropertyFilters(const base::FilePath& filters_path) { +std::vector<ui::AXPropertyFilter> AXTreeServer::GetPropertyFilters( + const base::FilePath& filters_path) { if (filters_path.empty()) { return { - AccessibilityTreeFormatter::PropertyFilter( - "*", AccessibilityTreeFormatter::PropertyFilter::ALLOW), + ui::AXPropertyFilter("*", ui::AXPropertyFilter::ALLOW), #if defined(OS_MAC) - AccessibilityTreeFormatter::PropertyFilter( - "children", AccessibilityTreeFormatter::PropertyFilter::DENY), + ui::AXPropertyFilter("children", ui::AXPropertyFilter::DENY), #endif }; } @@ -101,23 +98,22 @@ return {}; } - std::vector<AccessibilityTreeFormatter::PropertyFilter> filters; + std::vector<ui::AXPropertyFilter> filters; for (const std::string& line : base::SplitString(raw_filters_text, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { if (base::StartsWith(line, kAllowOptEmptyStr, base::CompareCase::SENSITIVE)) { - filters.emplace_back( - line.substr(strlen(kAllowOptEmptyStr)), - AccessibilityTreeFormatter::PropertyFilter::ALLOW_EMPTY); + filters.emplace_back(line.substr(strlen(kAllowOptEmptyStr)), + ui::AXPropertyFilter::ALLOW_EMPTY); } else if (base::StartsWith(line, kAllowOptStr, base::CompareCase::SENSITIVE)) { filters.emplace_back(line.substr(strlen(kAllowOptStr)), - AccessibilityTreeFormatter::PropertyFilter::ALLOW); + ui::AXPropertyFilter::ALLOW); } else if (base::StartsWith(line, kDenyOptStr, base::CompareCase::SENSITIVE)) { filters.emplace_back(line.substr(strlen(kDenyOptStr)), - AccessibilityTreeFormatter::PropertyFilter::DENY); + ui::AXPropertyFilter::DENY); } else if (!line.empty()) { LOG(ERROR) << "Unrecognized filter instruction at line: " << line; return {};
diff --git a/tools/accessibility/inspect/ax_tree_server.h b/tools/accessibility/inspect/ax_tree_server.h index 38949a63..737607b 100644 --- a/tools/accessibility/inspect/ax_tree_server.h +++ b/tools/accessibility/inspect/ax_tree_server.h
@@ -36,7 +36,7 @@ bool use_json); // Generates property filters. - std::vector<AccessibilityTreeFormatter::PropertyFilter> GetPropertyFilters( + std::vector<ui::AXPropertyFilter> GetPropertyFilters( const base::FilePath& filters_path); // Formats and dumps into console the tree.
diff --git a/tools/gritsettings/OWNERS b/tools/gritsettings/OWNERS index 6a41dd3..840cdd2 100644 --- a/tools/gritsettings/OWNERS +++ b/tools/gritsettings/OWNERS
@@ -1,3 +1,6 @@ file://tools/grit/OWNERS huangs@chromium.org + +# For WebUI related .grd files. +per-file resource_ids.spec=file://ui/webui/PLATFORM_OWNERS
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index feb72b2..a2f239c6 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -168,9 +168,6 @@ "chrome/browser/resources/new_tab_page/new_tab_page_resources.grd": { "includes": [1680], }, - "chrome/browser/resources/print_preview/print_preview_resources_vulcanized.grd": { - "includes": [1700], - }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/print_preview/print_preview_resources.grd": { "META": {"sizes": {"includes": [500],}}, "includes": [1720],
diff --git a/tools/json_schema_compiler/compiler.py b/tools/json_schema_compiler/compiler.py index 1637ec3..216146b 100755 --- a/tools/json_schema_compiler/compiler.py +++ b/tools/json_schema_compiler/compiler.py
@@ -58,9 +58,6 @@ if generator_name == 'cpp': api_def = json_schema.DeleteNodes(api_def, 'nocompile') - # Delete all 'nodefine' nodes. They are only for documentation. - api_def = json_schema.DeleteNodes(api_def, 'nodefine') - api_defs.extend(api_def) api_model = Model(allow_inline_enums=False)
diff --git a/tools/json_schema_compiler/idl_schema.py b/tools/json_schema_compiler/idl_schema.py index 8b39cd6..20da6e7 100755 --- a/tools/json_schema_compiler/idl_schema.py +++ b/tools/json_schema_compiler/idl_schema.py
@@ -163,8 +163,6 @@ result = {'id': self.node.GetName(), 'properties': properties, 'type': 'object'} - if self.node.GetProperty('nodefine'): - result['nodefine'] = True if self.node.GetProperty('nodoc'): result['nodoc'] = True elif self.node.GetProperty('inline_doc'): @@ -191,7 +189,7 @@ properties['deprecated'] = self.node.GetProperty('deprecated') for property_name in ['allowAmbiguousOptionalArguments', - 'nodoc', 'nocompile', 'nodart', 'nodefine']: + 'nodoc', 'nocompile', 'nodart']: if self.node.GetProperty(property_name): properties[property_name] = True @@ -385,8 +383,8 @@ 'description': self.description, 'type': 'string', 'enum': enum} - for property_name in ('cpp_enum_prefix_override', 'inline_doc', - 'noinline_doc', 'nodefine', 'nodoc',): + for property_name in ['cpp_enum_prefix_override', 'inline_doc', + 'noinline_doc', 'nodoc']: if self.node.GetProperty(property_name): result[property_name] = self.node.GetProperty(property_name) if self.node.GetProperty('deprecated'):
diff --git a/tools/json_schema_compiler/idl_schema_test.py b/tools/json_schema_compiler/idl_schema_test.py index efac48d..a905a66 100755 --- a/tools/json_schema_compiler/idl_schema_test.py +++ b/tools/json_schema_compiler/idl_schema_test.py
@@ -127,12 +127,6 @@ self.assertTrue(func is not None) self.assertTrue(func['nocompile']) - def testNoDefine(self): - schema = self.idl_basics - func = getFunction(schema, 'function31') - self.assertTrue(func is not None) - self.assertTrue(func['nodefine']) - def testNoDocOnEnum(self): schema = self.idl_basics enum_with_nodoc = getType(schema, 'EnumTypeWithNoDoc')
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py index ea81973..451ba22 100644 --- a/tools/json_schema_compiler/model.py +++ b/tools/json_schema_compiler/model.py
@@ -356,7 +356,6 @@ self.optional = json.get('optional', False) self.parent = parent self.nocompile = json.get('nocompile') - self.nodefine = json.get('nodefine') options = json.get('options', {}) self.conditions = options.get('conditions', []) self.actions = options.get('actions', [])
diff --git a/tools/json_schema_compiler/test/idl_basics.idl b/tools/json_schema_compiler/test/idl_basics.idl index e28c970..af4d419 100644 --- a/tools/json_schema_compiler/test/idl_basics.idl +++ b/tools/json_schema_compiler/test/idl_basics.idl
@@ -114,8 +114,6 @@ static EnumType[] function28(); static idl_other_namespace.SomeType function29(); static idl_other_namespace.SomeType[] function30(); - - [nodefine] static void function31(long switch); }; interface Events {
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 039436e..ee9230c 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -76,7 +76,7 @@ 'fuchsia-official': 'fuchsia_official_optimize_goma', 'linux-archive-rel': 'release_bot', 'linux-archive-dbg': 'debug_bot', - 'linux-official': 'linux_official_optimize_goma', + 'linux-official': 'official_optimize_goma', 'mac-archive-rel': 'release_bot_mac_strip_minimal_symbols', 'mac-archive-dbg': 'debug_bot', 'mac-official': 'official_optimize_goma', @@ -1573,9 +1573,6 @@ 'chromeos_betty-pi-arc_cfi_thin_lto_official': [ 'chromeos_device', 'betty-pi-arc', 'cfi_full', 'thin_lto', 'official', - # The CrOS ebuild pins concurrent_links to just 1 on LTO builds. - # Experiment with bumping it up on these builders. - 'chromeos_lto_link_jobs', ], 'chromeos_betty-arc-r_include_unwind_tables_official_use_fake_dbus_clients': [ @@ -2139,10 +2136,6 @@ 'libfuzzer', 'asan', 'release_trybot', 'chrome_with_codecs', 'pdf_xfa', 'disable_nacl', 'mojo_fuzzer', ], - 'linux_official_optimize_goma': [ - 'official_optimize_goma', 'linux_official_link_jobs', - ], - 'mac_arm64_release_bot': [ 'release_bot', 'arm64', ], @@ -2597,10 +2590,6 @@ 'mixins': ['chromeos_device', 'kevin',] }, - 'chromeos_lto_link_jobs': { - 'gn_args': 'concurrent_links=2', - }, - 'chromeos_with_codecs': { 'mixins': ['chromeos', 'chromeos_codecs'], }, @@ -2859,14 +2848,6 @@ 'gn_args': 'max_jobs_per_link=32', }, - # Without this, linux-official uses too many concurrent links with the - # available RAM. We want to adjust this number to mitigate possible memory - # issues related to linking. - # See https://bugs.chromium.org/p/chromium/issues/detail?id=1103490 - 'linux_official_link_jobs': { - 'gn_args': 'concurrent_links=6', - }, - 'lsan': { 'gn_args': 'is_lsan=true', },
diff --git a/tools/mb/mb_config_expectations/chrome.json b/tools/mb/mb_config_expectations/chrome.json index 5b6ff42..e2ec3796 100644 --- a/tools/mb/mb_config_expectations/chrome.json +++ b/tools/mb/mb_config_expectations/chrome.json
@@ -15,7 +15,6 @@ "chromeos-betty-pi-arc-cfi-thin-lto-chrome": { "args_file": "//build/args/chromeos/betty-pi-arc.gni", "gn_args": { - "concurrent_links": 2, "is_cfi": true, "is_chrome_branded": true, "is_chromeos_device": true,
diff --git a/tools/mb/mb_config_expectations/chromium.json b/tools/mb/mb_config_expectations/chromium.json index 08e09e2..a63ac94 100644 --- a/tools/mb/mb_config_expectations/chromium.json +++ b/tools/mb/mb_config_expectations/chromium.json
@@ -49,7 +49,6 @@ }, "linux-official": { "gn_args": { - "concurrent_links": 6, "is_official_build": true, "use_goma": true }
diff --git a/tools/mb/mb_config_expectations/tryserver.chrome.json b/tools/mb/mb_config_expectations/tryserver.chrome.json index 164affb..b1ebc35 100644 --- a/tools/mb/mb_config_expectations/tryserver.chrome.json +++ b/tools/mb/mb_config_expectations/tryserver.chrome.json
@@ -27,7 +27,6 @@ "chromeos-betty-pi-arc-cfi-thin-lto-chrome": { "args_file": "//build/args/chromeos/betty-pi-arc.gni", "gn_args": { - "concurrent_links": 2, "is_cfi": true, "is_chrome_branded": true, "is_chromeos_device": true,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 5c989ec..f4722ce4 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -981,6 +981,7 @@ <int value="3" label="Automatically triggered from content area"/> <int value="4" label="Print Preview dialog"/> <int value="5" label="Account Manager migration welcome screen"/> + <int value="6" label="Onboarding"/> </enum> <enum name="AccountManagerTokenLoadStatus"> @@ -23151,7 +23152,8 @@ <int value="182" label="MEDIA_PLAYER_PRIVATE_ON_NEXT_TRACK"/> <int value="183" label="MEDIA_PLAYER_PRIVATE_ON_PREV_TRACK"/> <int value="184" label="MEDIA_PLAYER_PRIVATE_ON_TOGGLE_PLAY_STATE"/> - <int value="185" label="NETWORKING_CONFIG_ON_CAPTIVE_PORTAL_DETECTED"/> + <int value="185" + label="DELETED_NETWORKING_CONFIG_ON_CAPTIVE_PORTAL_DETECTED"/> <int value="186" label="NETWORKING_PRIVATE_ON_DEVICE_STATE_LIST_CHANGED"/> <int value="187" label="NETWORKING_PRIVATE_ON_NETWORK_LIST_CHANGED"/> <int value="188" label="NETWORKING_PRIVATE_ON_NETWORKS_CHANGED"/> @@ -24451,8 +24453,8 @@ <int value="952" label="FILEMANAGERPRIVATE_SEARCHFILESBYHASHES"/> <int value="953" label="DELETED_EASYUNLOCKPRIVATE_SHOWERRORBUBBLE"/> <int value="954" label="DELETED_EXTENSIONVIEWINTERNAL_NAVIGATE"/> - <int value="955" label="NETWORKING_CONFIG_SETNETWORKFILTER"/> - <int value="956" label="NETWORKING_CONFIG_FINISHAUTHENTICATION"/> + <int value="955" label="DELETED_NETWORKING_CONFIG_SETNETWORKFILTER"/> + <int value="956" label="DELETED_NETWORKING_CONFIG_FINISHAUTHENTICATION"/> <int value="957" label="PLATFORMKEYSINTERNAL_SELECTCLIENTCERTIFICATES"/> <int value="958" label="CRYPTOTOKENPRIVATE_CANORIGINASSERTAPPID"/> <int value="959" label="DELETED_EASYUNLOCKPRIVATE_SETAUTOPAIRINGRESULT"/> @@ -25522,7 +25524,7 @@ <int value="103" label="kMDns"/> <int value="104" label="kMusicManagerPrivate"/> <int value="105" label="kNativeMessaging"/> - <int value="106" label="kNetworkingConfig"/> + <int value="106" label="kDeleted_NetworkingConfig"/> <int value="107" label="kNetworkingPrivate"/> <int value="108" label="kDeleted_NotificationProvider"/> <int value="109" label="kNotifications"/> @@ -42016,6 +42018,7 @@ <int value="-1533258008" label="CalculateNativeWinOcclusion:enabled"/> <int value="-1532720464" label="WellKnownChangePassword:enabled"/> <int value="-1532645183" label="ReleaseNotesNotification:enabled"/> + <int value="-1532100164" label="WebViewMeasureScreenCoverage:enabled"/> <int value="-1532035450" label="DragTabsInTabletMode:disabled"/> <int value="-1532014193" label="disable-encryption-migration"/> <int value="-1530711962" label="PrivacyElevatedAndroid:disabled"/> @@ -43839,6 +43842,7 @@ <int value="303252119" label="AutofillExpandedPopupViews:disabled"/> <int value="304588364" label="TextureLayerSkipWaitForActivation:enabled"/> <int value="304901781" label="NewUsbBackend:enabled"/> + <int value="305356014" label="WebViewMeasureScreenCoverage:disabled"/> <int value="306641800" label="AndroidSiteSettingsUIRefresh:disabled"/> <int value="306834044" label="webui-tab-strip"/> <int value="307543404" label="disable-team-drives"/> @@ -76814,6 +76818,20 @@ <int value="2" label="Cross-domain redirect"/> </enum> +<enum name="WebViewOpenWebScreenPortion"> + <int value="0" label="ZeroPercent"/> + <int value="1" label="TenPercent"/> + <int value="2" label="TwentyPercent"/> + <int value="3" label="ThirtyPercent"/> + <int value="4" label="FortyPercent"/> + <int value="5" label="FiftyPercent"/> + <int value="6" label="SixtyPercent"/> + <int value="7" label="SeventyPercent"/> + <int value="8" label="EightyPercent"/> + <int value="9" label="NinetyPercent"/> + <int value="10" label="OneHundredPercent"/> +</enum> + <enum name="WebViewOpenWebVisibility"> <int value="0" label="OpenWebContentVisible"/> <int value="1" label="OpenWebContentNotVisible"/>
diff --git a/tools/metrics/histograms/histograms_xml/android/histograms.xml b/tools/metrics/histograms/histograms_xml/android/histograms.xml index 8294b0d..a4458c8 100644 --- a/tools/metrics/histograms/histograms_xml/android/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/android/histograms.xml
@@ -2684,12 +2684,13 @@ <owner>idries@google.com</owner> <owner>src/android_webview/OWNERS</owner> <summary> - Records the global visibility state of WebView in seconds. The Visible - bucket counts total seconds that any WebView was visible (the view itself - was visible, and was attached to the view hierarchy of a visible window). - The NotVisble bucket counts time since WebView initialization for which no - WebView was considered visible, or no WebView existed. The total of these - two buckets reflects the amount of time covered by metrics collection. + Records the global visibility state of WebView in seconds, updated with + every Metrics upload. The Visible bucket counts total seconds that any + WebView was visible (the view itself was visible, and was attached to the + view hierarchy of a visible window). The NotVisble bucket counts time since + WebView initialization for which no WebView was considered visible, or no + WebView existed. The total of these two buckets reflects the amount of time + covered by metrics collection. </summary> </histogram> @@ -2698,14 +2699,15 @@ <owner>idries@google.com</owner> <owner>src/android_webview/OWNERS</owner> <summary> - Records per-WebView visibility duration in seconds. The Visible bucket - counts the total time in seconds that each WebView was considered visible - (the view itself was visible, and was attached to the view hierarchy of a - visible window). If more than one WebView is considered visible, then each - WebView contributes independently. The NotVisible bucket counts the duration - that each WebView exists but not in a visible state. As with the Visible - bucket, each WebView contributes independently, and thus this bucket is not - incremented when no WebViews exist. + Records per-WebView visibility duration in seconds, updated with every + Metrics upload. The Visible bucket counts the total time in seconds that + each WebView was considered visible (the view itself was visible, and was + attached to the view hierarchy of a visible window). If more than one + WebView is considered visible, then each WebView contributes independently. + The NotVisible bucket counts the duration that each WebView exists but not + in a visible state. As with the Visible bucket, each WebView contributes + independently, and thus this bucket is not incremented when no WebViews + exist. </summary> </histogram> @@ -2739,6 +2741,17 @@ </summary> </histogram> +<histogram name="Android.WebView.WebViewOpenWebVisible.ScreenPortion" + enum="WebViewOpenWebScreenPortion" expires_after="2021-01-01"> + <owner>idries@google.com</owner> + <owner>src/android_webview/OWNERS</owner> + <summary> + Records the number of seconds that WebView is displaying Open Web Content + for each bucket of screen proportion, updated with every Metrics upload. For + the purposes of bucketing this is rounded down. + </summary> +</histogram> + <histogram name="AndroidSearchEngineLogo.Events" enum="AndroidSearchEngineLogoEvents" expires_after="2020-10-14"> <owner>wylieb@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml index b4571ee..d30282f9 100644 --- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml +++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -11930,6 +11930,7 @@ <suffix name="Demo-setup" label=""/> <suffix name="Device-disabled" label=""/> <suffix name="Discover" label=""/> + <suffix name="Edu-coexistence-login" label=""/> <suffix name="Encryption-migration" label=""/> <suffix name="Enroll" label=""/> <suffix name="Error-message" label=""/> @@ -11979,6 +11980,7 @@ <suffix name="Demo-setup.Completed" label=""/> <suffix name="Device-disabled.Canceled" label=""/> <suffix name="Discover.Next" label=""/> + <suffix name="Edu-coexistence-login.Done" label=""/> <suffix name="Eula.AcceptedWithoutStats" label=""/> <suffix name="Eula.AcceptedWithStats" label=""/> <suffix name="Eula.Back" label=""/>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index a4fd83024..0bd7994b78 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,12 +5,12 @@ "remote_path": "perfetto_binaries/trace_processor_shell/win/935a915963e1482109b102c82585d78c12112b31/trace_processor_shell.exe" }, "mac": { - "hash": "f401bbb73573f5ce4747f8226200b560733980c0", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/109c355900d140e616c7ddc66c57e626678133ca/trace_processor_shell" + "hash": "5c6a76e29cb34a936433d215fa3b8445fb589ae0", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/a4b8d27d96b763f6aaccef6610a1f723471f4d5d/trace_processor_shell" }, "linux": { - "hash": "04d376f2376bc6bd96b6a019256f61d92237d05a", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/109c355900d140e616c7ddc66c57e626678133ca/trace_processor_shell" + "hash": "409f72eb54dc820138d8c22966decdbbdf554a2d", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/a4b8d27d96b763f6aaccef6610a1f723471f4d5d/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/accessibility/ax_enum_util.cc b/ui/accessibility/ax_enum_util.cc index ec62cd625..07e402c4 100644 --- a/ui/accessibility/ax_enum_util.cc +++ b/ui/accessibility/ax_enum_util.cc
@@ -760,6 +760,8 @@ return "ariaInvalidValue"; case ax::mojom::StringAttribute::kAutoComplete: return "autoComplete"; + case ax::mojom::StringAttribute::kCheckedStateDescription: + return "checkedStateDescription"; case ax::mojom::StringAttribute::kChildTreeId: return "childTreeId"; case ax::mojom::StringAttribute::kClassName:
diff --git a/ui/accessibility/ax_enums.mojom b/ui/accessibility/ax_enums.mojom index a16d81e..0019dd45 100644 --- a/ui/accessibility/ax_enums.mojom +++ b/ui/accessibility/ax_enums.mojom
@@ -502,6 +502,7 @@ // Only used when invalid_state == invalid_state_other. kAriaInvalidValue, kAutoComplete, + kCheckedStateDescription, kChildTreeId, kClassName, kContainerLiveRelevant,
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc index fd39eaa1..78e9922 100644 --- a/ui/accessibility/ax_event_generator.cc +++ b/ui/accessibility/ax_event_generator.cc
@@ -357,10 +357,24 @@ if (node != tree->root()) AddEvent(node, Event::NAME_CHANGED); + // If it's in a live region, fire live region events. if (node->data().HasStringAttribute( ax::mojom::StringAttribute::kContainerLiveStatus)) { FireLiveRegionEvents(node); } + + // If it's a change to static text, and it's in an editable text region, + // fire an event on the editable root. + if (ui::IsText(node->data().role) && + node->data().HasState(ax::mojom::State::kEditable)) { + AXNode* container = node; + while (container && !container->data().GetBoolAttribute( + ax::mojom::BoolAttribute::kEditableRoot)) { + container = container->parent(); + } + if (container) + AddEvent(container, Event::EDITABLE_TEXT_CHANGED); + } break; case ax::mojom::StringAttribute::kPlaceholder: AddEvent(node, Event::PLACEHOLDER_CHANGED); @@ -1041,6 +1055,8 @@ return "documentTitleChanged"; case AXEventGenerator::Event::DROPEFFECT_CHANGED: return "dropeffectChanged"; + case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED: + return "editableTextChanged"; case AXEventGenerator::Event::ENABLED_CHANGED: return "enabledChanged"; case AXEventGenerator::Event::EXPANDED:
diff --git a/ui/accessibility/ax_event_generator.h b/ui/accessibility/ax_event_generator.h index 34447ba..f36f90b8 100644 --- a/ui/accessibility/ax_event_generator.h +++ b/ui/accessibility/ax_event_generator.h
@@ -46,6 +46,7 @@ DOCUMENT_SELECTION_CHANGED, DOCUMENT_TITLE_CHANGED, DROPEFFECT_CHANGED, + EDITABLE_TEXT_CHANGED, ENABLED_CHANGED, EXPANDED, FOCUS_CHANGED,
diff --git a/ui/accessibility/ax_event_generator_unittest.cc b/ui/accessibility/ax_event_generator_unittest.cc index f6a17b2e..2451869 100644 --- a/ui/accessibility/ax_event_generator_unittest.cc +++ b/ui/accessibility/ax_event_generator_unittest.cc
@@ -2350,4 +2350,37 @@ 1))); } +TEST(AXEventGeneratorTest, EditableTextChanged) { + AXTreeUpdate initial_state; + initial_state.root_id = 1; + initial_state.nodes.resize(3); + initial_state.nodes[0].id = 1; + initial_state.nodes[0].child_ids.push_back(2); + initial_state.nodes[1].id = 2; + initial_state.nodes[1].role = ax::mojom::Role::kTextField; + initial_state.nodes[1].AddState(ax::mojom::State::kEditable); + initial_state.nodes[1].AddBoolAttribute( + ax::mojom::BoolAttribute::kEditableRoot, true); + initial_state.nodes[1].child_ids.push_back(3); + initial_state.nodes[2].id = 3; + initial_state.nodes[2].role = ax::mojom::Role::kStaticText; + initial_state.nodes[2].AddState(ax::mojom::State::kEditable); + initial_state.nodes[2].AddStringAttribute(ax::mojom::StringAttribute::kName, + "Before"); + AXTree tree(initial_state); + + AXEventGenerator event_generator(&tree); + AXTreeUpdate update = initial_state; + update.nodes[2].string_attributes.clear(); + update.nodes[2].AddStringAttribute(ax::mojom::StringAttribute::kName, + "After"); + + ASSERT_TRUE(tree.Unserialize(update)); + EXPECT_THAT( + event_generator, + UnorderedElementsAre( + HasEventAtNode(AXEventGenerator::Event::EDITABLE_TEXT_CHANGED, 2), + HasEventAtNode(AXEventGenerator::Event::NAME_CHANGED, 3))); +} + } // namespace ui
diff --git a/ui/accessibility/ax_node_data.cc b/ui/accessibility/ax_node_data.cc index 0106fd60..e35efcdc 100644 --- a/ui/accessibility/ax_node_data.cc +++ b/ui/accessibility/ax_node_data.cc
@@ -1436,6 +1436,9 @@ case ax::mojom::StringAttribute::kAriaInvalidValue: result += " aria_invalid_value=" + value; break; + case ax::mojom::StringAttribute::kCheckedStateDescription: + result += " checked_state_description=" + value; + break; case ax::mojom::StringAttribute::kAutoComplete: result += " autocomplete=" + value; break;
diff --git a/ui/accessibility/platform/BUILD.gn b/ui/accessibility/platform/BUILD.gn index 8baee77..f30301d 100644 --- a/ui/accessibility/platform/BUILD.gn +++ b/ui/accessibility/platform/BUILD.gn
@@ -59,6 +59,7 @@ "ax_platform_node_test_helper.h", # Used by DumpAccTree testsuite and a11y tools + "inspect/inspect.cc", "inspect/inspect.h", ]
diff --git a/ui/accessibility/platform/inspect/inspect.cc b/ui/accessibility/platform/inspect/inspect.cc new file mode 100644 index 0000000..85b9627c1 --- /dev/null +++ b/ui/accessibility/platform/inspect/inspect.cc
@@ -0,0 +1,23 @@ +// Copyright 2019 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. + +#include "ui/accessibility/platform/inspect/inspect.h" + +namespace ui { + +AXPropertyFilter::AXPropertyFilter(const AXPropertyFilter&) = default; + +AXPropertyFilter::AXPropertyFilter(const std::string& str, Type type) + : match_str(str), type(type) { + size_t index = str.find(';'); + if (index != std::string::npos) { + filter_str = str.substr(0, index); + if (index + 1 < str.length()) { + match_str = str.substr(index + 1, std::string::npos); + } + } + property_str = match_str.substr(0, match_str.find('=')); +} + +} // namespace ui
diff --git a/ui/accessibility/platform/inspect/inspect.h b/ui/accessibility/platform/inspect/inspect.h index 09d0749..4ef9e672 100644 --- a/ui/accessibility/platform/inspect/inspect.h +++ b/ui/accessibility/platform/inspect/inspect.h
@@ -34,6 +34,34 @@ bool empty() const { return types == None && pattern.empty(); } }; +// A single property filter specification. Represents a parsed string of the +// filter_str;match_str format, where `filter_str` has +// :line_num_0,...:line_num_N format, `match_str` has format of +// property_str=value_str, value_str is optional. For example, +// AXSubrole=* or :1,:3;AXDOMClassList. +// +// Longer version: `filter_str` is a comma separated list of the line +// indexes from the output accessible tree, and serves to narrow down the +// property calls to the accessible object placed on those line indexes only; +// `match_str` is used to match properties by property name and value. +// For example, :1,:3;AXDOMClassList=* +// will query a AXDOMClassList attribute on accessible objects placed at 1st +// and 3rd lines in the output accessible tree. +// Also see +// DumpAccessibilityTestBase::ParseHtmlForExtraDirectives() for more +// information. +struct AX_EXPORT AXPropertyFilter { + enum Type { ALLOW, ALLOW_EMPTY, DENY }; + + std::string match_str; + std::string property_str; + std::string filter_str; + Type type; + + AXPropertyFilter(const std::string& str, Type type); + AXPropertyFilter(const AXPropertyFilter&); +}; + } // namespace ui #endif // UI_ACCESSIBILITY_PLATFORM_INSPECT_INSPECT_H_
diff --git a/ui/android/java/src/org/chromium/ui/base/Clipboard.java b/ui/android/java/src/org/chromium/ui/base/Clipboard.java index 3480625e..477418d 100644 --- a/ui/android/java/src/org/chromium/ui/base/Clipboard.java +++ b/ui/android/java/src/org/chromium/ui/base/Clipboard.java
@@ -70,13 +70,12 @@ * Saves the given set of image bytes and provides that URI to a callback for * sharing the image. * - * @param context The context used to trigger the action. * @param imageData The image data to be shared in |fileExtension| format. * @param fileExtension File extension which |imageData| encoded to. * @param callback A provided callback function which will act on the generated URI. */ - void storeImageAndGenerateUri(final Context context, final byte[] imageData, - String fileExtension, Callback<Uri> callback); + void storeImageAndGenerateUri( + final byte[] imageData, String fileExtension, Callback<Uri> callback); /** * Store the last image uri we put in the sytstem clipboard, this is special case for @@ -317,7 +316,7 @@ } mImageFileProvider.storeImageAndGenerateUri( - mContext, imageData, extension, (Uri uri) -> { setImageUri(uri); }); + imageData, extension, (Uri uri) -> { setImageUri(uri); }); } /**
diff --git a/ui/base/dragdrop/os_exchange_data_provider.h b/ui/base/dragdrop/os_exchange_data_provider.h index 1a7186b..ccd29e06 100644 --- a/ui/base/dragdrop/os_exchange_data_provider.h +++ b/ui/base/dragdrop/os_exchange_data_provider.h
@@ -71,7 +71,7 @@ virtual bool HasFile() const = 0; virtual bool HasCustomFormat(const ClipboardFormatType& format) const = 0; -#if defined(USE_X11) || defined(OS_WIN) +#if defined(OS_LINUX) || defined(OS_WIN) virtual void SetFileContents(const base::FilePath& filename, const std::string& file_contents) = 0; #endif
diff --git a/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc b/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc index a372264..4b06044 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc +++ b/ui/base/dragdrop/os_exchange_data_provider_non_backed.cc
@@ -40,12 +40,11 @@ } void OSExchangeDataProviderNonBacked::MarkOriginatedFromRenderer() { - // TODO(dcheng): Currently unneeded because ChromeOS Aura correctly separates - // URL and filename metadata, and does not implement the DownloadURL protocol. + originated_from_renderer_ = true; } bool OSExchangeDataProviderNonBacked::DidOriginateFromRenderer() const { - return false; + return originated_from_renderer_; } void OSExchangeDataProviderNonBacked::SetString(const base::string16& data) { @@ -85,6 +84,15 @@ } bool OSExchangeDataProviderNonBacked::GetString(base::string16* data) const { +#if defined(OS_LINUX) + if (HasFile()) { + // Various Linux file managers both pass a list of file:// URIs and set the + // string representation to the URI. We explicitly don't want to return use + // this representation. + return false; + } +#endif // defined(OS_LINUX) + if ((formats_ & OSExchangeData::STRING) == 0) return false; *data = string_; @@ -160,11 +168,11 @@ return base::Contains(pickle_data_, format); } -#if defined(USE_X11) +#if defined(OS_LINUX) void OSExchangeDataProviderNonBacked::SetFileContents( const base::FilePath& filename, const std::string& file_contents) { - NOTREACHED(); + NOTIMPLEMENTED(); } #endif
diff --git a/ui/base/dragdrop/os_exchange_data_provider_non_backed.h b/ui/base/dragdrop/os_exchange_data_provider_non_backed.h index 0ae453e..ac3b068 100644 --- a/ui/base/dragdrop/os_exchange_data_provider_non_backed.h +++ b/ui/base/dragdrop/os_exchange_data_provider_non_backed.h
@@ -9,6 +9,7 @@ #include "base/component_export.h" #include "base/pickle.h" +#include "build/build_config.h" #include "ui/base/dragdrop/file_info/file_info.h" #include "ui/base/dragdrop/os_exchange_data_provider.h" #include "ui/gfx/geometry/vector2d.h" @@ -58,7 +59,7 @@ bool HasURL(FilenameToURLPolicy policy) const override; bool HasFile() const override; bool HasCustomFormat(const ClipboardFormatType& format) const override; -#if defined(USE_X11) +#if defined(OS_LINUX) void SetFileContents(const base::FilePath& filename, const std::string& file_contents) override; #endif @@ -104,6 +105,8 @@ // For HTML format base::string16 html_; GURL base_url_; + + bool originated_from_renderer_ = false; }; } // namespace ui
diff --git a/ui/base/x/x11_os_exchange_data_provider.cc b/ui/base/x/x11_os_exchange_data_provider.cc index ef6463f..bb64bb3 100644 --- a/ui/base/x/x11_os_exchange_data_provider.cc +++ b/ui/base/x/x11_os_exchange_data_provider.cc
@@ -367,7 +367,6 @@ return !requested_types.empty(); } -#if defined(USE_X11) void XOSExchangeDataProvider::SetFileContents( const base::FilePath& filename, const std::string& file_contents) { @@ -398,7 +397,6 @@ scoped_refptr<base::RefCountedMemory>( base::RefCountedString::TakeString(&file_contents_copy))); } -#endif void XOSExchangeDataProvider::SetHtml(const base::string16& html, const GURL& base_url) {
diff --git a/ui/base/x/x11_os_exchange_data_provider.h b/ui/base/x/x11_os_exchange_data_provider.h index 24c0f42d..d193b958 100644 --- a/ui/base/x/x11_os_exchange_data_provider.h +++ b/ui/base/x/x11_os_exchange_data_provider.h
@@ -82,10 +82,8 @@ bool HasURL(FilenameToURLPolicy policy) const override; bool HasFile() const override; bool HasCustomFormat(const ClipboardFormatType& format) const override; -#if defined(USE_X11) void SetFileContents(const base::FilePath& filename, const std::string& file_contents) override; -#endif void SetHtml(const base::string16& html, const GURL& base_url) override; bool GetHtml(base::string16* html, GURL* base_url) const override;
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb index a9d9394..1e6a2915 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -61,6 +61,7 @@ <translation id="1538729222189715449">Linux ഫയലുകൾ തുറക്കുന്നു...</translation> <translation id="1547964879613821194">കനേഡിയന് ഇംഗ്ലീഷ്</translation> <translation id="1556189134700913550">എല്ലാത്തിലും പ്രയോഗിക്കുക</translation> +<translation id="1561842594491319104">Chrome ഉപകരണങ്ങൾ</translation> <translation id="1572585716423026576">വാൾപേപ്പറായി സജ്ജീകരിക്കുക</translation> <translation id="158809615184981282">ഫാറോസി കീബോർഡ്</translation> <translation id="1589128298353575783"><ph name="NUMBER_OF_PB" /> PB</translation> @@ -190,6 +191,7 @@ <translation id="3064388234319122767">ലിപ്യന്തരണം (zdravo → здраво)</translation> <translation id="3067790092342515856">Windows ഫയലുകൾ</translation> <translation id="3078461028045006476"><ph name="EXTENSION_NAME" /> എന്നതുമായി പങ്കിടുക</translation> +<translation id="3083975830683400843">Chromebit-കൾ</translation> <translation id="3116361045094675131">യുകെ കീബോര്ഡ്</translation> <translation id="3126026824346185272">Ctrl</translation> <translation id="3144126448740580210">പൂർത്തിയായി</translation> @@ -344,6 +346,7 @@ <translation id="4804827417948292437">അവൊക്കാഡോ</translation> <translation id="4823651846660089135">ഉപകരണം വായിക്കാൻ മാത്രമുള്ള മോഡിലാണ്</translation> <translation id="4839847978919684242"><ph name="SELCTED_FILES_COUNT" /> ഇനങ്ങൾ തിരഞ്ഞെടുത്തു</translation> +<translation id="4843566743023903107">Chromebase-കൾ</translation> <translation id="4849981557599196363">ജർമ്മൻ (ബെൽജിയം)</translation> <translation id="4850886885716139402">കാണുക</translation> <translation id="485316830061041779">ജര്മ്മന്</translation> @@ -473,6 +476,7 @@ <translation id="5932901536148835538">Chromebit</translation> <translation id="5949281959820712067">നിങ്ങളുടെ Google ഡ്രൈവിലെ ഫയലുകൾ പരിഷ്ക്കരിക്കാൻ Linux ആപ്പുകൾക്ക് അനുമതി നൽകുക. മാറ്റങ്ങൾ, നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലേക്ക് സമന്വയിപ്പിക്കും.</translation> <translation id="5955954492236143329"><ph name="NUMBER_OF_ITEMS" /> ഇനങ്ങൾ</translation> +<translation id="5957366693331451795">Chromebox-കൾ</translation> <translation id="5982621672636444458">അടുക്കൽ ഓപ്ഷനുകൾ</translation> <translation id="6005282720244019462">ലാറ്റിന് അമേരിക്കന് കീബോര്ഡ്</translation> <translation id="6007237601604674381">നീക്കുന്നത് പരാജയപ്പെട്ടു. <ph name="ERROR_MESSAGE" /></translation> @@ -632,6 +636,7 @@ <ph name="MARKUP_4" />നിങ്ങളുടെ ഡൗൺലോഡുകളുടെ ഫോൾഡറിൽ നിന്നും ഫയലുകൾ ഇല്ലാതാക്കുക<ph name="MARKUP_5" /></translation> <translation id="7794058097940213561">ഉപകരണം ഫോർമാറ്റ് ചെയ്യുക</translation> <translation id="7799329977874311193">HTML പ്രമാണം</translation> +<translation id="7801354353640549019">Chromebook-കൾ</translation> <translation id="7805768142964895445">നില</translation> <translation id="7821462174190887129"><ph name="FILE_COUNT" /> കണ്ടെത്തി. <ph name="LINE_BREAK1" />
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index f0a0b8a..abf59ea 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -61,6 +61,7 @@ <translation id="1538729222189715449">Otvárajú sa súbory Linux…</translation> <translation id="1547964879613821194">Kanadská anglická klávesnica</translation> <translation id="1556189134700913550">Použiť pre všetky položky</translation> +<translation id="1561842594491319104">Zariadenia Chrome</translation> <translation id="1572585716423026576">Nastaviť ako tapetu</translation> <translation id="158809615184981282">Faerská klávesnica</translation> <translation id="1589128298353575783"><ph name="NUMBER_OF_PB" /> PB</translation> @@ -190,6 +191,7 @@ <translation id="3064388234319122767">Prepis (zdravo → здраво)</translation> <translation id="3067790092342515856">Súbory systému Windows</translation> <translation id="3078461028045006476">Zdieľať s rozšírením <ph name="EXTENSION_NAME" /></translation> +<translation id="3083975830683400843">Chromebity</translation> <translation id="3116361045094675131">britská klávesnica</translation> <translation id="3126026824346185272">Ctrl</translation> <translation id="3144126448740580210">OK</translation> @@ -344,6 +346,7 @@ <translation id="4804827417948292437">Avokádo</translation> <translation id="4823651846660089135">Zariadenie je len na čítanie</translation> <translation id="4839847978919684242">Počet vybratých položiek: <ph name="SELCTED_FILES_COUNT" /></translation> +<translation id="4843566743023903107">Zariadenia Chromebase</translation> <translation id="4849981557599196363">Nemecká klávesnica (Belgicko)</translation> <translation id="4850886885716139402">Zobraziť</translation> <translation id="485316830061041779">Nemčina</translation> @@ -473,6 +476,7 @@ <translation id="5932901536148835538">Chromebit</translation> <translation id="5949281959820712067">Udeľte aplikáciám pre systém Linux povolenie meniť súbory na Disku Google. Zmeny sa budú synchronizovať do vašich ďalších zariadení.</translation> <translation id="5955954492236143329">Počet položiek: <ph name="NUMBER_OF_ITEMS" /></translation> +<translation id="5957366693331451795">Chromeboxy</translation> <translation id="5982621672636444458">Usporiadať možnosti</translation> <translation id="6005282720244019462">latinskoamerická klávesnica</translation> <translation id="6007237601604674381">Presun zlyhal. <ph name="ERROR_MESSAGE" /></translation> @@ -632,6 +636,7 @@ <ph name="MARKUP_4" />odstráňte súbory z priečinka Stiahnuté súbory.<ph name="MARKUP_5" /></translation> <translation id="7794058097940213561">Formátovať zariadenie</translation> <translation id="7799329977874311193">Dokument HTML</translation> +<translation id="7801354353640549019">Chromebooky</translation> <translation id="7805768142964895445">Stav</translation> <translation id="7821462174190887129">Počet nájdených: <ph name="FILE_COUNT" />. <ph name="LINE_BREAK1" />
diff --git a/ui/strings/translations/ui_strings_da.xtb b/ui/strings/translations/ui_strings_da.xtb index 4318ead..ce164b8 100644 --- a/ui/strings/translations/ui_strings_da.xtb +++ b/ui/strings/translations/ui_strings_da.xtb
@@ -177,7 +177,7 @@ <translation id="6430678249303439055">Bloker alle notifikationer fra denne app</translation> <translation id="6483402905448010557">{SECONDS,plural, =1{For 1 sekund siden}one{For # sekund siden}other{For # sekunder siden}}</translation> <translation id="6503257047630241175">RTF-indhold</translation> -<translation id="6539092367496845964">Der opstod en fejl. Prøv igen senere.</translation> +<translation id="6539092367496845964">Noget gik galt. Prøv igen senere.</translation> <translation id="654149438358937226">Bloker alle notifikationer</translation> <translation id="6567071839949112727">klik på overordnet element</translation> <translation id="6578407462441924264">Uden navn</translation>
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index 5223512..3736668 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -1025,7 +1025,7 @@ deps += [ "//ui/base/x" ] } - if (use_ozone && is_desktop_linux) { + if (use_ozone && is_linux) { sources += [ "test/test_desktop_screen_ozone.cc", "test/test_desktop_screen_ozone.h",
diff --git a/ui/views/bubble/bubble_dialog_model_host.cc b/ui/views/bubble/bubble_dialog_model_host.cc index 96b20894..56de35c 100644 --- a/ui/views/bubble/bubble_dialog_model_host.cc +++ b/ui/views/bubble/bubble_dialog_model_host.cc
@@ -187,11 +187,11 @@ } gfx::Size BubbleDialogModelHost::CalculatePreferredSize() const { - // TODO(pbos): Move DISTANCE_BUBBLE_PREFERRED_WIDTH and - // DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH into views. 320 and 448 are inlined - // versions of these. - const int width = - (GetModalType() == ui::MODAL_TYPE_NONE ? 320 : 448) - margins().width(); + const int width = LayoutProvider::Get()->GetDistanceMetric( + GetModalType() == ui::MODAL_TYPE_NONE + ? views::DISTANCE_BUBBLE_PREFERRED_WIDTH + : views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH) - + margins().width(); return gfx::Size(width, GetHeightForWidth(width)); }
diff --git a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm index 21c047b..08bdeb1 100644 --- a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm +++ b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
@@ -21,23 +21,6 @@ namespace views { namespace test { -namespace { - -// Provide a resizable Widget by default. Starting in 10.11, OSX doesn't -// correctly restore the window size when coming out of fullscreen if the window -// is not user-sizable. -class ResizableDelegateView : public WidgetDelegateView { - public: - ResizableDelegateView() = default; - - // WidgetDelgate: - bool CanResize() const override { return true; } - - private: - DISALLOW_COPY_AND_ASSIGN(ResizableDelegateView); -}; - -} // namespace class BridgedNativeWidgetUITest : public WidgetTest { public: @@ -52,7 +35,14 @@ CreateParams(Widget::InitParams::TYPE_WINDOW); init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; init_params.bounds = gfx::Rect(100, 100, 300, 200); - init_params.delegate = new ResizableDelegateView; + init_params.delegate = new views::WidgetDelegate; + init_params.delegate->SetOwnedByWidget(true); + + // Provide a resizable Widget by default. Starting in 10.11, OSX doesn't + // correctly restore the window size when coming out of fullscreen if the + // window is not user-sizable. + init_params.delegate->SetCanResize(true); + widget_ = std::make_unique<Widget>(); widget_->Init(std::move(init_params)); }
diff --git a/ui/views/layout/layout_provider.cc b/ui/views/layout/layout_provider.cc index 05dfc346..e8e3cd77 100644 --- a/ui/views/layout/layout_provider.cc +++ b/ui/views/layout/layout_provider.cc
@@ -37,8 +37,7 @@ int LayoutProvider::GetControlHeightForFont(int context, int style, const gfx::FontList& font) { - return std::max(views::style::GetLineHeight(context, style), - font.GetHeight()) + + return std::max(style::GetLineHeight(context, style), font.GetHeight()) + Get()->GetDistanceMetric(DISTANCE_CONTROL_VERTICAL_TEXT_PADDING) * 2; } @@ -74,39 +73,56 @@ int LayoutProvider::GetDistanceMetric(int metric) const { DCHECK_GE(metric, VIEWS_DISTANCE_START); - DCHECK_LT(metric, VIEWS_DISTANCE_MAX); - switch (metric) { - case DistanceMetric::DISTANCE_BUTTON_HORIZONTAL_PADDING: + DCHECK_LT(metric, VIEWS_DISTANCE_END); + + switch (static_cast<DistanceMetric>(metric)) { + case DISTANCE_BUBBLE_PREFERRED_WIDTH: + return kSmallDialogWidth; + case DISTANCE_BUTTON_HORIZONTAL_PADDING: return 16; - case DistanceMetric::DISTANCE_BUTTON_MAX_LINKABLE_WIDTH: - return 0; - case DistanceMetric::DISTANCE_CLOSE_BUTTON_MARGIN: - return 7; - case DistanceMetric::DISTANCE_CONTROL_VERTICAL_TEXT_PADDING: + case DISTANCE_BUTTON_MAX_LINKABLE_WIDTH: + return 112; + case DISTANCE_CLOSE_BUTTON_MARGIN: return 4; - case DistanceMetric::DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH: - return 75; - case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL: - case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT: - case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL: - case DistanceMetric::DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT: - return 13; - case DistanceMetric::DISTANCE_RELATED_BUTTON_HORIZONTAL: + case DISTANCE_CONTROL_VERTICAL_TEXT_PADDING: return 6; - case DistanceMetric::DISTANCE_RELATED_CONTROL_HORIZONTAL: + case DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH: + // Minimum label size plus padding. + return 32 + 2 * GetDistanceMetric(DISTANCE_BUTTON_HORIZONTAL_PADDING); + case DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL: + return 24; + case DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT: + // This is reduced so there is about the same amount of visible + // whitespace, compensating for the text's internal leading. + return GetDistanceMetric(DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_CONTROL) - + 8; + case DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL: + return 16; + case DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT: + // See the comment in DISTANCE_DIALOG_CONTENT_MARGIN_BOTTOM_TEXT above. + return GetDistanceMetric(DISTANCE_DIALOG_CONTENT_MARGIN_TOP_CONTROL) - 8; + case DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH: + return kMediumDialogWidth; + case DISTANCE_RELATED_BUTTON_HORIZONTAL: return 8; - case DistanceMetric::DISTANCE_RELATED_CONTROL_VERTICAL: + case DISTANCE_RELATED_CONTROL_HORIZONTAL: + return 16; + case DISTANCE_RELATED_CONTROL_VERTICAL: return 8; - case DistanceMetric::DISTANCE_RELATED_LABEL_HORIZONTAL: - return 10; - case DistanceMetric::DISTANCE_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT: - return 160; - case DistanceMetric::DISTANCE_TABLE_CELL_HORIZONTAL_MARGIN: - return 10; - case DistanceMetric::DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING: - return 4; - case DistanceMetric::DISTANCE_UNRELATED_CONTROL_VERTICAL: - return 20; + case DISTANCE_RELATED_LABEL_HORIZONTAL: + return 12; + case DISTANCE_DIALOG_SCROLLABLE_AREA_MAX_HEIGHT: + return 192; + case DISTANCE_TABLE_CELL_HORIZONTAL_MARGIN: + return 12; + case DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING: + return 8; + case DISTANCE_UNRELATED_CONTROL_VERTICAL: + return 16; + case VIEWS_DISTANCE_END: + case VIEWS_DISTANCE_MAX: + NOTREACHED(); + return 0; } NOTREACHED(); return 0; @@ -117,6 +133,9 @@ } int LayoutProvider::GetSnappedDialogWidth(int min_width) const { + // TODO(pbos): Move snapping logic from ChromeLayoutProvider and update + // unittests to pass with snapping points (instead of exact preferred width). + // This is an arbitrary value, but it's a good arbitrary value. Some dialogs // have very small widths for their contents views, which causes ugly // title-wrapping where a two-word title is split across multiple lines or @@ -145,7 +164,7 @@ int LayoutProvider::GetCornerRadiusMetric(EmphasisMetric emphasis_metric, const gfx::Size& size) const { switch (emphasis_metric) { - case views::EMPHASIS_NONE: + case EMPHASIS_NONE: return 0; case EMPHASIS_LOW: case EMPHASIS_MEDIUM: @@ -160,15 +179,15 @@ int LayoutProvider::GetShadowElevationMetric( EmphasisMetric emphasis_metric) const { switch (emphasis_metric) { - case views::EMPHASIS_NONE: + case EMPHASIS_NONE: return 0; - case views::EMPHASIS_LOW: + case EMPHASIS_LOW: return 1; - case views::EMPHASIS_MEDIUM: + case EMPHASIS_MEDIUM: return 2; - case views::EMPHASIS_HIGH: + case EMPHASIS_HIGH: return 3; - case views::EMPHASIS_MAXIMUM: + case EMPHASIS_MAXIMUM: return 16; } }
diff --git a/ui/views/layout/layout_provider.h b/ui/views/layout/layout_provider.h index d5412bd0..1fa20d7 100644 --- a/ui/views/layout/layout_provider.h +++ b/ui/views/layout/layout_provider.h
@@ -55,8 +55,11 @@ // two types have not been interchanged. VIEWS_DISTANCE_START = VIEWS_INSETS_MAX, + // Width of a bubble unless the content is too wide to make that + // feasible. + DISTANCE_BUBBLE_PREFERRED_WIDTH = VIEWS_DISTANCE_START, // The default padding to add on each side of a button's label. - DISTANCE_BUTTON_HORIZONTAL_PADDING = VIEWS_DISTANCE_START, + DISTANCE_BUTTON_HORIZONTAL_PADDING, // The maximum width a button can have and still influence the sizes of // other linked buttons. This allows short buttons to have linked widths // without long buttons making things overly wide. @@ -80,6 +83,9 @@ // The distance between the bottom of a dialog's title and the top of the // dialog's content, when the first content element is text. DISTANCE_DIALOG_CONTENT_MARGIN_TOP_TEXT, + // Width of modal dialogs unless the content is too wide to make that + // feasible. + DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH, // The spacing between a pair of related horizontal buttons, used for // dialog layout. DISTANCE_RELATED_BUTTON_HORIZONTAL, @@ -176,6 +182,11 @@ virtual gfx::ShadowValues MakeShadowValues(int elevation, SkColor color) const; + protected: + static constexpr int kSmallDialogWidth = 320; + static constexpr int kMediumDialogWidth = 448; + static constexpr int kLargeDialogWidth = 512; + private: TypographyProvider typography_provider_;
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js index d15f327..9a9fe325 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_config.js +++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -595,10 +595,9 @@ if (this.mojoType_ === mojom.NetworkType.kVPN) { let saveCredentials = false; const vpn = managedProperties.typeProperties.vpn; - const vpnType = vpn.type && vpn.type.value; - if (vpnType === mojom.VpnType.kOpenVPN) { + if (vpn.type === mojom.VpnType.kOpenVPN) { saveCredentials = this.getActiveBoolean_(vpn.openVpn.saveCredentials); - } else if (vpnType === mojom.VpnType.kL2TPIPsec) { + } else if (vpn.type === mojom.VpnType.kL2TPIPsec) { saveCredentials = this.getActiveBoolean_(vpn.ipSec.saveCredentials) || this.getActiveBoolean_(vpn.l2tp.saveCredentials); }
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html b/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html index b5d635d..2a180ce 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_nameservers.html
@@ -83,7 +83,7 @@ <template is="dom-if" if="[[i18nExists('networkGoogleNameserversLearnMoreUrl')]]"> <a href="[[i18n('networkGoogleNameserversLearnMoreUrl')]]" - target="_blank" on-tap="doNothing_"> + target="_blank" on-click="doNothing_"> [[i18n('networkNameserversLearnMore')]] </a> </template>
diff --git a/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html b/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html index 74d26d2..6192508 100644 --- a/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html +++ b/ui/webui/resources/cr_components/chromeos/quick_unlock/pin_keyboard.html
@@ -155,7 +155,7 @@ } </style> - <div id="root" on-tap="onRootTap_"> + <div id="root" on-click="onRootTap_"> <div id="pinInputDiv"> <cr-input id="pinInput" type="password" value="{{value}}" is-input-rtl$="[[isInputRtl_(value)]]" aria-label="[[ariaLabel]]" @@ -169,21 +169,21 @@ <slot select="[problem]"></slot> <div id="rowsContainer"> <div class="row"> - <cr-button class="digit-button" on-tap="onNumberTap_" value="1" + <cr-button class="digit-button" on-click="onNumberTap_" value="1" id="digitButton1" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard1')]]</inner-text> <inner-text class="letter empty" hidden="[[!enableLetters]]">ABC</inner-text> </cr-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="2" + <cr-button class="digit-button" on-click="onNumberTap_" value="2" id="digitButton2" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard2')]]</inner-text> <inner-text class="letter" hidden="[[!enableLetters]]">ABC</inner-text> </cr-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="3" + <cr-button class="digit-button" on-click="onNumberTap_" value="3" id="digitButton3" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard3')]]</inner-text> @@ -192,21 +192,21 @@ </cr-button> </div> <div class="row"> - <cr-button class="digit-button" on-tap="onNumberTap_" value="4" + <cr-button class="digit-button" on-click="onNumberTap_" value="4" id="digitButton4" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard4')]]</inner-text> <inner-text class="letter" hidden="[[!enableLetters]]">GHI</inner-text> </cr-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="5" + <cr-button class="digit-button" on-click="onNumberTap_" value="5" id="digitButton5" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard5')]]</inner-text> <inner-text class="letter" hidden="[[!enableLetters]]">JKL</inner-text> </cr-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="6" + <cr-button class="digit-button" on-click="onNumberTap_" value="6" id="digitButton6" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard6')]]</inner-text> @@ -215,21 +215,21 @@ </cr-button> </div> <div class="row"> - <cr-button class="digit-button" on-tap="onNumberTap_" value="7" + <cr-button class="digit-button" on-click="onNumberTap_" value="7" id="digitButton7" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard7')]]</inner-text> <inner-text class="letter" hidden="[[!enableLetters]]">PQRS</inner-text> </cr-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="8" + <cr-button class="digit-button" on-click="onNumberTap_" value="8" id="digitButton8" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard8')]]</inner-text> <inner-text class="letter" hidden="[[!enableLetters]]">TUV</inner-text> </cr-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="9" + <cr-button class="digit-button" on-click="onNumberTap_" value="9" id="digitButton9" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard9')]]</inner-text> @@ -241,7 +241,7 @@ <cr-icon-button id="backspaceButton" disabled$="[[!hasInput_(value)]]" iron-icon="pin-keyboard:backspace" - on-tap="onBackspaceTap_" + on-click="onBackspaceTap_" on-pointerdown="onBackspacePointerDown_" on-pointerout="clearAndReset_" on-pointerup="onBackspacePointerUp_" @@ -249,7 +249,7 @@ title="[[i18n('pinKeyboardDeleteAccessibleName')]]" custom-tab-index="-1"> </cr-icon-button> - <cr-button class="digit-button" on-tap="onNumberTap_" value="0" + <cr-button class="digit-button" on-click="onNumberTap_" value="0" id="digitButton0" disabled="[[disabled]]" circle-ripple custom-tab-index="-1"> <inner-text class="number">[[i18n('pinKeyboard0')]]</inner-text>
diff --git a/ui/webui/resources/cr_elements/cr_button/cr_button.js b/ui/webui/resources/cr_elements/cr_button/cr_button.js index 90213b0..f31d61c 100644 --- a/ui/webui/resources/cr_elements/cr_button/cr_button.js +++ b/ui/webui/resources/cr_elements/cr_button/cr_button.js
@@ -52,7 +52,6 @@ keydown: 'onKeyDown_', keyup: 'onKeyUp_', pointerdown: 'onPointerDown_', - tap: 'onTap_', }, /** @@ -193,15 +192,6 @@ }, /** - * Need to handle tap events to enable tap events for where they are still - * used with |button.addEventListener('tap', handler)|. - * TODO(crbug.com/812035): Remove function and listener after Chrome OS no - * longer uses tap event at least with addEventListener(). - * @private - */ - onTap_() {}, - - /** * Customize the element's ripple. Overriding the '_createRipple' function * from PaperRippleBehavior. * @return {PaperRippleElement}
diff --git a/weblayer/browser/android/resource_mapper.cc b/weblayer/browser/android/resource_mapper.cc index aeeb6fbb..a49b3a6 100644 --- a/weblayer/browser/android/resource_mapper.cc +++ b/weblayer/browser/android/resource_mapper.cc
@@ -42,6 +42,7 @@ #include "components/resources/android/page_info_resource_id.h" #include "components/resources/android/permissions_resource_id.h" #include "components/resources/android/sms_resource_id.h" +#include "components/resources/android/webxr_resource_id.h" #undef LINK_RESOURCE_ID #undef DECLARE_RESOURCE_ID // Make sure ID list sizes match up.
diff --git a/weblayer/browser/insecure_form_controller_client.cc b/weblayer/browser/insecure_form_controller_client.cc index a3100503..7ba44a0 100644 --- a/weblayer/browser/insecure_form_controller_client.cc +++ b/weblayer/browser/insecure_form_controller_client.cc
@@ -4,6 +4,7 @@ #include "weblayer/browser/insecure_form_controller_client.h" +#include "components/security_interstitials/content/insecure_form_tab_storage.h" #include "components/security_interstitials/content/settings_page_helper.h" #include "content/public/browser/web_contents.h" #include "weblayer/browser/i18n_util.h" @@ -46,9 +47,12 @@ } void InsecureFormControllerClient::Proceed() { - // TODO(crbug.com/1093955): The simple reload logic means the interstitial is - // bypassed with any reload (e.g. F5), ideally this shouldn't be the case. - + // Set the is_proceeding flag on the tab storage so reload doesn't trigger + // another interstitial. + security_interstitials::InsecureFormTabStorage* tab_storage = + security_interstitials::InsecureFormTabStorage::GetOrCreate( + web_contents_); + tab_storage->SetIsProceeding(true); // We don't check for repost on the proceed reload since the interstitial // explains this will submit the form. web_contents_->GetController().Reload(content::ReloadType::NORMAL, false);
diff --git a/weblayer/browser/java/BUILD.gn b/weblayer/browser/java/BUILD.gn index a0101fe..900728c 100644 --- a/weblayer/browser/java/BUILD.gn +++ b/weblayer/browser/java/BUILD.gn
@@ -56,7 +56,11 @@ "//components/resources/android/page_info_resource_id.h", "//components/resources/android/permissions_resource_id.h", "//components/resources/android/sms_resource_id.h", + "//components/resources/android/webxr_resource_id.h", + "$root_gen_dir/device/vr/buildflags/buildflags.h", ] + + deps = [ "//device/vr/buildflags" ] } java_strings_grd("weblayer_strings_grd") {
diff --git a/weblayer/browser/java/ResourceId.template b/weblayer/browser/java/ResourceId.template index ed37006..119965f 100644 --- a/weblayer/browser/java/ResourceId.template +++ b/weblayer/browser/java/ResourceId.template
@@ -15,6 +15,7 @@ #include "components/resources/android/page_info_resource_id.h" #include "components/resources/android/permissions_resource_id.h" #include "components/resources/android/sms_resource_id.h" +#include "components/resources/android/webxr_resource_id.h" }; return resourceList; }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/TranslateCompactInfoBar.java b/weblayer/browser/java/org/chromium/weblayer_private/TranslateCompactInfoBar.java index 9e7ca44..a2d2212e 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/TranslateCompactInfoBar.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/TranslateCompactInfoBar.java
@@ -289,9 +289,9 @@ } @Override - protected void onNativeDestroyed() { + protected void resetNativeInfoBar() { mNativeTranslateInfoBarPtr = 0; - super.onNativeDestroyed(); + super.resetNativeInfoBar(); } private void closeInfobar(boolean explicitly) {
diff --git a/weblayer/public/java/org/chromium/weblayer/MediaSessionService.java b/weblayer/public/java/org/chromium/weblayer/MediaSessionService.java index 700f163..e3cf06e 100644 --- a/weblayer/public/java/org/chromium/weblayer/MediaSessionService.java +++ b/weblayer/public/java/org/chromium/weblayer/MediaSessionService.java
@@ -74,9 +74,11 @@ @Override public int onStartCommand(Intent intent, int flags, int startId) { try { - if (WebLayer.hasWebLayerInitializationStarted()) { - getWebLayer().getImpl().onMediaSessionServiceStarted( - ObjectWrapper.wrap(this), intent); + WebLayer webLayer = getWebLayer(); + if (webLayer == null) { + stopSelf(); + } else { + webLayer.getImpl().onMediaSessionServiceStarted(ObjectWrapper.wrap(this), intent); } } catch (RemoteException e) { throw new RuntimeException(e); @@ -92,9 +94,6 @@ } catch (UnsupportedVersionException e) { throw new RuntimeException(e); } - if (webLayer == null) { - throw new IllegalStateException("WebLayer not initialized"); - } return webLayer; } }